android开发杂记(一)

   

--  Activity 中使用 Tablayout +  ViewPager 装填Fragment的问题

   在Fragment 较少并且内容各不相同的情况下,可以分别创建不同的Fragment,配合ViewPager使用不会存在问题。

   但如果Fragment数量不定,并且内容格式相同,就要使用同一种Fragment,复用里面的布局。但这个时候就会存在问题,加载好数据,填入

  ViewPager 和 TabLayout的列表后,界面上的效果只有Tab 是正常显示,点击Tab时,Fragment却不是对应的,会出现空白 和 错位 的情况;

   - 问题原因:

    在使用ViewPager时,要使用 FragmentPagerAdapter ,其中要传入一个 FragmentManager 参数,在Activity中,我们能方便地传入的,只有

   getSupportFragmentManager() , (因为现在都是用 v4包的Fragment,app包的fragment 以及对应的 getFragmentManger()已经被弃用),

   这个FragmentManager存在的问题就是,他会自动地复用Fragment,避免反复创建、销毁,但这样,就会导致我们不同Tab对应的Fragment,

   没有被成功创建,而是不停地被后面创建的覆盖。

扫描二维码关注公众号,回复: 6838968 查看本文章

    因为ViewPager默认的预加载是3个Fragment,所以当点击Tab第四次时,又不会空白而是加载出一个不一定正确的Fragment。

   -解决方案:

    (1)第一种情况是,Activity中使用ViewPager

      不使用ViewPager, 只使用TabLayout保存标题的分类,ViewPager的位置只放一个Fragment,然后对TabLayout设置监听,

      tabLayout.addOnSelectedListener(), 在选择的时,获取Tab的位置信息,然后由位置信息将数据加载或替换到唯一的Fragment中。

    

    (2)另一种情况,是 Fragment 嵌套 ViewPager ,常见于外层Fragment搭配 BottomNavigationView ,形成上下两层多选界面

      在外层Fragment 中给ViewPager设置 PagerAdapter时,可以使用 getChildFragmentManager(), 这种Manger不会令内层Fragment复用

      也就不会出现空白和错位的问题了。 (还未使用过)

--  顶部工具栏浸入状态栏,铺满屏幕顶部

  

  要实现效果,只要在 styles.xml 中对应主题下添加一句话

--  EditText 点开界面时不自动获取焦点,在点击外部时自动失去焦点

   如果不设置的话,EditText会在进入界面时自动获得焦点,在点击界面其他位置时,软键盘也不收回,体验糟糕

    (1),首先设置不自动获取焦点,在EditText的父布局中添加   focusableInTouchMode = "true"

  

    (2)点击外部时令EditText失去焦点,收回软键盘

      做法是监听点击事件,如果点在EditText 外部,就让其失去焦点

  

      这样体验就有所好转了。

--    解开锁屏时弹出界面的猜想

    有时在指纹解锁后,会弹出京东的界面,点击回退键,回到主界面,再点击京东时,还是之前出现的界面,但是再次点击回退,就会退出京东,

    回到主界面,再一次点京东,就会按正常流程启动。

     结合《Android开发艺术探索》第一章的内容,猜测是京东使用其他运行中的进程启动自己的Activity,

    这时Activity运行在其他进程的任务栈中,当第一次点击京东时,该Activity发现自己本应属于的任务栈启动了,就移动到京东进程的任务栈,

    再次退回主界面,Actvity和任务栈被销毁。

    (近期没使用京东,有机会再研究)

  

--    Activity的启动模式

    - standard ,标准模式,点一下启动一个,无脑入栈

    - singleTop   栈顶复用, 

      如果当前不在栈顶,就创建新实例入栈,和standard表现一致。 

      如果当前活动在栈顶,就不重复创建而调用 onNewIntent()。

      (示例为将 BetaActivity设为 singleTop ,反复启动二三活动 以及重复启动BetaActivity时, 用adb shell 命令看到的栈信息)

     BetaActivity不在栈顶的情况:会和ThirdActivity交替反复创建实例

    BetaActivity在栈顶的情况: 不再创建新实例,栈中活动数不变

 

    -  singleTask  栈内复用

    如果栈内有需要的活动,就将其显示出来。而要显示,就要把在其之上的活动全部出栈。

    需要注意的是,如果两个任务栈分别在前台和后台,当启动后台的活动时,后台任务栈会移动到前台栈之前,成为前台任务栈,而栈中的弹出关系,也遵循

    前面说过的规则。

    -  singleInstance 单例模式

    单独在一个任务栈内,栈中只能有自己一个实例。(实际上也符合singleTask的特征)

    

猜你喜欢

转载自www.cnblogs.com/xfdmyghdx/p/11216991.html