Ich habe eine Aktivität, die einen Adapter und ein Fragment verwendet, das eine Recycler-Listenansicht anzeigt. Wenn der Benutzer auf eine Zeile klickt, zeige ich einen AlertDialog (erstellt als DialogFragment) an, damit sie die Daten eingeben können.Konnte nicht initialisiert werden
Die Rückrufe aus dem AlertDialog werden vom Fragment abgehört und sobald alle Felder im Fragment erfasst sind, wird das abgeschlossene Objekt an die Aktivität zurückgesendet, um es in der Datenbank zu speichern. Hier
ist ein Screenshot ...
Gerade jetzt, nachdem ich einen Namen eingeben und Hit fortsetzen, ich einen Absturz, weil der Hörer aus der DisplayTextEntryAlert Klasse (dh DialogFragment) nicht initialisiert .
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)
In meiner DisplayTextEntryAlert Klasse, stürzt es, wenn mListener.onYesButtonClicked ausgeführt wird.
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);
}
});
Das mListener Objekt wird in der 'onAttach' Methode in der Klasse DisplayTextEntryAlert initialisiert
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");
}
}
Aber wenn das Debuggen, merke ich, dass diese Linie nie ausgeführt wird.
mListener = (DisplayTextEntryAlertListener)context;
Dieser Alertdialog wird von der Fragment-Klasse (AddFriendFragment) erstellt, die von der Aktivität (AddFriendActivity) gestartet wird
DisplayTextEntryAlert displayTextEntryAlertFragment = DisplayTextEntryAlert.newInstance("","Enter the first name");
FragmentManager fragmentManager = ((FragmentActivity) mContext).getSupportFragmentManager();
displayTextEntryAlertFragment.show(fragmentManager, "newFriendFragment"); // give it a name for retrieving
Das 'mContext' hier wird aus dem onCreateView Verfahren in diesem Fragmente erstellt
Frage: Mir fehlt hier eindeutig etwas, sonst wäre der mListener in der onAttach-Methode im DisplayTextEntryAlert cla initialisiert worden ss.
Irgendwelche Hinweise?
Hier ist der vollständige Quellcode für Referenz https://gist.github.com/ArdenDev/229c69f803dce62a1e46acb0e05c7f1a
Sie können versuchen, '' DisplayTextEntryAlert.this' zu getActivity() 'in' onYesButtonClicked' Parameter – KeLiuyue
@KeLiuyue nicht zu ändern, die nicht funktionieren. Das Argument muss ein DialogFragment sein. – ArdenDev