android android-layout android-intent android-fragments android-4.0

android - getView devuelve nulo cuando el fragmento se ha creado a partir de una actividad



android-layout android-intent (6)

Tengo una aplicación de tableta que ahora estoy tratando de hacer funcionar en teléfonos. En una tabla hay dos fragmentos en la pantalla, un fragmento de lista y un fragmento de detalles. Cuando está en un teléfono, aparece el fragmento de la lista y crea una nueva actividad cuando se presiona un elemento de la lista. Esta actividad simplemente crea el fragmento en el método onCreate() y lo onCreate() a 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 funciona como se esperaba, sin embargo, desde dentro de esta actividad necesito decirle al fragmento qué detalles 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 nulo cuando la aplicación se ejecuta en un teléfono donde solo se muestra un fragmento.

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


Como se llama a onCreate () antes de onCreateView (), si se infla una vista en onCreateView () o no, no se obtiene nada a través de getView () en onCreate (), porque en ese momento, onCreate () aún no se ha llamado .


Debe verificar el ciclo de vida de Android para comprender por qué es nulo en la función de conexión (...).

La primera función llamada cuando se crea el fragmento se agrega 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 aún no se ha creado una vista!

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

Lee y aprende todo el ciclo de vida here .

Saludos


Mover el método a onCreateView() no me ayudó.so ... 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 reemplaza todo tu getView() con mView


Mueva su llamada a método para que se ejecute durante onCreateView , y use la vista que está inflando para 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 () Obtenga la vista raíz para el diseño del fragmento (el que devuelve onCreateView (LayoutInflater, ViewGroup, Bundle)), si se proporciona.

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


Puede solucionarlo colocando su código dentro del método onViewCreated() , que debe anular. No te olvides de llamar a super() en él.


se convierte en nulo básicamente porque usted llama a getview() antes de que la vista se infla. Crea un objeto de View y rellena con un inflater y luego encuentra tu elemento de interfaz de usuario. Consulta el 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;