在我的应用程序中,我想将搜索查询从edittext传递到位于子片段之一中的适配器。在子片段中,我要基于我在父片段中的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的值,这就是Nul​​lPointerException发生的原因。因此,您需要保留对子片段的引用,具体取决于附加方式。有2个选项:

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)第二种情况是,如果要使用添加或替换之类的事务来附加子片段,则只需保留对子片段实例的引用,并将其分配给filter变量。它可能看起来像这样:

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


其中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"/>

10-07 19:28
查看更多