2013-06-24 13 views
10

È possibile utilizzare uno DialogFragment quando si utilizza uno Activity anziché uno FragmentActivity? I metodi show() necessitano di uno FragmentManager.DialogFragment senza FragmentActivity

Voglio implementare una finestra di dialogo che contenga un solo EditText e le esercitazioni sugli sviluppatori Android dicono che devo usare un layout personalizzato su un frammento di finestra di dialogo. Così ho chiesto perché non ho voglia di cambiare per usare FragmentActivity solo per 1 finestra di dialogo.

RISOLTO: Ho deciso di utilizzare FragmentActivity anziché Activity in modo che non si complichi ulteriormente.

+0

Modifica la tua domanda perché non è abbastanza chiara. Stai cercando di implementare il tuo DialogFragment estendendo la classe di attività? – Marek

+0

No, stavo cercando di usare un DialogFragment su una classe personalizzata che estende Activity. Le esercitazioni dicono che la classe personalizzata dovrebbe estendere FragmentActivity anziché Activity. Quindi stavo chiedendo se potevo farlo estendere l'attività. –

+0

Hai provato a farlo? Riscontrato problemi? – Marek

risposta

0

Se è necessaria una finestra di dialogo per tutti i frammenti, utilizzare il normale dialog code per le attività con l'attività di frammento. Altrimenti, basta implementarlo in un DialogFragment come figlio di Fragment Activity.

17

Ho riscontrato lo stesso problema. So che l'hai chiesto un anno fa, ma ancora per aiutare altri utenti. Questo è il modo in cui ho risolto il problema.

public void show_dialog() { 
    FragmentManager fm = getFragmentManager(); 
    DialogFragment newFragment = new DialogFragment(); 
    newFragment.show(fm, "abc"); 
} 

Ciò richiede solo l'importazione di FragmentManager, non FragmentActivity.

+5

Se si utilizza la libreria di supporto V7, è necessario chiamare "getSupportFragmentManager()". Grazie mille! –

+0

Nota! Richiede API minima Livello 11 –

0

Ho avuto lo stesso problema ma sono riuscito a risolverlo con l'aiuto delle risposte nel post di overflow dello stack collegato sotto. Ho particolarmente apprezzato la soluzione di mrolcsi con il concetto di ascoltatore a risultato positivo/negativo, che ha dato un risultato molto accurato secondo me.

Get value from DialogFragment

2

Forse un po 'tardi, ma ho avuto anche il problema di chiamare un DialogFragment da un non FragmentActivity. Anche renderlo un FragmentActivity solo per un semplice dialogo non avrebbe senso. Quindi la soluzione per me era di creare un'interfaccia con un callback vuoto per ottenere la risposta DialogFragment nell'attività. Per me è meglio se ottenere la risposta vicino alla chiamata di dialogo piuttosto che ottenerla da qualche parte in un override di onActivityResult.

L'interfaccia:

import android.os.Parcelable; 

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

    void onDialogResponse(int responseCode); 

} 

la finestra di classe generica:

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(); 
    } 
} 

E l'uso sarebbe come questo:

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"); 

Questo è tutto. Forse un po 'più di codice che in una finestra di dialogo simle ma mantiene i suoi valori e gli spettacoli sul cambiamento di orientamento. Questo era il mio obiettivo per l'utilizzo di DialogFragment.

+0

Grazie mille, soluzione piacevole e funzionante! –