Days 17 Fragment

1、碎片,可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用
2、Fragment中为空会报错
3、Fragment必须有name属性,其值为Fragment子类的全路径{初始化 activity视图是会调用Fragment组件的name属性对应的Fragment 类中的onCreateView()方法加载对应视图}
4、 必须要有id/tag属性
Days17Fragment01Work
备注:四个方法
1、getResources()返回该应用程序所对应的Resource类对象,无论从哪个Activity中调用都会返回同一个Resource对象
2、getConfiguration() 返回Configuration,Resource的方法,里面包含了很多配置信息,比如屏幕的分辨率、方向、尺寸
3、通过Activity的getFragmentManager()方法获得FragmentManager对象
4、通过FragmentManager对象的findFragmentById()方法获取该布局中的Fragment对象
功能:如果是横屏,则左侧有一个Fragment里设置一个ListView,点击右侧条目后,会左侧的Fragment会显示点击位置的条目所对应的内容;如果是竖屏,则初始界面只有一个Fragment里有一个ListView,点击条目后,会跳转到下一界面,下一界面中的Fragment会显示点击位置的条目所对应的内容
步骤:先在MainActivity中判断是横屏还是竖屏?
初始化Activity视图,
判断为横屏,(注意:只有横屏中有ContentFragment即展示内容的Fragment),然后设置左侧的Fragment即LeftFragment,和右侧的Fragment即ContentFragment,
判断为竖屏,只有一个Fragment即LeftFragment
需要继承Fragment;点击左侧ListView中条目后,回调条目的位置给MainActivity,(MainActivity需要实现回调接口),MainActivity通过ContentFragment是否为空判断横竖屏,
为横屏则直接设置对应条目内容给ContentFragment中的TextView,为竖屏则设置Intent传递position并跳转到ContentActivity中,获取ContentFragment和数据,并根据获得position设置对应条目内容
left.xml中为ListView布局文件
activity_main.xml横屏布局文件

 <fragment
        android:id="@+id/ftLeft"
        android:name="com.phone1000.days17fragment01work.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/hello_world" />

    <fragment
        android:id="@+id/ftRight"
        android:name="com.phone1000.days17fragment01work.ContentFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:text="@string/hello_world" />

activity_main_port.xml竖屏初始界面布局文件

 <fragment
        android:id="@+id/ftLeft"
        android:name="com.phone1000.days17fragment01work.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="@string/hello_world" />

**activity_content.xml**ContentActivity的布局文件

 <fragment
        android:id="@+id/ftContent"
        android:name="com.phone1000.days17fragment01work.ContentFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
public class MainActivity extends Activity implements
        IOnGetListViewItemListener {

    private ContentFragment contentFragment = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /**
         * getResources()返回该应用程序所对应的Resource类对象,无论从哪个Activity中调用,
         * 都会返回同一个Resource对象 Configuration,里面包含了很多配置信息,比如屏幕的分辨率、方向、尺寸
         * 
         * Configuration.ORIENTATION_LANDSCAPE 的值为2,表示是横屏
         * Configuration.ORIENTATION_PORTRAIT 的值为1,表示是竖屏
         */
        // 如果是横屏
        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // 横屏布局包含了两个Fragment(LeftFragment,ContentFragment)的布局
            /**
             * 会初始化MainActivity的视图
             * 会分别调用Fragment组件的name属性对应的Fragment类中的onCreateView()方法加载对应视图
             * 如:(com.phone1000.days17fragment01work.LeftFragment)
             * (com.phone1000.days17fragment01work.ContentFragment)
             */
            setContentView(R.layout.activity_main);

            /**
             * getFragmentManager()是Activity的方法,返回值为FragmentManager
             * findFragmentById()是FragmentManager的方法,返回值为Fragment
             */
            // 只有横屏布局中才有contentFragment,
            // 通过Activity的getFragmentManager()方法获得FragmentManager对象
            // 再通过FragmentManager对象的findFragmentById()方法获取该布局中的ContentFragment对象
            contentFragment = (ContentFragment) getFragmentManager()
                    .findFragmentById(R.id.ftRight);
        } else {
            // 如果是竖屏,仅包含了一个Fragment对象(LeftFragment)
            setContentView(R.layout.activity_main_port);
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    /**
     * 接收LeftFragment中回传的数据position
     */
    @Override
    public void onGetListViewItem(int position) {
        //contentFragment!=null,则为横屏,
        if (contentFragment != null) {
            // 直接设置contentFragment中对应position的内容
            contentFragment.setContent("i am " + position + "item");
        } else {
            //contentFragment == null ,则为竖屏
            //开启新的Activity接收要显示的数据
            Intent intent = new Intent(this, ContentActivity.class);

            //传递position给要显示条目内容Activity
            intent.putExtra("position", position);

            //开启新的Activity
            startActivity(intent);
        }
    }
}
public class LeftFragment extends Fragment {

    /**
     * Fragment的获取视图的方法,该方法的返回值作为当前Fragment的视图内容
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // 将left.xml(包含了一个ListView的相对布局)作为当前Fragment的内容展示
        View v = inflater.inflate(R.layout.left, container, false);

        ListView lvShow = (ListView) v.findViewById(R.id.lvShow);

        // 给当前v中的ListView构建适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_dropdown_item_1line, new String[] {
                        "item0", "item1", "item2", "item3" });

        lvShow.setAdapter(adapter);

        // 给ListView设置条目点击监听
        lvShow.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // 在Fragment中,可以通过getActivity()方法获取**“宿主”**Activity
                Activity activity = getActivity();

                // 判断“宿主”Activity是否是一个IOnGetListViewItemListener回调接口
                // 由于MainActivity是宿主Activity,并且实现了IOnGetListViewItemListener接口
                // 可将其强转为IOnGetListViewItemListener接口
                if (activity instanceof IOnGetListViewItemListener) {
                    IOnGetListViewItemListener listener = (IOnGetListViewItemListener) activity;

                    // 通过IOnGetListViewItemListener接口对象的回调方法,将position回传给MainActivity
                    listener.onGetListViewItem(position);
                }
            }
        });

        return v;
    }
}
public class ContentFragment extends Fragment {

    private TextView txt = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
//       new TextView(Context)要传入一个Context对象
        txt = new TextView(getActivity());

        txt.setText("i am contentFragment");

        return txt;
    }

    public void setContent(String content) {
        txt.setText(content);
    }
}
public class ContentActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //android:name="com.phone1000.days17fragment01work.ContentFragment"
        //设置(只包含了ContentFragment内容的布局)为当前Activity的内容的布局
        setContentView(R.layout.activity_content);

        //获得FragmentManager对象
        FragmentManager manager = getFragmentManager();

        //通过manager的findFragmentById()方法获取ContentFragment对象
        ContentFragment contentFragment = (ContentFragment) manager
                .findFragmentById(R.id.ftContent);

        Intent intent = getIntent();

        int position = intent.getIntExtra("position", 0);

        String content = "展示"+position+"条目内容";

        //给contentFragment对象设置对应position条目的内容
        contentFragment.setContent(content);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.content, menu);
        return true;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值