Super.onCreateView en Fragmentos

Terminé el curso Coursera sobre Programación de Aplicaciones Móviles para Android Handheld Systems. Uno de los códigos de ejemplo del curso nos enseña cómo a nosotros fragmentos. Básicamente lo que hace es dividir la pantalla en dos fragmentos, uno para los títulos de libros y otro para las citas del libro. Si un usuario hace clic en un título en un fragmento de la izquierda, la cita asociada del libro se muestra en un fragmento a la derecha.

Este es el código de la mainActivity:

package course.examples.Fragments.StaticLayout; import android.app.Activity; import android.os.Bundle; import android.util.Log; import course.examples.Fragments.StaticLayout.TitlesFragment.ListSelectionListener; public class QuoteViewerActivity extends Activity implements ListSelectionListener { public static String[] mTitleArray; public static String[] mQuoteArray; private QuotesFragment mDetailsFragment; private static final String TAG = "QuoteViewerActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mTitleArray = getResources().getStringArray(R.array.Titles); mQuoteArray = getResources().getStringArray(R.array.Quotes); setContentView(R.layout.main); mDetailsFragment = (QuotesFragment) getFragmentManager() .findFragmentById(R.id.details); } @Override public void onListSelection(int index) { if (mDetailsFragment.getShownIndex() != index) { mDetailsFragment.showQuoteAtIndex(index); } } 

Este es el código para el fragmento de la cita:

 package course.examples.Fragments.StaticLayout; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class QuotesFragment extends Fragment { private TextView mQuoteView = null; private int mCurrIdx = -1; private int mQuoteArrayLen; private static final String TAG = "QuotesFragment"; public int getShownIndex() { return mCurrIdx; } public void showQuoteAtIndex(int newIndex) { if (newIndex < 0 || newIndex >= mQuoteArrayLen) return; mCurrIdx = newIndex; mQuoteView.setText(QuoteViewerActivity.mQuoteArray[mCurrIdx]); } @Override public void onAttach(Activity activity) { Log.i(TAG, getClass().getSimpleName() + ":entered onAttach()"); super.onAttach(activity); } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, getClass().getSimpleName() + ":entered onCreate()"); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { **return inflater.inflate(R.layout.quote_fragment, container, false);** } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mQuoteView = (TextView) getActivity().findViewById(R.id.quoteView); mQuoteArrayLen = QuoteViewerActivity.mQuoteArray.length; } 

Este es el código para el fragmento del título:

 package course.examples.Fragments.StaticLayout; import android.app.Activity; import android.app.ListFragment; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; public class TitlesFragment extends ListFragment { private ListSelectionListener mListener = null; private static final String TAG = "TitlesFragment"; public interface ListSelectionListener { public void onListSelection(int index); } @Override public void onListItemClick(ListView l, View v, int pos, long id) { getListView().setItemChecked(pos, true); mListener.onListSelection(pos); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (ListSelectionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); } } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, getClass().getSimpleName() + ":entered onCreate()"); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i(TAG, getClass().getSimpleName() + ":entered onCreate()"); **return super.onCreateView(inflater, container, savedInstanceState);** } @Override public void onActivityCreated(Bundle savedState) { super.onActivityCreated(savedState); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); setListAdapter(new ArrayAdapter<String>(getActivity(), R.layout.title_item, QuoteViewerActivity.mTitleArray)); } 

MainActivity xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:baselineAligned="false" android:orientation="horizontal" > <fragment android:id="@+id/titles" android:layout_width="0px" android:layout_height="match_parent" android:layout_weight="1" class="course.examples.Fragments.StaticLayout.TitlesFragment" /> <fragment android:id="@+id/details" android:layout_width="0px" android:layout_height="match_parent" android:layout_weight="2" class="course.examples.Fragments.StaticLayout.QuotesFragment" /> </LinearLayout> 

Citar Fragmentos xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/quoteView" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dip" android:textSize="32sp" > </TextView> </LinearLayout> 

Título del fragmento xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="?android:attr/activatedBackgroundIndicator" android:orientation="vertical" android:padding="5dip" android:textSize="32sp" > </TextView> 

Mi pregunta es ¿por qué el método bajo onCreateView difieren en fragmento de cita y fragmento de título? QuoteFragment es return inflater.inflate (R.layout.quote_fragment, container, false); TitleFragment es return super.onCreateView (inflador, container, savedInstanceState);

3 Solutions collect form web for “Super.onCreateView en Fragmentos”

Debido a que QuotesFragment extiende Fragment que no tiene el diseño por defecto y un usuario tiene que inflar y devolver su propio diseño. Así es como se onCreateView método onCreateView de un Fragment :

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return null; } 

TitlesFragment extends ListFragment que tiene un diseño por defecto que contiene ListView para los elementos, TextView para una etiqueta cuando una lista está vacía y ProgressBar . En este caso, el usuario no tiene que devolver su propia vista y puede devolver un objeto obtenido por la super llamada. onCreateView del ListFragment :

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(com.android.internal.R.layout.list_content, container, false); } 

Porque un ListFragment ya tiene un diseño predeterminado que contiene sólo el ListView utilizado por él. Puede inflar un diseño personalizado como con el otro Fragment , pero no es necesario. Si sólo desea utilizar un ListView que puede devolver super.onCreateView(...) .

Si desea utilizar un diseño personalizado, recuerde utilizar este identificador para su ListView :

 android:id="@android:id/list" 

Tienes

 return super.onCreateView(inflater, container, savedInstanceState); 

ListFragment tiene un diseño predeterminado que consiste en una vista de lista única. Por lo tanto, no es necesario inflar un diseño personalizado si no desea que aparezcan otras vistas en la pantalla.

Mira el origen de ListFragment . Su clase Fragment extiende ListFragment .

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/app/ListFragment.java/

 189 190 @Override 191 public View onCreateView(LayoutInflater inflater, ViewGroup container, 192 Bundle savedInstanceState) { 193 return inflater.inflate(com.android.internal.R.layout.list_content, 194 container, false); 195 } 

La línea 193 indica que la disposición predeterminada está inflada

Además usted tiene

 public class QuotesFragment extends Fragment { 

y esto

 return inflater.inflate(R.layout.quote_fragment, container, false); 

Lo que estás haciendo es inflar un diseño personalizado llamado quote_fragment.xml

Editar:

Suponga que desea mostrar otras vistas en ListFragment que necesita para inflar un diseño personalizado. Y ese diseño debe tener ListFragment con id @android:id/list .

  • Escala de círculo según el tamaño de la pantalla
  • ¿Cómo puedo generar recursos XML en tiempo de ejecución en Android?
  • Permisos de geolocalización insuficientes
  • El documento no tiene excepción de elemento raíz utilizando el serializador xml simple (v2.6.6)
  • ¿Establecer un fondo a los botones en un diálogo?
  • Android onClick en XML vs. OnClickListener
  • Java.lang.IllegalStateException: ScrollView puede alojar sólo un hijo directo
  • Cómo centrar drawableTop y texto verticalmente en el botón en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.