运用ListFragment
view:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <fragment android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" class="com.young.fragmentdemo.listFragment" android:id="@+id/title"></fragment> <FrameLayout android:layout_width="0dp" android:layout_height="fill_parent" android:id="@+id/detail" android:layout_weight="2" ></FrameLayout> </LinearLayout>
public class Data { //标题 public static final String[] TITLE={ "线性布局", "绝对布局", "相对布局", "帧布局" }; //详细内容 public static final String[] DETAIL={ "中国空军新闻发言人申进科上校今天上午发布消息:经中央军委批准,空军派出4架伊尔-76飞机,投入尼泊尔抗震救灾。按照空军指示命令,27日8时前,2架伊尔-76飞机调机至成都双流机场,1架伊尔-76飞机调机至昆明长水机场,空运中国军队救灾人员和救援装备。\n" + " 伊尔-76作为军事运输机研制项目于上世纪60年代末提出并开始设计。由于安-12作为苏联军事空运主力已经显得载重小和航程不足,苏联为了提高其军事空运能力,急需一种航程更远、载重更大、速度更快的新式军用运输机,于是决定研制这种在外形和载重能力都类超过美国C-141重型运输机的伊尔-76,以弥补苏联军事空运能力的不足", "伊尔-76是世界上最为成功的一款重型运输机,至今以来已有超过38个国家使用过或正在使用伊尔-76,共有超过850余个营运者。苏联(俄罗斯)是最大的军用国,乌克兰和白俄罗斯是最大的民用版使用国。\n" + " 解放军在90年代以前可使用的大中型运输机包括运7、运8和少量的安24等。运7源自安-24,载重约5500千克,运-8源自安-12,载重约20吨。按现在的技术水平来看,这两种机型的载重量、航程都不堪应付快速空投和部队机动的需要。因此90年代起,我国引进了多达数十架的俄罗斯伊尔-76大型喷气运输机。\n" + " 伊尔-76的详细资料请见其具体页面。目前西飞、陕飞等企业正在考虑运-8的后继机型,包括研制全重提高至75吨的运-8改型,或伊尔-76,或伊尔-76的改进型号,为之正向外争取合作伙伴,推进预研工作。同时,伊尔-76已经成为我军空警2000大型预警机的载机平台。", "目前,伊尔-76是我军唯一的真正意义上的现役大型运输机。", "以上就是在Android中关于InstanceState保存数据和恢复数据的过程,在这里我想再重复一遍:onSaveInstanceState()和onRestoreInstanceState()机制来保存数据时,它仅在非用户显式的指令杀死应用程序时保存和恢复数据。我们可以使用它在我们的程序中来保存数据,可以作为保存数据的一种方式,但在使用过程中需要注意其使用原理和方法。" }; }
public class listFragment extends ListFragment { boolean dualPane; //是否在一屏上同时显示列表和详细内容 int curCheckPosition=0; //当前选择的索引位置 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_checked,Data.TITLE)); //为列表设置适配器 //获取布局文件中添加的FrameLayout帧布局管理器 View detailFrame=getActivity().findViewById(R.id.detail); dualPane=detailFrame!=null&& detailFrame.getVisibility()==View.VISIBLE; //判断是否在已个屏幕上同时显示列表和详细内容 if (dualPane){ getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);//设置列表为单选模式 showDetails(curCheckPosition); //显示详细内容 } } //重写onSaveInstanceState()方法,保存当前选中的列表项的索引值 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("curChoice",curCheckPosition); } @Override public void onListItemClick(ListView l, View v, int position, long id) { showDetails(position); } void showDetails(int index){ curCheckPosition=index; //更新保存当前索引位置的变量的值为当前选中值 if(dualPane){ getListView().setItemChecked(index,true);//设置选中列表项为选中状态 DetailFragment details=(DetailFragment)getFragmentManager() .findFragmentById(R.id.detail);//设置用于显示详情内容的Fragment if (details==null||details.getShownIndex()!=index){ //创建一个新的DetailFragment实列,用于显示当前选中项对应的详细内容 details=DetailFragment.newInstance(index); //要在activity中管理Fragment,需要使用FragmentManager FragmentTransaction ft=getFragmentManager().beginTransaction();//获得一个FragmentTransaction的实列 ft.replace(R.id.detail,details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置转换效果 ft.commit(); //提交事务 } }else{ //在一个屏幕上值能显示列表或详细内容中的一个内容时 //使用一个新的Activity显示详细内容 Intent intent=new Intent(getActivity(),MainActivity.DetailActivity.class); //创建一个Intent对象 intent.putExtra("index",index); startActivity(intent); } } }
public class DetailFragment extends Fragment { //创建一个DetailFragment的新实列,其中包括要传递的数据包 public static DetailFragment newInstance(int index){ DetailFragment fragment=new DetailFragment(); //将index作为一个参数传递 Bundle bundle=new Bundle(); bundle.putInt("index",index); fragment.setArguments(bundle); //将bundle对象作为Fragment的参数保存 return fragment; } public int getShownIndex(){ return getArguments().getInt("index",0); //获取要显示的列表项索引,0是默认值 } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(container==null){ return null; } ScrollView scrollView=new ScrollView(getActivity()); //创建一个滚动的视图 TextView textView=new TextView(getActivity()); //创建一个文本框对象 textView.setPadding(10,10,10,10); //设置内边距 scrollView.addView(textView); textView.setText(Data.DETAIL[getShownIndex()]); return scrollView; } }
//创建一个继承Activivtyd的内部类,用于在手机界面中通过Activity显示详细内容 public static class DetailActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //判断是否为横屏,如果为横屏,则结束当前Activity,准备使用Fragment显示详细内容 if(getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE){ finish(); return; } if(savedInstanceState==null){ //在初始化是插入一个显示详细内容的Fragment DetailFragment details=new DetailFragment(); //实列化DetailFragment的对象 details.setArguments(getIntent().getExtras()); //设置要传递的参数 getFragmentManager().beginTransaction() .add(android.R.id.content,details).commit(); //添加一个显示详细内容的Fragment } } }
在AndroidManifest.xml 中为DetailActivity配置。
<activity
android:name=".MainActivity$DetailActivity"
android:label="详细内容"></activity>