Android - 将数据从父片段传递到子片段

时间:2015-05-05 19:36:40

标签: java android android-fragments

在我的应用程序中,我想将一个搜索查询从edittext传递到我的适配器,该适配器位于其中一个子片段中。在childfragment中,我想根据我在edittext中输入的文本过滤适配器,该文本位于父片段中。

首先,我尝试从viewpageradapter获取一个片段,然后调用适配器的全局变量(这是公共的),这会在适配器上产生一个空指针。

Edittext searchFilter = new Edittext(getActivity())
final FragmentShows fragment = (FragmentShows) adapter.getItem(1);
searchFilter.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if(fragment != null) {
--> NULL POINTER  fragment.adapter.getFilter().filter(charSequence.toString());
        }}

    @Override
    public void afterTextChanged(Editable editable) {}
});

接下来我尝试(不要真正理解接口)来创建一个接口并让子片段实现这个接口:

父片段

private Fragmentfilter filter
...
Edittext searchFilter = new Edittext(getActivity())
final FragmentShows fragment = (FragmentShows) adapter.getItem(1);
searchFilter.addTextChangedListener(new TextWatcher() {
     @Override
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

     @Override
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    --> NULL POINTER HERE filter.OnTextChangedListener(charSequence.toString());
     }

     @Override
     public void afterTextChanged(Editable editable) {}
});

Childfragment:

public class FragmentShows extends Fragment implements FragmentFilter{
    ...
    @Override
    public void OnTextChangedListener(String searchQuery) {
        adapter.getFilter().filter(searchQuery);
    }
}

接口:

public interface FragmentFilter {

    void OnTextChangedListener(String searchQuery);

}

有人可以解释为什么它不起作用,也许可以帮助我/推动我如何解决这个问题。

我不必仅在输入的查询上过滤适配器的结果。

1 个答案:

答案 0 :(得分:3)

未分配变量filter的值,这就是发生NullPointerException的原因。因此,您需要根据您的附加方式保留对子片段的引用。有两个选项:

1)如果您将子片段直接附加到片段布局(xml上带有fragment标记),则需要恢复该实例并以这种方式分配:

FragmentManager fm = getActivity().getFragmentManager();
Fragment childFragment = fm.findFragmentById(R.id.child_fragment);
filter = (FilterFragment) childFragment;

其中R.id.child_fragment是您在XML上设置为片段的ID,XML可能如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/fragment_container"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

    <fragment
        class="com.path.to.your.fragment.ChildFragment"
        android:id="@+id/child_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

2)第二种情况是,如果您使用添加或替换等事务附加子片段,那么您只需要保留对子片段实例的引用并将其分配给{{ 1}}变量。它可能看起来像这样:

filter

R.id.fragment_container,是您尝试附加子片段的视图组。您的布局XML可能如下所示:

Fragment childFragment = new ChildFragment();
FragmentManager fm = getActivity().getFragmentManager();
fm.beginTransaction().replace(R.id.fragment_container, childFragment).commit();
filter = (FilterFragment) childFragment;