Fragment为什么呈现是不透明的

Fragment为什么呈现是不透明的,第1张

你是说为什么呈现的是半透明的把,你可以在那两个fragment的布局文件中在最外层的layout上加上背景色为纯白色就行了,android:backgronud=“@color/write”.

很高兴为您解答!

有不明白的可以追问!如果您认可我的回答。

请点击下面的【选为满意回答】按钮,谢谢!

Fragment必须总是被嵌入到一个activity之中,并且fragment的生命周期直接接受其宿主activity的生命周期的影响。你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入的事件,并且可以在activity运行时添加或者删除。

应该将每一个fragment设计为模块化和可复用化的activity组件。也就是说,你可以在多个activity中引用同一个fragment,因为fragment定义了它自己的布局,并且使用它本身生命周期回调的行为。

Fragment比Activity多了几个额外的生命周期回调方法

管理fragment生命周期与管理activity生命周期很相像,像activity一样,fragment也有三种状态:

1、Resumed:

fragment在运行中的activity中可见。

2、Paused:

另一个activity处于前台且得到焦点,但是这个fragment所在的activtiy仍然可见(前台activity部分透明,或者没有覆盖全屏)。

3、Stopped:

fragment不可见。要么宿主activity已经停止,要么fragment已经从activity上移除,但已被添加到后台栈中。一个停止的fragment仍然活着(所有的状态和成员信息仍然由系统保留着)。但是,它对于用户来讲已经不再可见,并且如果activity被杀掉,它也将被杀掉。

如果activity的进程被杀掉了,在activity被重新创建时,你恢复fragment状态。可以执行fragment的onSaveIntanceState()来保存状态(注意:fragment是在onCreate(),onCreateView()或者onActivityCreate()中进行恢复)。

在生命周期方面,activity和fragment之间一个很重要的不同就是在各自的后台栈中是如何存储的。当activity停止时,默认情况下activity被安置在由系统管理的activity后台栈中;fragment仅当在一个事务被移除时,通过显式调用addToBackStack()请求保存的实例,该fragment才被置于由宿主activity管理的后台栈。

类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。

如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中d出,用户再次点击后退键,则退出当前Activity。

通过Arguments创建Fragment,不建议通过为Fragment添加带参数的构造函数

1、FragmentPagerAdapter:对于不再需要的fragment,选择调用detach方法,仅销毁视图,并不会销毁fragment实例。

2、FragmentStatePagerAdapter:会销毁不再需要的fragment,当当前事务提交以后,会彻底的将fragment从当前Activity的FragmentManager中移除。

3、懒加载,核心方法是 setUserVisibleHint()

原因1:横竖屏切换,造成Fragment重新实例化。

原因2:按下Home键,Activity处于后台,由于内存不足被销毁,重新唤醒时Fragment重新实例化。

注:出现的原因是在 API24 之前的 v4包 的源码问题,

解决方案:通过检查onCreate的参数Bundle savedInstanceState就可以判断,当前是否发生Activity的重新创建:

默认的savedInstanceState会存储一些数据,只有在savedInstanceState==null时,才进行创建Fragment实例:

实现功能 

1.步骤:

1) 创建一个工程,主布局就先做一个ImageView,自己找个好看的图片做src。 

2) 在Activity重写的onCreate方法中获得窗口视图对象(DecorView) 

3) 设置DecorView的SystemUiVisibility 

4) 设置导航条、状态栏的颜色–>透明 

5) 获取当前Activity的ActionBar并隐藏

2.具体代码和注释:

获取DecorView对象

@Override

protected void onCreate(Bundle savedInstanceState) {

    ...

    View decorView = getWindow().getDecorView()

    ...

}

设置SystemUiVisibility

int option = View.SYSTEM_UI_FLAG_FULLSCREEN // 全屏标记

    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN // 布局全屏标记,避免退出全屏模式时内容被覆盖

    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // 隐藏导航栏标记

    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // 布局隐藏导航栏标记,同理

    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY // 粘性沉浸体验

    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 确保上述标记稳定// 此方法用来设置系统UI的可见性,系统UI包括状态栏、ActionBar、导航栏devorView.setSystemUiVisibility(option)

设置状态栏、导航栏的颜色:

getWindow().setStatusBarColor(Color.TRANSPARENT)// Color.TRANSPARENT = 0 表示#00000000即透明颜色

getWindow().setNavigationBarColor(Color.TRANSPARENT)

获取本页面的ActionBar并隐藏起来

ActionBar actionBar = getSupportActionBar() // 注意:此处用的Activity继承的是

AppCompatActivity(它继承的是FragmentActivity)

// 所以调用的是getSupport...方法,如果继承Activity则直接调用get...方法

assert actionBar != null // 这一句可以不理会,反正我是Ctrl + F1提示出来的,意思其实是判断如果actionBar不为空则向下执行。

actionBar.hide()

注意:最后一点注意事项是:只支持Android API 21以上的手机


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11809711.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存