在片段微调器中获取空值

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

    }

在此之后,选择微调器选项并单击“应用”后将调用此方法,其中 mFilterListenernull,但事实并非如此

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

但是,您并没有完全复制它,主要是因为您选择使用 HomeFragmentimplements 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 框架来提供您的字段的初始化,并且不需要您更改您当前使用的 ActivityHomeFragment .