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 .

  • ¿Hay alguna implementación de StAX para Android?
  • Android: se centra en EditText después de la selección de Spinner
  • Combinar lienzo y diseño (Android)
  • Rellenar popupmenu sin archivo XML en android
  • Android Lollipop Diseño del material Desbordamiento Menú Icon color
  • Atributo "vacío" no funciona como se esperaba con SimpleFramework
  • Valor de dimensión definido de Android XML que produce resultados inesperados
  • Permitir que TextView esté fuera de la pantalla
  • Mostrar contenido en la barra de herramientas
  • Registrar un Local BroadcastReceiver en AndroidManifest.xml?
  • Cambiar la transición de navegación igual que Volver o Cerrar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.