Fragment的运用实列

  运用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>


新建一个Date类用来保存要显示的数据

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()机制来保存数据时,它仅在非用户显式的指令杀死应用程序时保存和恢复数据。我们可以使用它在我们的程序中来保存数据,可以作为保存数据的一种方式,但在使用过程中需要注意其使用原理和方法。"

    };
}


创建一个listFrament

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);
        }
    }
}

创建一个DetailFragment用来显示详细内容

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;

    }
}

在默认创建的MainActivity中创建一个内部类。

//创建一个继承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>



你可能感兴趣的:(android,Fragment,应用程序)