博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fragment(碎片)
阅读量:6927 次
发布时间:2019-06-27

本文共 8915 字,大约阅读时间需要 29 分钟。

hot3.png

Fragment表示“碎片”,它的设计理念是将Activity划分为不同的区块,各区块可以是某个控件,也可以是由Fragment实现显示的部分。

【基本特性】
1. 可以在布局中添加某个容器承载Fragment,具体的显示内容由Fragment实现
2. Fragment可以被附加到容器中,也可以被其它Fragment替换,也可以被从容器中移除,无论是哪种操作,对于Fragment的宿主Activity及该Activity中其它的部分不会产生影响
3. Fragment有独立的生命周期
【创建流程】
1. 自定义View,继承android.support.v4.app.Fragment
2. 重写onCreateView()方法,确定需要显示的内容的View对象,并作为该方法的返回值
【使用ViewPager+Fragment】
1. 将Activity类修改为继承自FragmentActivity
2. 自定义类,继承android.support.v4.app.FragmentPagerAdapter,并重写抽象方法
3. 在自定义的FragmentPagerAdapter中定义构造方法时,需要FragmentManager对象,可以通过调用getSupportFragmentManager()方法获取
4. 在自定义的FragmentPagerAdapter中的getItem()方法中,根据参数position创建不同的Fragment对象。
【注意事项】
1. 由于Fragment不是Context的子孙类,在Fragment中需要Context对象时,应该通过调用getActivity()获取其宿主Activity的对象,用于表示上下文对象

public class MainActivity extends FragmentActivity {    // 按钮:团购    private Button btnMenuDeal;    // 按钮:附近    private Button btnMenuNearby;    // 按钮:我的    private Button btnMenuMy;    // 按钮:更多    private Button btnMenuMore;    // Fragment容器    private FrameLayout flContainer;    // Fragment的Adapter    private FragmentPagerAdapter fragmentAdapter;    // 上次显示的Fragment的position,用于显示新Fragment时,把旧的移除    private int lastPosition;    // 上次显示的Fragment对象,用于显示新Fragment时,把旧的移除    private Object lastItem;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                // 初始化底部菜单的4个按钮        btnMenuDeal = (Button) findViewById(R.id.btn_menu_deal);        btnMenuNearby = (Button) findViewById(R.id.btn_menu_nearby);        btnMenuMy = (Button) findViewById(R.id.btn_menu_my);        btnMenuMore = (Button) findViewById(R.id.btn_menu_more);        // 为底部菜单的4个按钮配置点击监听        MenuButtonOnClickListener listener = new MenuButtonOnClickListener();        btnMenuDeal.setOnClickListener(listener);        btnMenuNearby.setOnClickListener(listener);        btnMenuMy.setOnClickListener(listener);        btnMenuMore.setOnClickListener(listener);        // 初始化Fragment容器:FrameLayout        flContainer = (FrameLayout) findViewById(R.id.fl_container);        // 为Fragment容器配置Adapter(仅当使用ViewPager作为容器时使用)        fragmentAdapter = new InnerPagerAdapter();        // flContainer.setAdapter(adapter);                // 默认选中第1个        selectMenuItem(btnMenuDeal);        // 手动执行监听器,以触发显示第1个Fragment        listener.onClick(btnMenuDeal);    }        private class InnerPagerAdapter extends FragmentPagerAdapter {        public InnerPagerAdapter() {            super(getSupportFragmentManager());        }        @Override        public Fragment getItem(int position) {            Fragment fragment = null;            switch (position) {            case 0:                fragment = new DealFragment();                break;            case 1:                fragment = new NearByFragment();                break;            case 2:                fragment = new MyFragment();                break;            case 3:                fragment = new MoreFragment();                break;            }            return fragment;        }        @Override        public int getCount() {            return 4;        }            }        /**     * Tab菜单点击事件监听器     */    private class MenuButtonOnClickListener implements View.OnClickListener {        @Override        public void onClick(View v) {            int position = 0;            switch (v.getId()) {            case R.id.btn_menu_deal:                position = 0;                selectMenuItem(btnMenuDeal);                break;                            case R.id.btn_menu_nearby:                position = 1;                selectMenuItem(btnMenuNearby);                break;                            case R.id.btn_menu_my:                position = 2;                selectMenuItem(btnMenuMy);                break;                            case R.id.btn_menu_more:                position = 3;                selectMenuItem(btnMenuMore);                break;            }                        // 如果已经显示了Fragment,则从容器中移除            if(lastItem != null) {                fragmentAdapter.destroyItem(flContainer, lastPosition, lastItem);            }            // 确定当前需要被显示的Fragment对象            Object fragment = fragmentAdapter.instantiateItem(flContainer, position);            // 记录下当前显示的Fragment的position            lastPosition = position;            // 记录下当前显示的Fragment            lastItem = fragment;            // 设置当前显示的Fragment            fragmentAdapter.setPrimaryItem(flContainer, 0, fragment);            // 更新显示            fragmentAdapter.finishUpdate(flContainer);        }            }            /**     * 选择底部菜单中的某一项     * @param v 被选中的项     */    private void selectMenuItem(View v) {        // 实现基本思路是选中1个,取消选中3个        // 具体实现时,可以先取消选中所有,然后选中1个        // 取消选中所有        btnMenuDeal.setSelected(false);        btnMenuNearby.setSelected(false);        btnMenuMy.setSelected(false);        btnMenuMore.setSelected(false);        // 选中参数对应的控件        v.setSelected(true);    }}

另一种方法实现fragment之间的切换:

@EActivity(resName="main_fragment")public class MainFragmentActivity extends FragmentActivity{    SportFragment sportFragment;    DiscoverFragment discoverFragment;    MessageFragment messageFragment;    MeFragment meFragment;        @ViewsById({R.id.btn_main_fragment_sport,    R.id.btn_main_fragment_discover,    R.id.btn_main_fragment_message,    R.id.btn_main_fragment_me})    ArrayList

转载于:https://my.oschina.net/dreamerspace/blog/630853

你可能感兴趣的文章
Atitit. Ati IDE 开发平台的第一版规划
查看>>
总结oninput、onchange与onpropertychange事件的用法和区别
查看>>
【Android】12.6 利用Intent实现记事本功能(NotePad)
查看>>
php将文件转换成二进制输出[转]
查看>>
微信JS SDK Demo
查看>>
base64编码、解码的C语言实现
查看>>
HTML5中Access-Control-Allow-Origin解决跨域问题
查看>>
android: 服务的生命周期
查看>>
JBoss7安装、测试、配置和启动以及停止,部署
查看>>
[备忘]Redis运行出现Client sent AUTH, but no password is set
查看>>
PHP判断远程文件是否存在
查看>>
函数传递一维数组
查看>>
WebComponent魔法堂:深究Custom Element 之 从过去看现在
查看>>
Picard 法求方程根
查看>>
c语言中有bool型变量吗?
查看>>
Null值的使用
查看>>
《程序设计与数据结构》 课程教学
查看>>
注册asp.net
查看>>
java.net.ProtocolException: Exceeded stated content-length of: '13824' bytes
查看>>
详解Spring事件驱动模型
查看>>