gpt4 book ai didi

java - Android - 将数据从父 fragment 传递到子 fragment

转载 作者:行者123 更新时间:2023-11-29 05:07:01 26 4
gpt4 key购买 nike

在我的应用程序中,我想将搜索查询从 edittext 传递到位于子 fragment 之一中的适配器。在子 fragment 中,我想根据我在位于父 fragment 中的编辑文本中输入的文本过滤适配器。

首先,我尝试从 viewpageradapter 获取一个 fragment ,然后调用适配器的全局变量(它是公共(public)的),这会导致适配器上出现空指针。

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) {}
});

接下来我尝试(不太了解接口(interface))制作一个接口(interface)并让子 fragment 实现这个接口(interface):

父 fragment

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) {}
});

子 fragment :

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

接口(interface):

public interface FragmentFilter {

void OnTextChangedListener(String searchQuery);

}

有人可以解释为什么它不起作用,也许可以帮助我/插入我朝着正确的方向解决这个问题。

我不必只返回根据输入的查询过滤适配器的结果。

最佳答案

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

1) 如果您将子 fragment 直接附加到您的 fragment 布局(使用 xml 上的 fragment 标记),那么您需要恢复实例并以这种方式分配它:

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

R.id.child_fragment 是您在 XML 中为 fragment 设置的 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) 第二种情况是,如果您使用添加或替换等事务附加子 fragment ,那么您只需要保留对子 fragment 实例的引用并将其分配给 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 是您尝试附加子 fragment 的 View 组。您的布局 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"/>

关于java - Android - 将数据从父 fragment 传递到子 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30061765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com