zoukankan      html  css  js  c++  java
  • [转]Android Fragment的琐事

    [转自]http://blog.csdn.net/lidhsr/article/details/7765779

    记录一点关于Fragment的琐事,給自己查阅

    ==================================================

    在3.0以下的api里使用Fragment要导入jar包,包在D:\android-sdk\extras\android\support\v4这位置

    在eclipse要建立一个libs文件夹,将jar包放入再Add to Build Path,不然启动会提示Class Not Found

    ==================================================

    Fragement有一个堆栈是交给activity管理,用户模拟后退时使用getFragmentManager().popBackStack();可以返回到堆栈的最上层

    popBackStack(String , int) 和popBackStack(int , int) 具体使用方法待研究,还未使用

    ==================================================

    Fragment替换和添加使用

    1. // id是要放置的layout,fragment是要显示的fragment  
    2. getFragmentManager().beginTransaction().replace(id, fragment).addToBackStack(null).commit();  

    添加是使用add,replace是替换

    addToBackStack是添加到堆栈中,可以模拟后退返回前一个Fragment

    不调用这个方法,返回的时候不会返回前一个fragment

    每个事务都要调用commit来提交

    每个事务要使用独立的FragmentTransaction(没有经过严谨的测试)

    ==================================================

    Fragment的生命周期

    每次进来都会经过onCreateView这个返回一个view

    如果返回的view里的数据是动态的,那么下次返回的时候将丢失这些数据

    需要对数据持久化

    如果有数据源,如集合等,可以将数据源的初始化放在Fragment 的onCreate时候

    如果是对象,可以保存这个对象,方法很多,onStop,或者获取对象的时候

    ==================================================

    如果在2个Fragment之间互相replace并且addToBackStack,那么返回的时候会多个返回

    这个问题可以利用Fragment本身的堆栈管理处理(具体方法没想到,只有大概思路,待鉴定)

    还可以对Fragment进行标识,replace之前判断此标识

    ==================================================

    多次replace同一个fragment会让页面空白,而且再次返回也无法刷新数据

    要避免多次replace同一个fragment的问题,这样的问题还没去研究是为什么,待解。

    怀疑自己哪里操作失误,或者代码逻辑上有误,待鉴定。

    ==================================================

    当两个Fragment互相replace而都没用调用addToBackStack方法的时候

    每次回到之前一个Fragment的时候,所有数据都将重新加载,Fragment的生命周期重新走一遍

    需要用到上面提到的对数据进行持久化,这个时候不能在Fragment里进行持久化的操作

    ==================================================

    遇到最蛋疼的问题了,UI都用Fragment实现,但现在一个需求,在Fragment中嵌套一个mapView

    只是局部一块map,用mapView需要继承MapActivity,而使用Fragment又必须继承FragmentActivity

    在网上搜了,找到网友大湿的解决之法,但不适用。

    网上的方式还是重新启动了一个MapActivity,而不是在Fragment的局部嵌套了一小块map

    如果有人知道解决之法,还请告知,不甚感激。

    自己想到了其他的解决之法,根据自己的需求制定了几种应对方法,还是挺好的,个人认为比原来嵌套mapView好

    ==================================================

    直接点击返回按钮与调用popBackStack产生的效果有些不一样

    如果Fragment背景透明的,那么调用popBackStack返回的时候,会看到前一页面的内容。

    ==================================================

    如果在Fragment中使用内部类,在内部类中使用Toast或者Dialog时,使用getActivity()有些情况下会取到空

    解决办法,使用handler或者在application中定义context
    ==================================================

    很多时候getActivity获取到的是null,原因未知,J总说是fragment的bug,我信了。

    解决方法:給Fragment构造传参
    ==================================================

    有时候调用replace时,而不想调用addToBackStack

    就是从BFragment replace 到CFramgent而不想保留BFragment,

    从C返回时,有的情况是直接返回到A,有的情况是返回B

    我的处理方法是在B到C的时候,判断B是否要保留,如果不保留,在replase之前调用popBackStack

    还可以在返回的时候处理,是否保留

    每次返回都会重新调用onCreateView方法,这样在这里判断是否保留也可以

    如果有更好的方法,欢迎提供

    ==================================================

  • 相关阅读:
    1、编写一个简单的C++程序
    96. Unique Binary Search Trees
    python 操作redis
    json.loads的一个很有意思的现象
    No changes detected
    leetcode 127 wordladder
    django uwsgi websocket踩坑
    you need to build uWSGI with SSL support to use the websocket handshake api function !!!
    pyinstaller 出现str error
    数据库的读现象
  • 原文地址:https://www.cnblogs.com/wilma/p/3117522.html
Copyright © 2011-2022 走看看