0

Hier ist meine Situation. Ich habe ein Fragment, das zwei Knöpfe hat. Wenn Sie auf eine der Schaltflächen tippen, erscheint eine DialogFragment, die eine einzelne EditText mit OK/Cancel-Tasten enthält. Beide Tasten öffnen dieselbe DialogFragment, aber die Dateneingabe in die EditText s muss separat gehalten werden.Mehrere DialogFragment-Ereignisrückrufe - wie kann ich feststellen, welches Fragment aktualisiert werden soll?

Ich habe vor kurzem begonnen, die Fragment-Ereignis Callback-Muster von der Android-Dokumentation seen here zu implementieren, aber ein Problem aufgetreten - ich habe zwei Schaltflächen mit dem gleichen Ereignis Rückruf und bin mir nicht sicher, wie zu unterscheiden, welche der Benutzer gerade beendet hat . Wenn ich zum Beispiel die Dokumentation verwende, kann ich über zwei Schaltflächen auf dem gleichen Bildschirm öffnen, muss aber das Ergebnis unterschiedlich behandeln, je nachdem, auf welche Schaltfläche ich geklickt habe.

In meinem Fragmente:

public static class FragmentA extends DialogFragment { 
    public interface OnEditNameListener { 
    public void onPositiveButtonClicked(String newName); 
    } 
} 

@Override 
public void onAttach(Context context){ 
    super.onAttach(context); 
    try { 
     mListener = (OnEditNameListener) context; 
    } 
    catch (ClassCastException e) { 
     throw new ClassCastException(context.toString() + " must implement OnEditNameListener "); 
    } 
} 

In meiner Tätigkeit, die die OnEditNameListener implementiert:

button1.setOnClickListener(new OnClickListener(){ 
    @Override 
    public void onClick(View view) { 
    (new EditNameDialog.Builder()) 
     .setTitle(getContext().getString(R.string.title)) 
     .setValue(currentText) 
     .show(mParentFragmentActivity.getSupportFragmentManager()); 
     } 
    }); 

button2.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
    (new EditNameDialog.Builder()) 
     .setTitle(getContext().getString(R.string.title2)) 
     .setValue(currentText2) 
     .setInputType(InputType.TYPE_CLASS_NUMBER) 
     .show(mParentFragmentActivity.getSupportFragmentManager()); 
     } 
    }); 

@Override 
public void onPositiveButtonClicked(String newName) { 
    ... //does stuff with the name. 
//Currently no way to determine whether this came from button1 or button2. 
} 

Derzeit beiden Rückrufe die gleiche OnPositiveButtonClicked Methode mit dem Eingang von den DialogFragment getroffen, aber ich tue Ich weiß nicht, wie ich herausfinden soll, von welchem ​​der beiden Knöpfe es kam.

Antwort

1

allererst Sie ein Argument zu Ihrem onPositiveButtonClicked(String name,int buttonId), und der Pass zu fragmenta hinzuzufügen haben ein Argument auf der Schaltfläche basierend gedrückt wie:

FragmentA fragment=new FragmentA(); 
Bundle args = new Bundle(); 
args.putInt("buttonId", 1 or 2); 
fragment.setArguments(args); 
//open the fragment from the activity 

Dann in Ihrer fragmenta onCreate Methode versuchen:

int buttonId = getArguments().getInt("buttonId"); 

und schließlich, wenn positive Ruftaste gedrückt:

onPositiveButtonClicked(newName,buttonId) 

UPDATE

Eine noch bessere Lösung ist es, eine Setter in Ihrem DialogFragment zu erstellen und anonymus Schnittstellen wie verwenden:

(new EditNameDialog.Builder()) 
     .setTitle(getContext().getString(R.string.title)) 
     .setValue(currentText).setOnEditNameListener(new EditNameListener{ 
     @Override 
      onPositiveButtonClicked(String newName){ 
      //handle action 
      } 
}); 

Und in Ihrem DialogFragment fügen Sie den Setzer:

EditNameListener listener; 
public DialogFragment setOnEditNameListener(EditNameListener listener){ 
    this.listener=listener; 
return this; 
} 
+0

Ging mit etwas ähnlich wie Ihre ursprüngliche Antwort. Ich kann Ihr Update nicht in meinem Fall verwenden - das hatte ich ursprünglich. Ich habe es mit einigen Randfällen zu tun, bei denen die Aktivität möglicherweise zerstört wurde, aber das Fragment ist immer noch auf dem Bildschirm. Das passiert nur bei Handys mit wenig Speicher. Sie können es testen, indem Sie in den Entwicklereinstellungen auf dem Gerät die Option "Aktivitäten nicht beibehalten" aktivieren. Öffnen Sie ein DialogFragment, das an eine Aktivität angehängt ist, verlassen Sie die App, kehren Sie zu ihr zurück und versuchen Sie dann, das Dialogfragment zu schließen. Sollte einen Nullpointer werfen, da der Hörer weg ist. Event Callback (Link in OP) behandelt diesen Fall. –

Verwandte Themen