Java – super in the fragment onCreateView
I completed coursera course on mobile application programming for Android handheld system
This is the code of 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); } }
This is the code for the quote fragment:
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; }
This is the code for the title fragment:
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,Bundle savedInstanceState) { Log.i(TAG,getClass().getSimpleName() + ":entered onCreate()"); **return super.onCreateView(inflater,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>
Reference fragment 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>
Header fragment 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>
My question is why the methods under oncreateview are different under the quote fragment and the title fragment? Quotefragment returns an inflator inflate(R.layout.quote_fragment,false); Titlefragment returns super onCreateView(inflater,savedInstanceState);
Solution
Because quotesfragment extends the fragment without layout by default, and users must expand and return to their own layout This is what the oncreateview method of fragment looks like:
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { return null; }
Titlesfragment extends listfragment. By default, it contains a layout, including listview of the item, textview and ProgressBar of the tag when the list is empty In this case, the user does not have to return his own view and can return the object obtained by the super call Oncreateview of listfragment:
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { return inflater.inflate(com.android.internal.R.layout.list_content,false); }