Fragment

Fragment 翻译为“片段”。像是Activity的一部分,使用也和activity类似,有自己的布局文件,生命周期。典型应用在大屏幕设备上,左边一个fragment展示联系人列表,右边一个fragment展示对话框,好处是可以随意切换联系人进行聊天。还有就是手机这种小屏幕上,点击下面的导航栏按钮,展示不同的板块内容,其实切换的是不同的fragment,而不是activity。

如何使用:

1. 创建fragment的布局文件

2. 创建fragment类,继承fragment,重写onCreateView方法,用inflate方法加载布局文件。

 
public class FragmentTest extends Fragment{
	@Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)  
    {  
        return inflater.inflate(R.layout.fragment_layout, container, false);  
    }  
}

3. 在Activity布局文件中用<fragment  android:name = "包名.fragment类名" />标签,将fragment放入activity

这样fragment就放到activity中了,所有fragment中控件的逻辑都应放到fragment类中。Activity只是一个展示的作用。

动态改变Fragment:

在Activity布局文件中写死了<fragment>, 这种方式会固定显示在那里。如何做到点击不同的按钮来切换不同的Fragment呢?

1. 在Activity布局文件中放一个空的FrameLayout标签,这里边用于动态存放Fragment.

2. 监听事件:

public class MainActivity extends AppCompatActivity {

    private TextView t1;
    private TextView t2;
    private FragmentManager fmanager;
    private NewsFragment nfrag;
    private FindFragment ffrag;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        t1 = (TextView) findViewById(R.id.t1);
        t2 = (TextView) findViewById(R.id.t2);
        //监听两个TextView控件
        t1.setOnClickListener(new NavigatListener());
        t2.setOnClickListener(new NavigatListener());

        nfrag = new NewsFragment();
        ffrag = new FindFragment();

        //设置默认显示的fragment
        fmanager = getFragmentManager();//获得一个FragmentManager对象
        FragmentTransaction ftransaction = fmanager.beginTransaction();//开始一个事务并返回该事务对象
        ftransaction.replace(R.id.main_framlayout,nfrag);//将制定容器组建放入指定Fragment
        ftransaction.commit();//提交该事务
    }
    //定义监听器
    class NavigatListener implements View.OnClickListener {
        @Override

        public void onClick(View v) {
            FragmentTransaction ft =fmanager.beginTransaction();
            switch (v.getId()){
                case R.id.t1:
                    ft.replace(R.id.main_framlayout, nfrag);
                    break;
                case R.id.t2:
                    ft.replace(R.id.main_framlayout, ffrag);
                    break;
            }
            ft.commit();
        }
    }
}

常用方法:

第一步获取FragmentManager对象:getFragmentManager();

第二步获取FragmentTransaction对象:beginTransaction();

FragmentTransaction常用方法:

add()

往Activity中添加一个Fragment

remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

replace()

使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

show()

显示之前隐藏的Fragment

detach()

会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

attach()

重建view视图,附加到UI上并显示。

transatcion.commit()

提交一个事务


注意:

android.v4 和android.app下都有FragmentManager区别是v4是为了向下兼容,支持低版本,app包是支持安卓3.0以上版本

一个FragmentTrasaction对象只能commit一次;

fragment生命周期方法是被包含它的activity的FragmentManager所调用,所以都是public的。而activity的生命周期方法是操作系统调用,都是protected的.

FragmentManager.add()方法调用时,会调用Fragment实例的onAttach(),onCreate(),onCreateView()方法


什么是回退栈:

上面的例子代码中并没有应用回退栈,当发生点击事件,FrameLayout从一个Fragment切换到另一个Fragment后点击后退,会直接退出Activity.

如果在切换第二个Fragment之前把事务添加到回退栈中,再切换到第二个Fragment,此时我们再点击后退按钮,并不会直接退出Activity,而是回到第一个Fragment。相当于一次弹栈。方法:FragmentTransaction.addToBackStack(null);






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值