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

Java Android-将数据从父片段传递到子片段,java,android,android-fragments,Java,Android,Android Fragments,在我的应用程序中,我希望将一个搜索查询从edittext传递到位于其中一个子片段中的适配器。在childfragment中,我想根据我在父片段中的edittext中输入的文本过滤适配器 首先,我尝试从viewpageradapter获取一个片段,然后调用适配器的全局变量(它是公共的),这将导致适配器上出现一个空指针 Edittext searchFilter = new Edittext(getActivity()) final FragmentShows fragment = (Fragmen

在我的应用程序中,我希望将一个搜索查询从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) {}
});
子片段:

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

public interface FragmentFilter {

    void OnTextChangedListener(String searchQuery);

}
有人能解释一下为什么它不起作用,也许能帮助我/推动我朝着正确的方向解决这个问题


我不必只返回输入查询中筛选的适配器的结果。

变量
filter
的值未赋值,这就是发生NullPointerException的原因。因此,您需要保留对子片段的引用,这取决于您附加它的方式。有两种选择:

1) 如果要将子片段直接附加到片段布局(使用xml上的
fragment
标记),则需要恢复实例并按以下方式分配:

FragmentManager fm = getActivity().getFragmentManager();
Fragment childFragment = fm.findFragmentById(R.id.child_fragment);
filter = (FilterFragment) childFragment;
其中
R.id.child\u 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>
Fragment childFragment = new ChildFragment();
FragmentManager fm = getActivity().getFragmentManager();
fm.beginTransaction().replace(R.id.fragment_container, childFragment).commit();
filter = (FilterFragment) childFragment;
<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"/>
其中R.id.fragment_container是您试图附加子片段的视图组。布局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>
Fragment childFragment = new ChildFragment();
FragmentManager fm = getActivity().getFragmentManager();
fm.beginTransaction().replace(R.id.fragment_container, childFragment).commit();
filter = (FilterFragment) childFragment;
<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"/>


对于第二种情况,您没有将
filter
的值设置为
fragment
。@AnubianNoob必须在哪里执行此操作?这取决于您添加子片段的方式。如果它直接位于片段布局(XML上的片段标记)上,则需要使用FragmentManager恢复对子片段的引用。如果要添加带有事务的子片段,只需保留对该片段的引用并将其分配给FragmentFiltervariable@JorgeMendez所以我必须做一些类似于
filter=fragment
?你能给我举个例子说明如何做到这一点吗?