Android(Fragment和Activity之间通信)

时间:2022-06-04 21:14:41

Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现。

一、Activity->Fragment传递数据

1.main.xml:
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:id="@+id/rl_fragment"
  5. android:orientation="vertical"
  6. android:layout_height="match_parent" >
  7. <EditText
  8. android:id="@+id/et_input"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content" />
  11. <Button
  12. android:id="@+id/btn_send"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="发送" />
  16. </LinearLayout>

2.fragment.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:id="@+id/tv_fragment"
  8. android:layout_height="wrap_content"
  9. android:layout_width="wrap_content"
  10. />
  11. </LinearLayout>

3.MainActivity.java:

  1. package com.example.fragementcommunication;
  2. import android.app.Activity;
  3. import android.app.FragmentManager;
  4. import android.app.FragmentTransaction;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.Window;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11. import android.widget.Toast;
  12. public class MainActivity extends Activity {
  13. private EditText mMainActivityET;
  14. private Button mSendButton;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. requestWindowFeature(Window.FEATURE_NO_TITLE);
  19. setContentView(R.layout.activity_main);
  20. mMainActivityET = (EditText) findViewById(R.id.et_input);
  21. mSendButton = (Button) findViewById(R.id.btn_send);
  22. mSendButton.setOnClickListener(new OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. String text = mMainActivityET.getText().toString();
  26. MyFragment myFragment = new MyFragment();
  27. Bundle bundle = new Bundle();
  28. bundle.putString("input", text);
  29. myFragment.setArguments(bundle);// 传递string
  30. FragmentManager manager = getFragmentManager();
  31. FragmentTransaction transaction = manager.beginTransaction();
  32. transaction.add(R.id.rl_fragment, myFragment, "myfragment");
  33. transaction.commit();
  34. Toast.makeText(MainActivity.this, "向Fragment发送数据" + text, Toast.LENGTH_SHORT).show();
  35. }
  36. });
  37. }
  38. }

4.MyFragment.java:

  1. package com.example.fragementcommunication;
  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.TextView;
  8. import android.widget.Toast;
  9. public class MyFragment extends Fragment {
  10. @Override
  11. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  12. View view = inflater.inflate(R.layout.fragmet, null);
  13. TextView mFragmentTextView = (TextView) view.findViewById(R.id.tv_fragment);
  14. String string = getArguments().getString("input");// 获取数据;
  15. mFragmentTextView.setText(string);
  16. Toast.makeText(getActivity(), "成功获取数据" + string, Toast.LENGTH_SHORT).show();
  17. return view;
  18. }
  19. }

总结:发送数据方法->setArguments(bundle)

            接收数据方法->getArguments()
 
下面我们看一下效果:
Android(Fragment和Activity之间通信)
 
 

二、Fragment向Activity传值(接口回调的方式)

布局文件和上面一样,我们看一下java代码的改变:
1.MainActivity.java:
 
  1. package com.example.fragementcommunication;
  2. import com.example.fragementcommunication.MyFragment.MyListener;
  3. import android.app.Activity;
  4. import android.app.FragmentManager;
  5. import android.app.FragmentTransaction;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.Window;
  10. import android.widget.Button;
  11. import android.widget.EditText;
  12. import android.widget.Toast;
  13. public class MainActivity extends Activity implements MyListener{
  14. private EditText mMainActivityET;
  15. private Button mSendButton;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. requestWindowFeature(Window.FEATURE_NO_TITLE);
  20. setContentView(R.layout.activity_main);
  21. mMainActivityET = (EditText) findViewById(R.id.et_input);
  22. mSendButton = (Button) findViewById(R.id.btn_send);
  23. mSendButton.setOnClickListener(new OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. String text = mMainActivityET.getText().toString();
  27. MyFragment myFragment = new MyFragment();
  28. Bundle bundle = new Bundle();
  29. bundle.putString("input", text);
  30. myFragment.setArguments(bundle);// 传递string
  31. FragmentManager manager = getFragmentManager();
  32. FragmentTransaction transaction = manager.beginTransaction();
  33. transaction.add(R.id.rl_fragment, myFragment, "myfragment");
  34. transaction.commit();
  35. Toast.makeText(MainActivity.this, "向Fragment发送数据" + text, Toast.LENGTH_SHORT).show();
  36. }
  37. });
  38. }
  39. @Override
  40. public void callback(String back) {
  41. Toast.makeText(MainActivity.this, "获取到从Fragment中传来的数据" + back, Toast.LENGTH_SHORT).show();
  42. }
  43. }

2.MyFragment.java:

  1. package com.example.fragementcommunication;
  2. import android.app.Activity;
  3. import android.app.Fragment;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.TextView;
  9. import android.widget.Toast;
  10. public class MyFragment extends Fragment {
  11. public MyListener listener;
  12. private String back="已经接收到数据!谢谢";
  13. /**
  14. * 通过接口回调的方式从Fragment向activity传值;
  15. * @author Administrator
  16. *
  17. */
  18. public interface MyListener{
  19. public void callback(String back);
  20. }
  21. @Override
  22. public void onAttach(Activity activity) {
  23. super.onAttach(activity);
  24. listener=(MyListener) activity;
  25. }
  26. @Override
  27. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  28. View view = inflater.inflate(R.layout.fragmet, null);
  29. TextView mFragmentTextView = (TextView) view.findViewById(R.id.tv_fragment);
  30. String string = getArguments().getString("input");// 获取数据;
  31. mFragmentTextView.setText(string);
  32. Toast.makeText(getActivity(), "成功获取数据" + string, Toast.LENGTH_SHORT).show();
  33. Toast.makeText(getActivity(), "向Activity传递数据" + back, Toast.LENGTH_SHORT).show();
  34. listener.callback(back);
  35. return view;
  36. }
  37. }

运行如下:

 
Android(Fragment和Activity之间通信)
这时我们可以看到先是MainActivity向Fragment传递了123,然后Fragment向Activity传递了”已经接收到数据!谢谢“。
 
 
转自:http://blog.csdn.net/yayun0516/article/details/48210953