2012-05-15 17 views
21

Sto usando la libreria di compatibilità Android (versione 8 revisione 8). Nel parametro Dialog personalizzato non viene richiamato il metodo sovrascritto suViewCreated. Ad esempio.Android DialogFragment onViewCreated non chiamato

public class MyDialogFragment extends DialogFragment{ 
    private String mMessage; 
    public MyDialogFragment(String message) { 
     mMessage = message; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 
     super.onCreateDialog(savedInstanceState); 
     Log.d("TAG", "onCreateDialog"); 
     setRetainInstance(true); 
     //....do something 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     Log.d("TAG", "onViewCreated"); 
     //...do something 
    } 
} 

onViewCreated non viene registrato.

+0

Avete trovato una soluzione per questo nel frattempo? –

risposta

14

Bene, i documenti per lo stato onViewCreated "Chiamati immediatamente dopo onCreateView (LayoutInflater, ViewGroup, Bundle) è tornato".

DialogFragment utilizza onCreateDialog e non onCreateView, quindi onViewCreated non viene attivato. (Sarebbe la mia teoria del lavoro, non mi sono tuffato nella fonte Android per confermare).

+0

il mio problema è qualcosa di simile a questo http://stackoverflow.com/questions/7692713/onviewcreated-with-compatibility-library ma la soluzione non sta funzionando –

+6

'onCreateView' viene generato quando si costruisce un DialogFragment, anche quando si usa' onCreateDialog '. Ancora, 'onViewCreated' non viene attivato quando si crea un DialogFragment. Comportamento strano – losttime

+0

dialogfragment utilizza onCreateView quando viene restituito super.onCreateDialog. – njzk2

7

Dal mio test, onViewCreated non viene chiamato se onCreateView restituisce null, che è il comportamento di default, quindi se non si sta usando onCreateView ma chiamando manualmente setContentView in onCreateDialog, è possibile chiamare manualmente onViewCreated da onCreateDialog:

@Override public Dialog onCreateDialog(Bundle savedInstanceState) { 
    final Dialog d = super.onCreateDialog(savedInstanceState); 
    d.setContentView(R.layout.my_dialog); 
    // ... do stuff.... 
    onViewCreated(d.findViewById(R.id.dialog_content), savedInstanceState); 
    return d; 
} 

in questo caso, assicurarsi che l'elemento principale in my_dialog.xml ha android:id="@+id/dialog_content"

+1

L'unico problema con questo approccio è se si sta incoraggiando il 'DialogFragment'; in questo caso, 'onViewCreated' verrebbe chiamato due volte. –

2

Secondo il doc (Selecting Between Dialog or Embedding) e dopo aver testato da solo, è possibile ignorare OnCreateVi ew, gonfialo con il tuo layout personalizzato e restituiscilo. OnViewCreated sarà lanciato

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.custom_layout, null); 
      //do whatever   
      return view; 
    } 
3

Si può vedere cosa sta succedendo dal codice sorgente:

In primo luogo, dal momento che non sovrascrivere vista onCreateView() vostra del frammento sarà nullo. Questo può essere visto dal source code of Fragment - i rendimenti predefiniti null:

// android.support.v4.app.Fragment.java 
@Nullable 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
     @Nullable Bundle savedInstanceState) { 
    return null; 
} 

In secondo luogo, dal momento che sei vista è nullo il FragmentManager non chiamerà onViewCreated(). Da source code of FragmentManager:

// android.support.v4.app.FragmentManager.java 
if (f.mView != null) { 
    f.mInnerView = f.mView; 
    // ... 

    // only called if the fragments view is not null! 
    f.onViewCreated(f.mView, f.mSavedFragmentState); 
} else { 
    f.mInnerView = null; 
} 
Problemi correlati