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

先看下实例效果图:

效果图的左边是一个列表,右边是列表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. 浅谈Java中Collections.sort对List排序的两种方法
  2. 箭头函数的基础使用
  3. NPM 和webpack 的基础使用
  4. Python list sort方法的具体使用
  5. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  6. python list.sort()根据多个关键字排序的方法实现
  7. Android(安卓)View的介绍和使用
  8. android dialog 动画
  9. Android——Activity四种启动模式

随机推荐

  1. Mac 配置Android环境变量( 有图)
  2. Android 编辑框(EditText)属性
  3. 新浪微博Android客户端SSO授权认证缺陷
  4. android中adb命令大全
  5. Android 性能优化的一些方法
  6. 【android乱七八糟】android体系结构
  7. OpenJDK将对Android开发产生怎样的影响?
  8. Android:EditText
  9. Android UI之EditText注意点收集
  10. flutter state