无法初始化上下文
我有一个使用适配器和显示回收站列表视图的片段的活动。当用户点击任何行时,我会显示一个AlertDialog(创建为DialogFragment),以供他们输入数据。无法初始化上下文
来自AlertDialog的回调由Fragment监听,并且一旦所有字段在Fragment中被捕获,则完成的对象被发送回活动以将其保存在数据库中。
下面是截图...
现在经过我输入一个名称,然后按下去,我得到一个崩溃,因为从DisplayTextEntryAlert类(即DialogFragment)侦听器未初始化。
java.lang.NullPointerException: Attempt to invoke interface method 'void alerts.DisplayTextEntryAlert$DisplayTextEntryAlertListener.onYesButtonClicked(android.support.v4.app.DialogFragment, java.lang.String)' on a null object reference
at alerts.DisplayTextEntryAlert$1.onClick(DisplayTextEntryAlert.java:97)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161)
在我的DisplayTextEntryAlert类中,当执行mListener.onYesButtonClicked时它崩溃。
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
....
....
....
builder.setPositiveButton(R.string.stgContinue, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mTextEntered = editTextControl.getText().toString();
mListener.onYesButtonClicked(DisplayTextEntryAlert.this, mTextEntered);
}
});
的mListener对象在“onAttach”的方法在DisplayTextEntryAlert类初始化
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof DisplayTextEntryAlertListener) {
mListener = (DisplayTextEntryAlertListener)context;
} else {
Log.d(this.toString(),"trackContext");
Log.d(this.toString(),context.toString());
//throw new RuntimeException(context.toString() + " must implement DisplayTextEntryAlertListener");
}
}
但在调试时,我注意到,这条线永远不会被执行。
mListener = (DisplayTextEntryAlertListener)context;
这AlertDialog是从从活性(AddFriendActivity)推出的片段类(AddFriendFragment)
DisplayTextEntryAlert displayTextEntryAlertFragment = DisplayTextEntryAlert.newInstance("","Enter the first name");
FragmentManager fragmentManager = ((FragmentActivity) mContext).getSupportFragmentManager();
displayTextEntryAlertFragment.show(fragmentManager, "newFriendFragment"); // give it a name for retrieving
在“mContext”创建在这里被从onCreateView方法在该片段
创建@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_newfriend_list, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
mContext = view.getContext();
....
....
....
mNewFriendAdapter = new NewFriendAdapter(mNewFriendFields, this);
recyclerView.setAdapter(mNewFriendAdapter);
}
return view;
}
问题:我很明显在这里丢失了一些东西,mListener会在DisplayTextEntryAlert类的onAttach方法中初始化SS。
任何线索?
这里是参考 https://gist.github.com/ArdenDev/229c69f803dce62a1e46acb0e05c7f1a
所以窍门是使用setFragment。这就是现在的工作
DisplayTextEntryAlert displayTextEntryAlertFragment = DisplayTextEntryAlert.newInstance("","Enter the first name");
displayTextEntryAlertFragment.setTargetFragment(this, 0);
displayTextEntryAlertFragment.show(getActivity().getSupportFragmentManager(), "newFriendFragment");
完整的源代码,让你的AddFriendActivity
实施DisplayTextEntryAlertListener
然后覆盖该功能在AddFriendActivity
@Override
public void onYesButtonClicked(String text)
{
// Do anything with your text
}
如果您需要Context
为Listener
,使用getActivity()
或getContext()
而不是DisplayTextEntryAlert.this
mListener.onYesButtonClicked(getActivity());
一件事,你不必夸大你的看法时检查instance of
。因为我在那里看到你的布局不仅RecyclerView
,而且ToolBar
是,这样的看法是绝对不是RecyclerView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_newfriend_list, container, false);
// Remove the instance of condition
mContext = view.getContext();
....
....
....
mNewFriendAdapter = new NewFriendAdapter(mNewFriendFields, this);
recyclerView.setAdapter(mNewFriendAdapter);
return view;
}
所以,您在这是在23 API版本中添加onAttach(内容上下文)使用问题(Android 6),它从不会在较低的API版本中调用。你应该重写onAttach(Context context)和onAttach(Activity activity)
你可以试着改变DisplayTextEntryAlert.this'''到getActivity()''中onYesButtonClicked'的参数 – KeLiuyue
@KeLiuyue没有将无法工作。参数需要是DialogFragment。 – ArdenDev