getView devuelve null cuando el fragmento se ha creado a partir de una actividad


Tengo una aplicación de tableta de trabajo que ahora estoy tratando de hacer que funcione en los teléfonos también. En una tabla hay dos fragmentos en la pantalla un fragmento de lista y un fragmento de detalles. Cuando en un teléfono aparece el fragmento de lista y crea una nueva actividad cuando se presiona un elemento de lista. Esta actividad simplemente crea el fragmento en el método onCreate() y lo confirma en la pantalla de la siguiente manera.

// Place an DeallDetailsFragment as our content pane
DealDetailsFragment f = new DealDetailsFragment();
getFragmentManager().beginTransaction().add(android.R.id.content, f).commit();
getFragmentManager().executePendingTransactions();

Esto está funcionando como se esperaba sin embargo desde dentro de esta actividad necesito decirle al fragmento lo que detalles para cargar y mostrar. En mi clase DealDetailsFragment tengo un método updateDeal() que actualiza el contenido de la siguiente manera.

if (deal==null) { // could be null if user presses the loading deals list item before it loads
    return;
}
this.deal=deal;
if (dealTitle==null) { // get the view objects only once
    holder = new ViewHolder();  
    holder.dealHeat=(TextView) getView().findViewById(R.id.dealDetails_heat_textView);
    holder.dealPrice=(TextView) getView().findViewById(R.id.dealDetails_price_textView);
    holder.dealRetailer=(TextView) getView().findViewById(R.id.dealDetails_retailer_textView);
    holder.dealTitle=(TextView) getView().findViewById(R.id.dealDetails_title_textView);
    holder.dealDesc=(TextView) getView().findViewById(R.id.dealDetails_desc_textView);
    holder.goToButton= (LinearLayout) getView().findViewById(R.id.dealDetails_goToDeal);
    holder.dealImage=(ImageView) getView().findViewById(R.id.dealDetails_imageView);
    holder.postedBy=(TextView) getView().findViewById(R.id.dealDetails_poster_textView);
    holder.datePosted=(TextView) getView().findViewById(R.id.dealDetails_date_textView);

getView() devuelve null cuando la aplicación se ejecuta en un teléfono donde solo se muestra un fragmento.

¿Alguna idea? Desafortunadamente, no hay muchos ejemplos de fragmentos disponibles en línea.

Author: bencallis, 2012-02-28

6 answers

Mueva la llamada a su método para que se ejecute durante onCreateView y use la vista que está inflando como referencia en lugar de getView(). Consulte el ciclo de vida del fragmento para obtener más información: https://developer.android.com/guide/components/fragments.html#Creating

Y la documentación de getView() que explica por qué devuelve null antes de que onCreateView(LayoutInflater, ViewGroup, Bundle) devuelva:

GetView () Obtener la vista raíz para el diseño del fragmento (la devuelta por onCreateView (LayoutInflater, ViewGroup, Bundle)), si se proporciona.

Https://developer.android.com/reference/android/app/Fragment.html#getView()

 120
Author: Jason Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-01 13:24:41

Mover el método a onCreateView() no ayudó me.so Create Crear una variable global mView

 protected View mView;

Y en onCreateView ()

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "oncreateView");
        super.onCreateView(inflater, container, savedInstanceState);

        View view = inflater.inflate(R.layout.activity_secure_cloud_drive_folder, container, false);
        this.mView = view;
        return view;
}

Y el reemplazar todo su getView() con mView

 19
Author: spaceMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-18 11:41:50

Puede arreglar eso poniendo su código dentro del método onViewCreated(), que debe anular. No se olvide de llamar super() en él.

 7
Author: Joaquin Iurchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-18 11:33:56

Debe comprobar el ciclo de vida de Android para entender POR qué es null en onAttach(...) función.

La primera función llamada cuando se crea fragment es onAttach(), pero en realidad no se ha creado ninguna vista. Es por eso que se devuelve null cuando intenta acceder dentro de esta llamada.

La siguiente función es onCreate()... pero no hay ninguna vista creada todavía!!!!

La tercera función llamada es onCreateView () , y es aquí donde tienes que indique cuál es la vista adjunta a este fragmento.... Y es solo desde esta llamada donde existe un objeto view y se puede acceder a él.

Lea y aprenda el ciclo de vida completo aquí.

Saludos

 4
Author: Anibal Itriago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-22 21:03:01

Debido a que onCreate() se llama antes que onCreateView() , ya sea que infles una vista en onCreateView() o no, no obtendrás nada a través de getView() en onCreate(), porque en ese tiempo , onCreate() aún no se ha llamado.

Ciclo de Vida de Android

 1
Author: Jack Shen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-18 04:55:32

Se convierte en null básicamente porque llamas a getview() antes de que la vista se infle. Cree un objeto View y rellene usando inflater y luego encuentre su elemento de interfaz de usuario ver código a continuación

  View view = inflater.inflate(R.layout.fragment_albumslist, container, false);
        TextView t= (TextView)view.findViewById(R.id.txtTest);
        t.setText(strtext);
        return view;
 0
Author: Code_Worm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-16 13:46:41