在片段微调器中获取空值

时间:2019-12-16 12:51:16

标签: java android fragment

我试图在Fragment中使用过滤器并实现对话框片段。 这是我正在使用的课程

  

公共类HomeFragment扩展Fragment实现   FilterDialogFragment.FilterListener,   PostAdapter2.OnPostSelectedListener {详细代码}

这是基于对话框片段的类,用于微调器选择选项

  

公共类FilterDialogFragment扩展了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;
        }
    }

2 个答案:

答案 0 :(得分:1)

您正在尝试模仿该库的实现:Friendly Eats

但是,您不会批量复制它,主要是因为您选择使用HomeFragment中的implements FilterDialogFragment.FilterListener来启动FilterDialogFragment,而不是库的MainActivity。这是空指针的原因。

这是由于getSupportFragmentManager()的工作方式。如果您查看Android的documentation,您会看到它说

  

返回FragmentManager以与与此活动相关联的片段进行交互。 (我的粗体)

当您在mFilterDialog.show(getSupportFragmentManager(), FilterDialogFragment.TAG);内部调用HomeFragment时,实际上是在调用Activity的父项HomeFragment来启动新的FilterDialogFragment。您可以通过检查onAttach(Context context)HomeFragment中是否为context instanceof HomeFragment来再次检查。我认为它不会返回true

要解决此问题,而无需更改对HomeFragment的使用,您可以简单地传递HomeFragment本身的实例,或者传递FilterDialogFragment.FilterListener的单独实现(如果需要,在创建时或启动之前,您无需使用HomeFragment实例之外的其他任何东西,例如FilterDialogFragment到您的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); 中,执行以下操作:

Activity

这样做不会依赖Android框架来提供字段的初始化,也不需要您更改您当前使用的HomeFragment<%@ page language="java" contentType="text/html"%> <%@ page import="java.text.*,java.util.*" %> <html> <head> <title>Date JSP</title> </head> <% SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/yyyy"); %> <body> <h1>Welcome to Tomcat! Today is <%= sdf.format(new Date())%>`enter code </h1> </body> </html>

答案 1 :(得分:0)

我认为,您没有在mFilterDialog中设置监听器,所以这就是为什么其null