2013-06-24 13 views
10

Kann ein DialogFragment bei Verwendung eines Activity anstelle eines FragmentActivity verwendet werden? Die show() Methoden benötigen eine FragmentManager.DialogFragment ohne FragmentActivity

Ich möchte einen Dialog implementieren, der nur eine EditText enthält, und die Tutorials auf Android-Entwickler sagt, ich muss ein benutzerdefiniertes Layout für ein Dialogfeld Fragment verwenden. Also fragte ich, weil ich nicht Lust habe, FragmentActivity nur für 1 Dialog zu verwenden.

Gelöst: Ich entschied mich nur FragmentActivity statt Activity zu verwenden, damit es nicht komplizierter wird.

+0

Bitte bearbeiten Sie Ihre Frage, weil sie nicht klar genug ist. Versuchen Sie, Ihr DialogFragment zu implementieren, indem Sie die Aktivitätsklasse erweitern? – Marek

+0

Nein, ich habe versucht, ein DialogFragment für eine benutzerdefinierte Klasse zu verwenden, die Activity erweitert. Die Tutorials sagen, dass die benutzerdefinierte Klasse FragmentActivity anstelle von Activity erweitern sollte. Also fragte ich, ob ich es schaffen könnte, die Aktivität zu erweitern. –

+0

Haben Sie das versucht? Sind irgendwelche Probleme aufgetreten? – Marek

Antwort

0

Wenn Sie einen übergreifenden Dialog für alle Ihre Fragmente benötigen, verwenden Sie einfach den normalen dialog code für Aktivitäten mit der Fragmentaktivität. Andernfalls implementieren Sie es einfach in einem DialogFragment als untergeordnetes Element der Fragmentaktivität.

17

Ich stieß auf das gleiche Problem. Ich weiß, dass du das vor einem Jahr gefragt hast, aber immer noch anderen Nutzern zu helfen. So habe ich das Problem gelöst.

Dies erfordert nur den FragmentManager-Import, nicht die FragmentActivity.

+5

Wenn Sie die V7-Support-Bibliothek verwenden, müssen Sie stattdessen "getSupportFragmentManager()" aufrufen. Vielen Dank! –

+0

Hinweis! Es erfordert mindestens API Level 11 –

0

Ich hatte das gleiche Problem aber es geschafft, es mit Hilfe der Antworten in den Stapel-Überlauf Beitrag unten verlinkt zu beheben. Besonders gut gefallen hat mir die Lösung von mrolcsi mit dem Positiv/Negativ-Hörer-Konzept, was mir ein sehr ordentliches Ergebnis bescherte.

Get value from DialogFragment

2

Vielleicht ein wenig spät, aber ich hatte auch das Problem, eine DialogFragment von einem nicht FragmentActivity zu nennen. Es wäre auch nicht sinnvoll, es zu einer Fragment-Aktivität für einen einfachen Dialog zu machen. Also war die Lösung für mich, eine Schnittstelle mit einem Callback void zu machen, um die DialogFragment-Antwort in der Aktivität zu erhalten. Für mich ist es besser, die Antwort in der Nähe des Dialogaufrufs zu erhalten, anstatt sie irgendwo in einem OnActivityResult-Override zu platzieren.

Die Schnittstelle:

import android.os.Parcelable; 

/** 
* Created by TH on 03.11.2015. 
*/ 
public interface OnDialogResponseListener extends Parcelable { 

    void onDialogResponse(int responseCode); 

} 

Die allgemeine Dialogklasse:

OnDialogResponseListener onDialogResponseListener=new OnDialogResponseListener() { 


       @Override 
       public int describeContents() { 
        return 0; //Leave this as it is 
       } 

       @Override 
       public void writeToParcel(Parcel dest, int flags) { 
         //Leave this as it is 
       } 

       @Override 
       public void onDialogResponse(int responseCode) { 


        //Do what you want with your dialog answers 

        if(responseCode== Activity.RESULT_OK){ 
         Toast.makeText(MovementActivity.this,"OK pressed",Toast.LENGTH_LONG).show(); 
        }else if(responseCode==Activity.RESULT_CANCELED){ 
         Toast.makeText(MovementActivity.this,"CANCEL pressed",Toast.LENGTH_LONG).show(); 
        } 

       } 
      }; 


      YesNoDialog dialog = new YesNoDialog(); 
      Bundle args = new Bundle(); 
      args.putInt(YesNoDialog.ICON_ID, R.drawable.ic_action_add_light); 
      args.putString(YesNoDialog.YES, getString(R.string.action_add)); 
      args.putString(YesNoDialog.NO, getString(R.string.action_cancel)); 
      args.putString(YesNoDialog.TITLE, getString(R.string.dialog_title_add_item)); 
      args.putString(YesNoDialog.MESSAGE, getString(R.string.dialog_message_add_item)); 
      args.putParcelable(YesNoDialog.LISTENER, onDialogResponseListener); 
      dialog.setArguments(args); 
      dialog.show(getSupportFragmentManager(), "tag"); 

Das ist alles:

import android.app.Activity; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.support.v7.app.AlertDialog; 

/** 
* Code basisc found here: 
    * http://stackoverflow.com/questions/7977392/android-dialogfragment-vs-dialog 
* changed by TH on 03.11.2015. 
    */ 
public class YesNoDialog extends DialogFragment 
{ 

    public static final String TITLE="title"; 
    public static final String MESSAGE="message"; 
    public static final String LISTENER="listener"; 
    public static final String YES="yes"; 
    public static final String NO="no"; 
    public static final String ICON_ID="icon_id"; 
    private OnDialogResponseListener mResponseListener; 

    public YesNoDialog() 
    { 

    } 


    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) 
    { 
     Bundle args = getArguments(); 
     String title = args.getString(TITLE, ""); 
     String message = args.getString(MESSAGE, ""); 
     String yes = args.getString(YES, ""); 
     String no = args.getString(NO, ""); 
     int iconID=args.getInt(ICON_ID); 
     mResponseListener=args.getParcelable(LISTENER); 

     return new AlertDialog.Builder(getActivity()) 
       .setTitle(title) 
       .setMessage(message) 
       .setIcon(iconID) 
       .setPositiveButton(yes, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (mResponseListener != null) { 
          mResponseListener.onDialogResponse(Activity.RESULT_OK); 
         } 

        } 
       }) 
       .setNegativeButton(no, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         if (mResponseListener != null) { 
          mResponseListener.onDialogResponse(Activity.RESULT_CANCELED); 
         } 
        } 
       }) 
       .create(); 
    } 
} 

Und die Nutzung so sein würde. Vielleicht ein bisschen mehr Code als in einem einfachen Dialog, aber es behält seine Werte und zeigt auf Orientierungsänderung. Das war mein Ziel, ein DialogFragment zu verwenden.

+0

Vielen Dank, schöne und funktionierende Lösung! –

Verwandte Themen