0

我有一个使用适配器和显示回收站列表视图的片段的活动。当用户点击任何行时,我会显示一个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是从从活性(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

+0

你可以试着改变DisplayTextEntryAlert.this'''到getActivity()''中onYesButtonClicked'的参数 – KeLiuyue

+0

@KeLiuyue没有将无法工作。参数需要是DialogFragment。 – ArdenDev

回答

0

所以窍门是使用setFragment。这就是现在的工作

DisplayTextEntryAlert displayTextEntryAlertFragment = DisplayTextEntryAlert.newInstance("","Enter the first name"); 
displayTextEntryAlertFragment.setTargetFragment(this, 0); 
displayTextEntryAlertFragment.show(getActivity().getSupportFragmentManager(), "newFriendFragment"); 
1

完整的源代码,让你的AddFriendActivity实施DisplayTextEntryAlertListener

然后覆盖该功能在AddFriendActivity

@Override 
public void onYesButtonClicked(String text) 
{ 
    // Do anything with your text 
} 

如果您需要ContextListener,使用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; 
} 
+0

我不需要将回调发送到活动。我想在AddFriendFragment本身内部处理这个问题。 – ArdenDev

+0

请看源代码gist链接。我希望在用户输入所有字段后将整个Person对象发送到活动。 – ArdenDev

0

所以,您在这是在23 API版本中添加onAttach(内容上下文)使用问题(Android 6),它从不会在较低的API版本中调用。你应该重写onAttach(Context context)和onAttach(Activity activity)

+0

几周前刚刚开始Android编码。你可以给我一些关于应该在重写中的内容吗? – ArdenDev

+0

@ArdenDev只是你在onAttach(上下文上下文)到onAttach(活动活动) – Valentun

+0

的dublicate代码,如果我这样做,它期望我在AddFriendActivity中实现DisplayTextEntryAlertListener。我想处理AddFriendFragment中的回调。 – ArdenDev

相关问题