Fragment与Fragment之间的数据交互

来源:互联网 发布:怎么改软件字体大小 编辑:程序博客网 时间:2024/04/29 09:58

一、Fragment与Fragment之间的数据交互
       (1)提出问题:Fragment与Fragment之间在什么样的场景下需要进行数据交互呢?
       (2)图片说明:
        

               场景说明:假设左侧的Fragment有个输入框,有一个按钮,右侧的Fragment有一个输入框,有一个按钮。希望在点击右侧Fragment中的按钮的时候,获取到第一个Fragment当中EditText中的值。

     (3)实现思路

      首先需要考虑的是如何获取右边Fragment的引用?

      我们可以考虑使用FragmentManager。因为所有的Fragment在Activity当中都是由同一个FragmentManager来进行管理,在左侧的Fragment获取到FragmentManager对象的引用之后,接下来即可通过FragmentManager对象找到它所管理的所有的Fragment对象,因此也就可以操作其中任意的一个Fragment对象。
     
     (4)实例代码:    

     

       

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.fragment;  
  2.    
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.support.v4.app.FragmentManager;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12. import com.example.android_fragment_trans.R;  
  13.    
  14. /** 
  15.  * 文件名: com.example.fragment.LeftFragment 
  16.  * 作者:  熊杰 
  17.  * 日期: 13-12-13 
  18.  * 时间: 06:11 
  19.  * 开发工具: IntelliJ IDEA 12.0.4 
  20.  * 开发语言: Java,Android 
  21.  * 开发框架: 
  22.  * 版本: v0.1 
  23.  * <strong>每当写一个Fragment的时候,需要有意识的写上这三个方法</strong> 
  24.  * <p></p> 
  25.  */  
  26.    
  27. public class LeftFragment extends Fragment{  
  28.     private Button btLeft;  
  29.     private FragmentManager fragmentManager;  
  30.     private  RightFragment rightFragment;  
  31.     private EditText etRight;  
  32.     /** 
  33.      * 这个方法实例化变量 
  34.      * @param savedInstanceState 
  35.      */  
  36.     @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         fragmentManager = getFragmentManager();  
  40.     }  
  41.    
  42.     /** 
  43.      * 这个方法用于加载View 
  44.      * @param inflater 
  45.      * @param container 
  46.      * @param savedInstanceState 
  47.      * @return 
  48.      * 点击左边Fragment的Button要获取右边Fragment文本输入框中的值 
  49.      * 首先需要考虑的是如何获取右边Fragment的引用。 
  50.      * 有一个思路,所有的Fragment在Activity当中都是由同一个FragmentManager来进行管理。 
  51.      * 那么在左边的Fragment中是否可以得到FragmentManager对象呢? 
  52.      * 
  53.      * 另外补充说明,如果Fragment再嵌套Fragment,一个Fragment里面还有几个孩子,那么这几个孩子是平等的。那么 
  54.      * getChildFragmentManager()获取到的就是当前的这个Fragment,不再是Activity 
  55.      */  
  56.     @Override  
  57.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  58.         View view = inflater.inflate(R.layout.left_fragment,null);  
  59.         btLeft = (Button) view.findViewById(R.id.bt_left);  
  60.         btLeft.setOnClickListener(onClickListener);  
  61.         return view;  
  62.     }  
  63.    
  64.     /** 
  65.      * 表示移开Fragment的时候,将数据提交 
  66.      */  
  67.     @Override  
  68.     public void onPause() {  
  69.         super.onPause();  
  70.     }  
  71.    
  72.    
  73.     /** 
  74.      * 点击左侧Fragment按钮时,可以通过FragemntManager()管理类,让它去findFragmentByTag(),去找到任意的Fragment。 
  75.      * 如果可以通过findFragmentByTag()方法找到Fragment,则可保证该Fragment与同一级的所有Fragment进行交互。 
  76.      */  
  77.     private View.OnClickListener onClickListener = new View.OnClickListener() {  
  78.         @Override  
  79.         public void onClick(View view) {  
  80.            rightFragment = (RightFragment) fragmentManager.findFragmentByTag("right");  
  81.             etRight = (EditText) rightFragment.getView().findViewById(R.id.et_right);  
  82.             String etRightValue = etRight.getText().toString();  
  83.             Toast.makeText(getActivity(),"right====>>" + etRightValue,Toast.LENGTH_LONG).show();  
  84.         }  
  85.    
  86.     };  
  87. }  


