0

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 ...

enter image description here

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

+0

Sie können versuchen, '' DisplayTextEntryAlert.this' zu getActivity() 'in' onYesButtonClicked' Parameter – KeLiuyue

+0

@KeLiuyue nicht zu ändern, die nicht funktionieren. Das Argument muss ein DialogFragment sein. – ArdenDev

Antwort

0

Also war der Trick, setFragment zu verwenden. Das funktioniert jetzt

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

Machen Sie Ihre AddFriendActivityDisplayTextEntryAlertListener

Dann diese Funktionalität in AddFriendActivity

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

außer Kraft setzen implementieren Wenn Sie Context für Listener benötigen, verwenden getActivity() oder getContext() anstelle von DisplayTextEntryAlert.this

mListener.onYesButtonClicked(getActivity()); 

Eine weitere Sache, Sie müssen nicht instance of überprüfen, wenn Ihre Ansicht Aufblasen.Weil ich sah, gibt es nicht nur RecyclerView in Ihrem Layout, sondern auch ToolBar, so dass die Aussicht auf jeden Fall nicht 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

Ich brauche den Rückruf nicht an die Aktivität gesendet werden. Ich möchte das im AddFriendFragment selbst behandeln. – ArdenDev

+0

Bitte werfen Sie einen Blick auf den Quellcode gist link. Ich möchte, dass das gesamte Person-Objekt an die Aktivität gesendet wird, sobald der Benutzer alle Felder eingegeben hat. – ArdenDev

0

Also, Ihr Problem, das Sie auf onAttach verwenden (Content Kontext), die in 23 API-Version hinzugefügt wurde (Android 6) und es ruft nie niedrigere API-Versionen an. Sie sollten sowohl onAttach (Kontextkontext) als auch onAttach (Aktivitätsaktivität) überschreiben

+0

Gerade begann Android-Programmierung vor einigen Wochen. Könnten Sie mir einen Zusammenhang geben, was in der Überschreibung sein sollte? – ArdenDev

+0

@ArdenDev nur dupliziere Code, den du in onAttach (Kontext Kontext) zu onAttach (Aktivität Aktivität) – Valentun

+0

wenn ich das tun, erwartet es, dass ich DisplayTextEntryAlertListener in AddFriendActivity implementieren. Ich möchte den Callback innerhalb von AddFriendFragment behandeln. – ArdenDev

Verwandte Themen