Android学习整理 -1- Fragment 学习

2017-03-03  本文已影响280人  minminaya

Android学习整理 - 系列


经过一年多的Android的学习,最近越来越感觉到了瓶颈,所以打算整理一下学习Android Fragment找到的各种资料,博客,还有大牛们的笔记等等

从图解分析Fragment的生命周期

Fragment生命周期.png

图解说明

一张关于Activity Fragment的周期图

Fragment生命周期.jpg

Fragment是否很完美

因为Fragment是由FragmentManager来管理,每一个Activity有一个FragmentManager,管理着一个Fragment的栈,Activity是系统级别的,由系统来管理ActivityManager,栈也是系统范围的。而Fragment则是每个Activity范围内的,所以在使用Fragment的时候也有几点要注意。

这个跟第一点差不多。就好比系统会缓存Activity的实例一样,FragmentManager也会缓存Fragment实例,以方便和加速再次显示。

Fragment在显示和退出时会走一遍完整的生命周期。此外,正在显示时,就跟Activity的一样,Activity被onPause,里面的Fragment就onPause,以此类推,由此带来的问题就是,比如你在onStart()里面做了一些事情,那么,当宿主Activity被挡住,又出现时(比如接了个电话),Fragment的onStart也会被高到,所以你要想到,这些生命周期不单单在显示和退出时会走到。

这个问题出现在有Fragment栈的时候,也就是说每个Fragment不知道自己是否真的对用户可见。比如现在是Fragment A,又在其上面显示了Fragment B,当B显示后,A并不知道自己上面还有一个,也不知道自己对用户不可见了,同样再有一个C,B也不知。C退出后,B依然不知自己已在栈顶,对用户可见,B退后,A也不知。也就是说Fragment显示或者退出,栈里的其他Fragment无法感知。这点就不如Activity,a被b盖住后,a会走到onStop(),同样c显示后,b也能通过onStop()感知。Fragment可以从FragmentManager监听BackStackState的变化,但它只告诉你Stack变了,不告诉你是多了,还是少,还有你处的位置。有一个解决方案就是,记录页面的Path深度,再跟Fragment所在的Stack深度来比较,如果一致,那么这个Fragment就在栈顶。因为每个页面的Path深度是固定的,而Stack深度是不变化的,所以这个能准确的判断Fragment是否对用户可见,当然,这个仅针对整个页面有效,对于布局中的一个区域是无效的。

Fragment以及它的宿主Activity的复用

鸿洋博客中的一个Fragment例子,例子突出在 复用

  public class ContentFragment extends Fragment  
    {  
        private String mArgument;///Activity传递的数据(值)
        public static final String ARGUMENT = "argument";///Activity传递的数据名(键)  
        public static final String RESPONSE = "response";///Activity

        @Override  
        public void onCreate(Bundle savedInstanceState)  
        {  
            super.onCreate(savedInstanceState);  
            Bundle bundle = getArguments();  
            if (bundle != null)  
            {  
                mArgument = bundle.getString(ARGUMENT);  
                Intent intent = new Intent();  
                intent.putExtra(RESPONSE, "good");  
                getActivity().setResult(ListTitleFragment.REQUEST_DETAIL, intent);  
            }  

        }  
        ////在实例化时获取Activity传入的值(这里示例为String类型)
        public static ContentFragment newInstance(String argument)  
        {  
            Bundle bundle = new Bundle();  
            bundle.putString(ARGUMENT, argument);  
            ContentFragment contentFragment = new ContentFragment();  
            contentFragment.setArguments(bundle);  
            return contentFragment;  
        }  

        @Override  
        public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                Bundle savedInstanceState)  
        {  
            Random random = new Random();  
            TextView tv = new TextView(getActivity());  
            ///.........
            return tv;  
        }  
    }
public abstract class SingleFragmentActivity extends FragmentActivity  {  
    protected abstract Fragment createFragment();  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_single_fragment);  
        FragmentManager fm = getSupportFragmentManager();  
        Fragment fragment =fm.findFragmentById(R.id.id_fragment_container);  
        if(fragment == null )  
        {  
            fragment = createFragment() ;  
            fm.beginTransaction().add(R.id.id_fragment_container,fragment).commit();  
        }  
    }  
}

感谢阅读

上一篇下一篇

猜你喜欢

热点阅读