在片段微调器中获取空值
Getting null value in fragment spinner
我正在尝试在 Fragment 中使用过滤器并实现对话框片段。
这是我正在使用的class
public class HomeFragment extends Fragment implements
FilterDialogFragment.FilterListener,
PostAdapter2.OnPostSelectedListener{ detail code }
这是基于 class 的对话片段,用于微调器选择选项
public class FilterDialogFragment extends DialogFragment
单击过滤器按钮时调用此方法,该按钮会弹出过滤器微调器选项的对话框
已声明
private FilterDialogFragment mFilterDialog;
在onCreateView
mFilterDialog = new FilterDialogFragment();
调用方法
public void onFilterClicked(){
mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);
}
在此之后,选择微调器选项并单击“应用”后将调用此方法,其中 mFilterListener 为 null,但事实并非如此
public interface FilterListener {
void onFilter(Filters filters);
}
FilterListener mFilterListener;
public void onSearchClicked() {
Log.d("Message", String.valueOf(mFilterListener));
if (mFilterListener != null) {
Log.d("Message", "New 55555");
mFilterListener.onFilter(getFilters());
}
dismiss();
}
请帮我解决这个问题。如果需要更多详细信息,请告诉我
FilterDialogFragement 中的附加方法
public void onAttach(Context context) {
super.onAttach(context);
Log.d("Message", "New 6666666");
Log.d("Message", String.valueOf(mFilterListener));
if (context instanceof FilterListener) {
// Log.d("Message", String.valueOf(mFilterListener));
mFilterListener = (FilterListener) context;
}
}
我假设你没有在 mFilterDialog
中设置监听器,所以这就是为什么它 null
您正在尝试模仿此库实现:Friendly Eats。
但是,您并没有完全复制它,主要是因为您选择使用 HomeFragment
和 implements FilterDialogFragment.FilterListener
来启动 FilterDialogFragment
,而不是图书馆的 MainActivity
。这就是你的空指针的原因。
这是由于 getSupportFragmentManager()
的工作原理。如果你为此查看 Android 的 documentation,你会看到它说
Return the FragmentManager for interacting with fragments associated with this activity. (My Bolding)
当您在 HomeFragment
中调用 mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);
时,您实际上是在调用 HomeFragment
的父级 Activity
来启动新的 FilterDialogFragment
。您可以通过检查 HomeFragment
中的 onAttach(Context context)
是否 context instanceof HomeFragment
来仔细检查这一点。我不认为它会 return true
.
为了解决这个问题,在不改变你对 HomeFragment
的使用的情况下,你可以简单地传递一个 HomeFragment
本身的实例,或者 FilterDialogFragment.FilterListener
的单独实现(我会如果您不需要使用 HomeFragment
除了侦听器之外的任何东西)到您的 FilterDialogFragment
实例,则在创建时或启动它之前更喜欢。
例如,您可以像这样创建 public setter:
private FilterListener mFilterListener;
public void setFilterListener(FilterListener filterListener){
mFilterListener = filterListener;
}
然后在你的 HomeFragment onCreateView()
中,你这样做:
mFilterDialog = new FilterDialogFragment();
//Or preferably, an anonymous/named implementing instance of the interface only.
mFilterDialog.setFilterListener(this);
这样做不会依赖 Android 框架来提供您的字段的初始化,并且不需要您更改您当前使用的 Activity
或 HomeFragment
.
我正在尝试在 Fragment 中使用过滤器并实现对话框片段。 这是我正在使用的class
public class HomeFragment extends Fragment implements FilterDialogFragment.FilterListener, PostAdapter2.OnPostSelectedListener{ detail code }
这是基于 class 的对话片段,用于微调器选择选项
public class FilterDialogFragment extends DialogFragment
单击过滤器按钮时调用此方法,该按钮会弹出过滤器微调器选项的对话框
已声明
private FilterDialogFragment mFilterDialog;
在onCreateView
mFilterDialog = new FilterDialogFragment();
调用方法
public void onFilterClicked(){
mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);
}
在此之后,选择微调器选项并单击“应用”后将调用此方法,其中 mFilterListener 为 null,但事实并非如此
public interface FilterListener {
void onFilter(Filters filters);
}
FilterListener mFilterListener;
public void onSearchClicked() {
Log.d("Message", String.valueOf(mFilterListener));
if (mFilterListener != null) {
Log.d("Message", "New 55555");
mFilterListener.onFilter(getFilters());
}
dismiss();
}
请帮我解决这个问题。如果需要更多详细信息,请告诉我
FilterDialogFragement 中的附加方法
public void onAttach(Context context) {
super.onAttach(context);
Log.d("Message", "New 6666666");
Log.d("Message", String.valueOf(mFilterListener));
if (context instanceof FilterListener) {
// Log.d("Message", String.valueOf(mFilterListener));
mFilterListener = (FilterListener) context;
}
}
我假设你没有在 mFilterDialog
中设置监听器,所以这就是为什么它 null
您正在尝试模仿此库实现:Friendly Eats。
但是,您并没有完全复制它,主要是因为您选择使用 HomeFragment
和 implements FilterDialogFragment.FilterListener
来启动 FilterDialogFragment
,而不是图书馆的 MainActivity
。这就是你的空指针的原因。
这是由于 getSupportFragmentManager()
的工作原理。如果你为此查看 Android 的 documentation,你会看到它说
Return the FragmentManager for interacting with fragments associated with this activity. (My Bolding)
当您在 HomeFragment
中调用 mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);
时,您实际上是在调用 HomeFragment
的父级 Activity
来启动新的 FilterDialogFragment
。您可以通过检查 HomeFragment
中的 onAttach(Context context)
是否 context instanceof HomeFragment
来仔细检查这一点。我不认为它会 return true
.
为了解决这个问题,在不改变你对 HomeFragment
的使用的情况下,你可以简单地传递一个 HomeFragment
本身的实例,或者 FilterDialogFragment.FilterListener
的单独实现(我会如果您不需要使用 HomeFragment
除了侦听器之外的任何东西)到您的 FilterDialogFragment
实例,则在创建时或启动它之前更喜欢。
例如,您可以像这样创建 public setter:
private FilterListener mFilterListener;
public void setFilterListener(FilterListener filterListener){
mFilterListener = filterListener;
}
然后在你的 HomeFragment onCreateView()
中,你这样做:
mFilterDialog = new FilterDialogFragment();
//Or preferably, an anonymous/named implementing instance of the interface only.
mFilterDialog.setFilterListener(this);
这样做不会依赖 Android 框架来提供您的字段的初始化,并且不需要您更改您当前使用的 Activity
或 HomeFragment
.