无法初始化Context

时间:2017-08-12 03:21:26

标签: android android-fragments android-alertdialog android-context

我有一个活动,它使用适配器和显示回收列表视图的片段。当用户点击任何一行时,我会显示一个AlertDialog(创建为DialogFragment),供他们输入数据。

来自AlertDialog的回调由Fragment监听,一旦在Fragment中捕获了所有字段,完成的对象将被发送回活动以将其保存在数据库中。

这是截图...

enter image description here

现在输入名称并点击继续后,我得到了一个崩溃,因为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是从活动启动的Fragment类(AddFriendFragment)创建的(AddFriendActivity)

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方法中初始化。

任何线索?

以下是完整的源代码供参考 https://gist.github.com/ArdenDev/229c69f803dce62a1e46acb0e05c7f1a

0 个答案:

没有答案