21

Estoy usando la biblioteca de compatibilidad android (v4 revisión 8). En el DialogFragment personalizado, el método anulado en ViewCreated no se llama. Por ejemplo.Android DialogFragment onViewCreated no se llama

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 no se está registrando.

+0

¿Ha encontrado una solución para esto mientras tanto? –

Respuesta

14

Bueno, los documentos para el estado onViewCreated "Inmediatamente después de que onCreateView (LayoutInflater, ViewGroup, Bundle) haya regresado".

DialogFragment usa onCreateDialog y no onCreateView, por lo que onViewCreated no se activa. (Sería mi teoría de trabajo, no me he zambullido en la fuente de Android para confirmar).

+0

mi problema es algo como esto http://stackoverflow.com/questions/7692713/onviewcreated-with-compatibility-library pero la solución no funciona –

+6

'onCreateView' se activa cuando se crea un DialogFragment, incluso cuando también se usa' onCreateDialog '. Aún así, 'onViewCreated' no se activa al crear un DialogFragment. Comportamiento raro. – losttime

+0

dialogfragment use onCreateView cuando se devuelve super.onCreateDialog. – njzk2

7

De mis pruebas, onViewCreated no se llama si onCreateView devuelve un valor nulo, que es el comportamiento por defecto, por lo que si usted no está usando onCreateView pero llamar manualmente setContentView en onCreateDialog, puede llamar manualmente onViewCreated de 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; 
} 

en este caso, asegúrese de que el elemento raíz en my_dialog.xml tiene android:id="@+id/dialog_content"

+1

El único problema con este enfoque es si está incrustando el 'DialogFragment'; en este caso, 'onViewCreated' se llamaría dos veces. –

2

de acuerdo con el documento (Selecting Between Dialog or Embedding) y después de haber probado que por mí mismo, puede anular OnCreateVi ew, inflarlo con su diseño personalizado y devolverlo. OnViewCreated se pondrá en marcha

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

Se puede ver lo que está sucediendo a partir del código fuente:

En primer lugar, ya que no se sobreescribe vista onCreateView() de su fragmento será nulo. Esto puede ser visto desde el source code of Fragment - los rendimientos por defecto null:

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

En segundo lugar, ya que estás vista es nula la FragmentManager no va a llamar onViewCreated(). Desde el 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; 
}