android重要技术,Android技术专家

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

5ddf43f424cc6.png!v1

Fragment的生命周期

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:

5ddf43f4d5b62.png!v1

可以看到Fragment比Activity多了几个额外的生命周期回调方法:

onAttach(Activity)

当Fragment与Activity发生关联时调用。

onCreateView(LayoutInflater, ViewGroup,Bundle)

创建该Fragment的视图

onActivityCreated(Bundle)

当Activity的onCreate方法返回时调用

onDestoryView()

与onCreateView想对应,当该Fragment的视图被移除时调用

onDetach()

与onAttach相对应,当Fragment与Activity关联被取消时调用

注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现,

Fragment家族常用的API

Fragment常用的三个类:android.app.Fragment 主要用于定义Fragment

android.app.FragmentManager 主要用于在Activity中操作Fragment

android.app.FragmentTransaction 保证一些列Fragment操作的原子性,熟悉事务这个词,一定能明白~

a、获取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操作都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

transaction.add() // 往Activity中添加一个Fragment

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

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

transaction.hide() // 隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show() // 显示之前隐藏的Fragment

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

attach() // 重建view视图,附加到UI上并显示。

transatcion.commit()//提交一个事务

注意:常用Fragment的哥们,可能会经常遇到这样Activity状态不一致:State loss这样的错误。主要是因为:commit方法一定要在Activity.onSaveInstance()之前调用。

上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。

值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

FragmentTransaction.addToBackStack(String)replace是remove和add的合体,并且如果不添加事务到回退栈,前一个Fragment实例会被销毁。

这里很明显,我们调用tx.addToBackStack(null);将当前的事务添加到了回退栈,所以FragmentOne实例不会被销毁,

但是视图层次依然会被销毁,即会调用onDestoryView和onCreateView,

证据就是:仔细看上面的效果图,我们在跳转前在文本框输入的内容,在用户Back得到第一个界面的时候不见了。

Fragment与Activity通信

因为所有的Fragment都是依附于Activity的,所以通信起来并不复杂,大概归纳为:a、如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法

b、如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。

。 Fragment fragment1 = getSupportFragmentManager().findFragmentByTag(“content”);

。 Fragment fragment2 = getSupportFragmentManager().findFragmentById(R.id.id_content);

c、在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

// 方式一:

public interface FOneBtnClickListener{

void onFOneBtnClick();

}

// Activity 需要 implement FOneBtnClickListener

// 但无需 setFOneBtnClickListener()

if (getActivity() instanceof FOneBtnClickListener){

((FOneBtnClickListener) getActivity()).onFOneBtnClick();

}

// 方式二:

public interface FTwoBtnClickListener{

void onFTwoBtnClick();

}

// Activity 需要 implement FTwoBtnClickListener

Activity.setFTwoBtnClickListener(this);

if(Fragment.FTwoBtnClickListener != null){

Fragment.FTwoBtnClickListener.onFTwoBtnClick();

}

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值