文档章节

Fragment(碎片)

 梦想家Peng
发布于 2016/03/04 10:59
字数 1100
阅读 30
收藏 0

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<Button> btnList=new ArrayList<Button>();
    
    //放四个fragment
    Fragment[] fragments=new Fragment[4];
    /**
     * 当前显示的是第几个fragment
     */
    int currentFragmentIndex=0;
    int clickIndex=0;
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    int orientation=    newConfig.orientation;
    LogUtil.i("屏幕方向", "activity onConfigurationChanged"+orientation);

        super.onConfigurationChanged(newConfig);
    }
    @Override
    protected void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub
        super.onCreate(arg0);
        try {
            LogUtil.i("屏幕方向", "activity onCreate");
            sportFragment=new SportFragment();
            discoverFragment=new DiscoverFragment();
            messageFragment=new MessageFragment();
            meFragment=new MeFragment();
            
            fragments[0]=sportFragment;
            fragments[1]=discoverFragment;
            fragments[2]=messageFragment;
            fragments[3]=meFragment;
            
            FragmentManager manager=this.getSupportFragmentManager();
            //Transaction事务
            FragmentTransaction transaction=manager.beginTransaction();
            //把sportFragment放到linearLayout
            transaction.add(R.id.fragment_container, sportFragment);
            transaction.show(sportFragment);
            //提交
            transaction.commit();
            
            
        } catch (Exception e) {
            ExceptionUtil.handlerException(e);
        }
    }
    //代码执行顺序 onCreate-->ViewsById-->AfterView
    @AfterViews
    public void addListener()
    {
        //设置当前按钮的状态
        btnList.get(currentFragmentIndex).setSelected(true);
        
        MyListener myListener=new MyListener();
        for (Button btn:btnList)
        {
            btn.setOnClickListener(myListener);
        }
    }
    class MyListener implements OnClickListener
    {

        @Override
        public void onClick(View v) {
            
            try {
                switch (v.getId()) {
                case R.id.btn_main_fragment_sport:
                    clickIndex=0;
                    break;
                case R.id.btn_main_fragment_discover:
                    clickIndex=1;
                    break;
                case R.id.btn_main_fragment_message:
                    clickIndex=2;
                    break;
                case R.id.btn_main_fragment_me:
                    clickIndex=3;
                    break;
                }
                if (clickIndex!=currentFragmentIndex)
                {
                    //单击别的按钮,显示另外一个fragment
                    Fragment showFragment=fragments[clickIndex];
                    FragmentTransaction transaction=getSupportFragmentManager().beginTransaction();
                    if (!showFragment.isAdded())
                    {
                        //以前没有显示过
                        transaction.add(R.id.fragment_container, showFragment);                        
                    }
                    transaction.hide(fragments[currentFragmentIndex]);
                    transaction.show(showFragment);
                    transaction.commit();
                    btnList.get(currentFragmentIndex).setSelected(false);
                    btnList.get(clickIndex).setSelected(true);
                    
                    currentFragmentIndex=clickIndex;
                    
                }
            } catch (Exception e) {
                ExceptionUtil.handlerException(e);
            }
        }
        
    }
}


© 著作权归作者所有

共有 人打赏支持
上一篇: 百度地图
下一篇: ViewPager
粉丝 0
博文 34
码字总数 15605
作品 0
深圳
私信 提问
Android第四十二天

1、Fragment的简单使用 <1>Fragment:在Activity中使用的碎片,有自己的布局、生命周期和输入事件 <2>使用Fragment的步骤 (1)创建类,并继承Fragment; (2)重写Fragment的onCreateView()生...

黄晓磊
2016/07/26
20
0
Android碎片化Fragment实例一

一:内容概览 我们再android中所说的碎片化也就是针对不同设备的屏幕大小设计不同的适配方案所说的词语。一般而言我们就是在开发时针对不同屏幕分辨率的设备适配UI,比如手机和平板。在本小节...

sinat_38321889
2017/12/26
0
0
Android4.0-Fragment框架实现方式剖析

经过反复的学习对比,个人觉得带着问题学习新知是最有效的学习方式,因此文本就以提问的方式来讲述Fragment框架实现方式。 1、什么是Fragment? Fragment包含在Activity中,Fragment只能存在...

Carbenson
2015/09/10
546
0
Android4.0-Fragment框架实现方式剖析(一)

经过反复的学习对比,个人觉得带着问题学习新知是最有效的学习方式,因此文本就以提问的方式来讲述Fragment框架实现方式。 1、什么是Fragment? Fragment包含在Activity中,Fragment只能存在...

程序袁_绪龙
2015/07/07
0
0
JavaScript 模板引擎--fragment.js

Fragment.js 允许你加载 html 碎片到任何元素中,只需要使用 data-fragment 属性。 <div data-fragment="fragment.html"></div> 也可通过 JSON 进行加载,如: <div data-fragment-json="fra......

匿名
2013/03/24
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
2
0
微信网页授权获取用户信息(ThinkPHP5)+ 微信发送客服消息(一)

以thinkphp5为实例,创建控制器 class Kf extends Controller { /** * [protected description]微信公众号appid * @var [type] */ protected $appid = "xxxxxxxxxxxxxxx"; /** * [protected......

半缘修道半缘君丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部