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

相關問題