框架学习七-2:ViewPager+Fragment之Fragment深入介绍

本文深入探讨了Android中Fragment的常用API及其在管理回退栈时的关键概念,包括FragmentTransaction的方法、如何添加Fragment到回退栈、运行时配置变化的处理策略以及Fragment与ActionBar、MenuItem的集成方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、常用API
Fragment常用三个类:Fragment(主要用于定义Fragment)、FragmentManager(主要用于在Activity中操作Fragment)、FragmentTransaction(保证一系列Fragment操作的原子性)。

FragmentTransaction的常用方法

1、add()

向activity中添加一个Fragment

2、remove()

从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁,它的生命周期也就结束了。

3、replace()

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

4、hide()

隐藏Fragment,仅仅设为不可见,并不会销毁。

5、show()

显示之前隐藏的Fragment。

6、detach()

将此Fragmen从Activity中分离,会销毁其布局,但不会销毁该实例。

7、attach()

将从Activity中分离的Fragment,重新关联到Activity,重新创建其视图层次。

注意:一定要弄清多会该销毁视图,多会该销毁实例,多会该隐藏。

比如:在FragmentA中的EditText添加了一些数据,当切换到FragmentB时,如果希望A还能看到数据,则适合用hide和show。

二、管理回退栈
1、是什么

类似与Android系统为Activity维护一个回退栈,我们可通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。如果你将Fragment添加到回退栈,当用户点击后退按钮时,将看到上一次保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。

2、怎么用

添加一个Fragment事务到回退栈:Fragment Transaction.addToBackStack(String);

3、后遗症

replace()后,将当前Fragment事务添加到回退栈,该Fragment实例不会销毁,只会销毁其视图层。

三、处理运行时配置发生变化
1、运行时配置多会会变化

当屏幕方向发生变化或当你的应用被置于后台,长时间没有返回的时候,你的应用也会被重新启动。

2、变化了会出现什么现象

会出现fragment重叠的现象。

3、怎么解决

1)通过检查onCreate()的参数Bundle savedInstanceState就可判断,是否发生当前activity的重建。

默认的savedInstanceState会存储一些数据,包括Fragment的实例。所以,加上savedInstanceState==null即可解决。

public class MainActivity extends Activity{  
    private static final String TAG = "FragmentOne";  
    private FragmentOne mFOne;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);  
  
        Log.e(TAG, savedInstanceState+"");  
          
        <span style="color:#ff0000;">if(savedInstanceState == null){</span>  
            mFOne = new FragmentOne();  
            FragmentManager fm = getFragmentManager();  
            FragmentTransaction tx = fm.beginTransaction();  
            tx.add(R.id.id_content, mFOne, "ONE");  
            tx.commit();  
        }   
    }  
}  
2)这样无论进行多少次旋转都只会有一个Fragment实例在Activity中。现在还存在一个问题,就是重新绘制时,Fragment发生重建,原本的数据如何保持?

其实和Activity类似,Fragment也有onSaveInstanceState(),在此方法中进行保存数据,然后在onCreate()或onCreateView()或onActivityCreated()进行恢复。

四、使用Fragment创建对话框

http://blog.youkuaiyun.com/lmj623565791/article/details/37815413

五、Fragment与ActionBar、MenuItem集成

Fragment可以添加自己的MenuItem到Activity的ActionBar或者可选菜单中。

步骤:

1、在Fragment的onCreate()中调用setHasOptionsMenu(true);

2、在Fragment子类中实现onCreateOptionsMenu();

3、如果希望在Fragment中处理MenuItem的点击,也可实现onOptionsItemSelected;当然Activity也可直接处理该MenuItem的点击事件。

  1. //如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx  
  2.             return super.onOptionsItemSelected(item);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值