我完成了针对
Android手持系统的移动应用编程的Coursera课程.
课程中的一个示例代码告诉我们如何对我们进行分片.基本上它的作用是将屏幕分成两个片段,一个用于书名,一个用于书中的引用.如果用户单击左侧片段中的标题,则从该书中关联的引用将显示在右侧的片段中.
课程中的一个示例代码告诉我们如何对我们进行分片.基本上它的作用是将屏幕分成两个片段,一个用于书名,一个用于书中的引用.如果用户单击左侧片段中的标题,则从该书中关联的引用将显示在右侧的片段中.
这是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); } }
这是Quote片段的代码:
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; }
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>
引用片段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>
标题片段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>
我的问题是为什么onCreateView下的方法在Quote片段和Title片段下有所不同?
QuoteFragment返回inflater.inflate(R.layout.quote_fragment,false);
TitleFragment返回super.onCreateView(inflater,savedInstanceState);
解决方法
因为QuotesFragment扩展了默认情况下没有布局的Fragment,并且用户必须膨胀并返回自己的布局.这就是Fragment的onCreateView方法的样子:
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { return null; }
TitlesFragment扩展了ListFragment,它默认包含一个布局,包含项目的ListView,列表为空时的标签的TextView和ProgressBar.在这种情况下,用户不必返回他自己的视图并且可以返回超级调用获得的对象. ListFragment的onCreateView:
public View onCreateView(LayoutInflater inflater,Bundle savedInstanceState) { return inflater.inflate(com.android.internal.R.layout.list_content,false); }