2016-07-27 12 views
0

Ich weiß, dass dies eine ziemlich häufige Frage ist, jedoch habe ich einige ähnliche Beiträge durchgesehen, bin mehreren Leitfäden gefolgt und kann das immer noch nicht zum Laufen bringen.Aktivität, die keinen Rückruf von der DialogFragment-Schnittstelle empfängt

Nachstehend ist mein Code für die Haupttätigkeit:

NavigationView mDrawerList = (NavigationView) findViewById(R.id.main_navigation); 

    Menu navMenu = mDrawerList.getMenu(); 
    topChannelMenu = navMenu.addSubMenu("Stuff"); 
    final Button addButton = (Button) findViewById(R.id.add_button); 
    addButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MyDialog addDialog = new MyDialog(); 
      addDialog.show(getSupportFragmentManager(), "AddDialog"); 
      addDialog.setDialogResult(new AddDialog.MyDialogListener() { 
       @Override 
       public void onDialogPositiveClick(MyObject objectToSend) { 
        topChannelMenu.add(objectToSend.toString()); //Not getting called 
        Log.d(TAG, "Item added"); 
       } 
      }); 


     } 
    }); 

Wie Sie sehen können, eine Taste gedrückt wird (in der Navigationsleiste befindet), die einen Dialog eröffnet (relevante Klasse unten enthalten). Ein Benutzer gibt einige Daten ein und drückt eine positive Dialogschaltfläche, die die Daten an die Aktivität senden soll. Ich habe versucht, die in dieser Antwort empfohlene Lösung zu verwenden: How can I pass values between a Dialog and an Activity?. Ich weiß, dass ich wahrscheinlich eine Absicht verwenden kann, aber ich würde das Observer-Muster gerne implementieren, da es etwas ist, mit dem ich zu kämpfen habe.

Im Folgenden ist der Code für MyDialog:

public class MyDialog extends DialogFragment { 


MyDialogListener mListener; 

public interface MyDialogListener{ 
    public void onDialogPositiveClick(MyObject objectToSend); 
} 
@Override 
@NonNull 
public Dialog onCreateDialog(Bundle savedInstanceState){ 

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    View view = inflater.inflate(R.layout.add_plant_dialog, null); 
    edit1 = (EditText) view.findViewById(R.id.res1_edit); 
    edit2 = (EditText) view.findViewById(R.id.res2_edit); 
    edit3 = (EditText) view.findViewById(R.id.res3_edit); 
    builder.setView(view); 
      builder.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        String selectedName = edit1.getText().toString(); 
        String selectedSpec = edit2.getText().toString(); 
        String selectedTemp = edit3.getText().toString(); 
        MyObject userObject = new Plant(selectedName, selectedSpec); 
        mDBHandler = new DBHandler(getActivity(), null, null, 1); 
        mDBHandler.addToDB(userObject); 
        mListener.onDialogPositiveClick(userObject); 


       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 


       } 
      }); 


    //return createdDialog; 
    return builder.create(); 
} 

@Override 
public void onAttach(Activity activity){ 
    super.onAttach(activity); 
    // Verify that activity implements the listener 
    try { 
     // Instantiate the MyDialogListener so we can send events to host 
     mListener = (MyDialogListener) activity; 
    } catch (ClassCastException e){ 
     throw new ClassCastException(activity.toString() + " must implement " + 
       "MyDialogListener interface"); 
    } 
} 

public void setDialogResult(MyDialogListener listener){ 
    mListener = listener; 
} 
} 

ich mit Hilfe von Schnittstellen nicht zu groß bin, so bin ich nicht sicher, ob dies ein einfacher Fehler, kein Verfahren korrekt Implementierung ist, oder wenn Das ist etwas subtiler, was mit dem Lebenszyklus von DialogFragment zu tun hat. Ich schätze jede Hilfe sehr. Vielen Dank im Voraus.

+0

Was ist das Problem, auf das Sie stoßen? – Ginandi

+0

Die Zeile, die zum ersten Code-Snippet kommentiert wurde, wird niemals ausgeführt. onDialogPositiveClick (MyObject objectToSend) wird nicht in Aktivität aufgerufen. –

Antwort

0

Sie müssen den Listener nicht explizit über eine Methode festlegen. Stellen Sie sicher, dass Ihre Hostaktivität die Schnittstelle implementiert, und die Referenz in der onAttach-Methode im Fragment abgerufen wird.

+0

Ja, das war es. Entfernte setDialogResult() und überschrieb gerade onDialogPositiveClick(). Wie ich schon sagte, ich versuche immer noch, die Schnittstellen zu implementieren, deshalb schätze ich Ihre Hilfe! –

+0

Glücklich zu helfen =) – Hitesh

Verwandte Themen