我试图在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;
}
}
答案 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