Fragment是Android honeycomb 3.0新增的概念,在Android——Fragment介绍、Android Fragment使用Android FragmentManage FragmentTransaction介绍中做了关于Fragment的详细介绍。这一片主要通过一个实例了解Fragment的使用。

先看下实例效果图:

Android UI开发第十七篇——Android Fragment实例(ListFragment)_第1张图片

效果图的左边是一个列表,右边是列表item的详情。

先看一下布局文件(layout):

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <fragment
  6. class="com.fragment.main.TitlesFragment"
  7. android:id="@+id/titles"android:layout_weight="1"
  8. android:layout_width="0px"android:layout_height="match_parent"/>
  9. <FrameLayoutandroid:id="@+id/details"android:layout_weight="1"
  10. android:layout_width="0px"android:layout_height="match_parent"
  11. android:background="?android:attr/detailsElementBackground"/>
  12. </LinearLayout>

布局文件中使用了fragment标签和FrameLayout标签。Android Fragment使用中介绍了2中嵌入Fragment的方法,这个实例中都用到,从布局文件看到有了fragment标签,这是一种使用方法,FrameLayout标签将会成为第二种加载fragment的载体view。

看一下程序实现(com.fragment.main.TitlesFragment):

[java] view plain copy print ?
  1. publicclassTitlesFragmentextendsListFragment{
  2. intmCurCheckPosition=0;
  3. intmShownCheckPosition=-1;
  4. @Override
  5. publicvoidonActivityCreated(BundlesavedInstanceState){
  6. super.onActivityCreated(savedInstanceState);
  7. setListAdapter(newArrayAdapter<String>(getActivity(),
  8. android.R.layout.simple_list_item_activated_1,
  9. Shakespeare.TITLES));//使用静态数组填充列表
  10. if(savedInstanceState!=null){
  11. mCurCheckPosition=savedInstanceState.getInt("curChoice",0);
  12. mShownCheckPosition=savedInstanceState.getInt("shownChoice",-1);
  13. }
  14. getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  15. showDetails(mCurCheckPosition);
  16. }
  17. @Override
  18. publicvoidonSaveInstanceState(BundleoutState){
  19. super.onSaveInstanceState(outState);
  20. outState.putInt("curChoice",mCurCheckPosition);
  21. outState.putInt("shownChoice",mShownCheckPosition);
  22. }
  23. @Override
  24. publicvoidonListItemClick(ListViewl,Viewv,intposition,longid){
  25. showDetails(position);
  26. }
  27. /**
  28. *显示listviewitem详情
  29. */
  30. voidshowDetails(intindex){
  31. mCurCheckPosition=index;
  32. getListView().setItemChecked(index,true);
  33. if(mShownCheckPosition!=mCurCheckPosition){
  34. DetailsFragmentdf=DetailsFragment.newInstance(index);
  35. FragmentTransactionft=getFragmentManager()
  36. .beginTransaction();
  37. ft.replace(R.id.details,df);
  38. ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
  39. ft.commit();
  40. mShownCheckPosition=index;
  41. }
  42. }
  43. }


TitlesFragment

TitlesFragment继承自Fragment的子类ListFragment,使用了一个静态数组填充列表,重写了onListItemClick方法,showDetails方法展示ListView item的详情。

DetailsFragment df = DetailsFragment.newInstance(index);//获取详情Fragment的实例

FragmentTransaction ft = getFragmentManager().beginTransaction();//获取FragmentTransaction 实例

ft.replace(R.id.details, df); //使用DetailsFragment 的实例

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

ft.commit();//提交

这里就使用到了Android Fragment使用中介绍的第二种加载fragment的方法。看一下DetailsFragment :

[java] view plain copy print ?
  1. publicclassDetailsFragmentextendsFragment{
  2. /***CreateanewinstanceofDetailsFragment,initializedto*showthetextat'index'.*/
  3. publicstaticDetailsFragmentnewInstance(intindex){
  4. DetailsFragmentf=newDetailsFragment();
  5. //Supplyindexinputasanargument.
  6. Bundleargs=newBundle();
  7. args.putInt("index",index);
  8. f.setArguments(args);
  9. returnf;
  10. }
  11. @Override
  12. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
  13. BundlesavedInstanceState){
  14. if(container==null){
  15. returnnull;
  16. }
  17. ScrollViewscroller=newScrollView(getActivity());
  18. TextViewtext=newTextView(getActivity());
  19. intpadding=(int)TypedValue.applyDimension(
  20. TypedValue.COMPLEX_UNIT_DIP,4,getActivity().getResources()
  21. .getDisplayMetrics());
  22. text.setPadding(padding,padding,padding,padding);
  23. scroller.addView(text);
  24. text.setText(Shakespeare.DIALOGUE[getArguments().getInt("index",0)]);
  25. returnscroller;
  26. }
  27. }


DetailsFragment 中使用newInstance(int index)方法产生DetailsFragment 实例并接受整型参数,重载了onCreateView方法创建view。

这个例子基本完成了,主要介绍的是在3.0以后的使用方法,其实Fragment在SDK1.6之后就可以使用了,在1.6上使用需要借助android-support-v4.jar包实现。android-support-v4.jar在:SDK根目录\extras\android\compatibility\v4下可以找到,如果想了解Fragment在SDK1.6上怎么实现的请参考Fragment 在Android SDK1.6上实现。

更多相关文章

  1. Android实现下载文件功能的方法
  2. Android 通讯录中用到的关于按名字首字母排序方法
  3. 开机引导程序只执行一次的方法
  4. Android MediaPlayer 常用方法介绍
  5. Android 自定义组件 方法篇
  6. android中HttpURLConnection调用getResponseCode()时崩溃 解决方
  7. Android自学笔记(Android x86模拟器Intel Atom x86 System Image
  8. android Button组件的属性和方法

随机推荐

  1. android事件薄-不能安装APK的一种原因
  2. 取代opencore的stagefright
  3. Android(安卓)几种常用关于屏幕操作的方
  4. Android(安卓)网络管理
  5. :Android完全关闭应用程序
  6. 关于Android(安卓)2.3.5 r1 锁屏问题
  7. Android(安卓)Storage Manager 处理
  8. Android中的Adapter 详解(二)
  9. Handler实现线程消息通信
  10. Android——自定义TabLayout背景,实现类似