ViewPager中片段之间的通信

时间:2017-06-14 23:02:08

标签: java android android-fragments android-viewpager

我有一个拥有ViewPager的Fragment。 ViewPager内的每个片段都显示一些基于主片段中的SearchBar的数据。主片段还有一个名为getKeyword()的公共方法(返回SearchBar的字符串)。但我不知道如何获取ViewPager片段内部主要片段的引用。

我尝试使用onAttach()方法获取引用,但它返回了mainActivity的引用。

我也尝试使用getChildFragmentManager()来获取主片段,但我不知道主片段的id是什么(主片段实际上是来自另一个ViewPager的片段)。

1 个答案:

答案 0 :(得分:2)

片段之间进行通信的更好方法是使用Callback接口,

  1. 在Fragment上创建包含搜索栏文本
  2. 的界面
  3. 然后在Activity上实现该接口
  4. 在具有搜索文本的片段的onAttach方法上,还创建了接口,您创建了一个接口Callback的实例,并填充它将Activity转换为您的Callback实例
  5. public class MainFragment extends Fragment {

       //all your other stuff
       private MyFragment.Callback myCallback;
    
       public void onAttach(Activity activity) {
           super.onAttach(activity);
           if( activity instanceOf MyFragment.Callback ) {
               myCallback = (MyFragment.Callback) activity;
           } else {
               /*here you manage the case when the activity does not have the interface callback implemented*/
               //Generally with this
               throws new ClassCastException(
                   activity.class.getSimpleName() +
                    " should implement " +
                     MyFragment.class.getSimpleName()
                     );
            }
        }
    
        private void thisMethodIsUsedWhenTheSearchIsExecuted(String searchText) {
            //here you get the string of the search however you need
            myCallback.callWhenSearch(searchText);
        }
    
        public interface Callback {
            void callWhenSearch(String searchText);
        }
    }
    

    以下是管理片段

    的活动的代码
    public class MyActivity extends AppCompatActivity implements MyFragment.Callback {
    // anything you need for the main activity
        public void callWhenSearch(String searchText) {
        //searchText will contain the text of the search executed on MyFragment
        //and here you can execute a method that calls the fragment where you need to see the result of your search for example
    
            instanceOfSecondFragment.visualizeResultsOf(searchText)
    
        }
    }
    

    您可以在此处获得一些官方文档:

    Communicating with Other Fragments

    如果您需要更多帮助,请告诉我们。