Android实战简易教程<五十二>(Fragment和Activity之间通信)

来源:互联网 发布:易语言ce源码 编辑:程序博客网 时间:2024/05/29 14:01

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

一、Activity->Fragment传递数据

1.main.xml:
[html] view plaincopy
  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.   
  8.     <EditText  
  9.         android:id="@+id/et_input"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content" />  
  12.   
  13.     <Button  
  14.         android:id="@+id/btn_send"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:text="发送" />  
  18.   
  19. </LinearLayout>  

2.fragment.xml:
[html] view plaincopy
  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.   
  12. </LinearLayout>  

3.MainActivity.java:
[java] view plaincopy
  1. package com.example.fragementcommunication;  
  2.   
  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.   
  14. public class MainActivity extends Activity {  
  15.     private EditText mMainActivityET;  
  16.     private Button mSendButton;  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  22.         setContentView(R.layout.activity_main);  
  23.         mMainActivityET = (EditText) findViewById(R.id.et_input);  
  24.         mSendButton = (Button) findViewById(R.id.btn_send);  
  25.         mSendButton.setOnClickListener(new OnClickListener() {  
  26.   
  27.             @Override  
  28.             public void onClick(View v) {  
  29.                 String text = mMainActivityET.getText().toString();  
  30.                 MyFragment myFragment = new MyFragment();  
  31.                 Bundle bundle = new Bundle();  
  32.                 bundle.putString("input", text);  
  33.                 myFragment.setArguments(bundle);// 传递string  
  34.                 FragmentManager manager = getFragmentManager();  
  35.                 FragmentTransaction transaction = manager.beginTransaction();  
  36.                 transaction.add(R.id.rl_fragment, myFragment, "myfragment");  
  37.                 transaction.commit();  
  38.                 Toast.makeText(MainActivity.this"向Fragment发送数据" + text, Toast.LENGTH_SHORT).show();  
  39.   
  40.             }  
  41.         });  
  42.     }  
  43. }  

4.MyFragment.java:
[java] view plaincopy
  1. package com.example.fragementcommunication;  
  2.   
  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.   
  11. public class MyFragment extends Fragment {  
  12.     @Override  
  13.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  14.         View view = inflater.inflate(R.layout.fragmet, null);  
  15.         TextView mFragmentTextView = (TextView) view.findViewById(R.id.tv_fragment);  
  16.         String string = getArguments().getString("input");// 获取数据;  
  17.         mFragmentTextView.setText(string);  
  18.         Toast.makeText(getActivity(), "成功获取数据" + string, Toast.LENGTH_SHORT).show();  
  19.         return view;  
  20.     }  
  21.   
  22. }  

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

下面我们看一下效果:



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

布局文件和上面一样,我们看一下java代码的改变:
1.MainActivity.java:

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

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

运行如下:


这时我们可以看到先是MainActivity向Fragment传递了123,然后Fragment向Activity传递了”已经接收到数据!谢谢“。
0 0
原创粉丝点击