[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.fragment;  
  2. import android.os.Bundle;  
  3. import android.support.v4.app.Fragment;  
  4. import android.support.v4.app.FragmentManager;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11. import com.example.android_fragment_trans.R;  
  12. /** 
  13.  * 文件名: com.example.fragment.RightFragment 
  14.  * 作者:  熊杰 
  15.  * 日期: 13-12-13 
  16.  * 时间: 06:13 
  17.  * 开发工具: IntelliJ IDEA 12.0.4 
  18.  * 开发语言: Java,Android 
  19.  * 开发框架: 
  20.  * 版本: v0.1 
  21.  * <strong>说明</strong> 
  22.  * <p></p> 
  23.  */  
  24. public class RightFragment extends Fragment {  
  25.     private Button btRight;  
  26.     private FragmentManager fragmentManager;  
  27.     private  LeftFragment leftFragment;  
  28.     private EditText etLeft;  
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         fragmentManager = getFragmentManager();  
  33.     }  
  34.     @Override  
  35.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  36.         View view = inflater.inflate(R.layout.right_fragment,null);  
  37.         btRight = (Button) view.findViewById(R.id.bt_right);  
  38.         btRight.setOnClickListener(onClickListener);  
  39.         return view;  
  40.     }  
  41.     @Override  
  42.     public void onPause() {  
  43.         super.onPause();  
  44.     }  
  45.     private View.OnClickListener onClickListener = new View.OnClickListener() {  
  46.         @Override  
  47.         public void onClick(View view) {  
  48.             leftFragment = (LeftFragment) fragmentManager.findFragmentByTag("left");  
  49.             etLeft = (EditText) leftFragment.getView().findViewById(R.id.et_left);  
  50.             String etRightValue = etLeft.getText().toString();  
  51.             Toast.makeText(getActivity(), "left====>>" + etRightValue, Toast.LENGTH_LONG).show();  
  52.         }  
  53.     };  
  54. }  

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.android_fragment_trans;  
  2. import android.os.Bundle;  
  3. import android.support.v4.app.FragmentActivity;  
  4. import android.support.v4.app.FragmentManager;  
  5. import android.support.v4.app.FragmentTransaction;  
  6. import com.example.fragment.LeftFragment;  
  7. import com.example.fragment.RightFragment;  
  8. public class MyActivity extends FragmentActivity {  
  9.     private FragmentManager fragmentManager;  
  10.     private FragmentTransaction fragmentTransaction;  
  11.     /** 
  12.      * 在Activity初始化的时候,将Fragment添加到Activity当中 
  13.      * @param savedInstanceState 
  14.      */  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.         fragmentManager = getSupportFragmentManager();  
  20.         fragmentTransaction = fragmentManager.beginTransaction();  
  21.         LeftFragment leftFragment = new LeftFragment();  
  22.         RightFragment rightFragment = new RightFragment();  
  23.         /** 
  24.          *         fragmentTransaction.add() 
  25.          *         fragmentTransaction.replace() 
  26.          *         这两个方法有什么区别呢? 
  27.          *         add()方法是将Fragment加到Activity当中。 
  28.          *         replace()方法表示将之前的Fragment从Activity当中移除掉 
  29.          */  
  30.         fragmentTransaction.add(R.id.left,leftFragment,"left");  
  31.         fragmentTransaction.add(R.id.right,rightFragment,"right");  
  32.         fragmentTransaction.commit();  
  33.     }  
  34. }  

 

二、话题引深

       Fragment再嵌套Fragment,如何在Fragment中与嵌套Fragment进行数据交互呢?


       

         也就是说左侧的Fragment要与右侧Fragment中的Fragment进行数据交互如何实现?

    实现思路:

 

        首先需要通过FragmentManager管理类找到右侧的Fragment,然后通过右侧的FramentChildFragmentManager()管理类再找到里面的Fragment
0 0
原创粉丝点击