在我的应用程序中,我想将搜索查询从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
的值,这就是NullPointerException发生的原因。因此,您需要保留对子片段的引用,具体取决于附加方式。有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"/>