Fragment 一个简单的全景感受

作者: 颤抖的闪电 | 来源:发表于2017-10-30 15:26 被阅读0次

    前言:常常会忘记一些很基础的知识点,所以把这些个常用却很少从头写到尾的代码知识,做了个简单的从头到尾的简单浏览。需要时看一看,可以帮助加快我们回忆的速度。

    FragmentTransaction 中对Fragment有如下几种操作:

    1,attach(), detach()不是很常用;
    2,add(), remove(),将fragment添加和移除;
    3,show(), hide(),是用来设置fragment的显示和隐藏状态, 这两个方法并不对应fragment的状态变化,只是将view设置为visible和gone,然后调用onHiddenChanged()的回调;
    4,replace()= remove() + add()。

    把Fragment加入Activity

    加载方式1:通过Activity的布局文件将Fragment加入Activity

    其中android:name属性填上你自己创建的fragment的完整类名。

    <fragment 
            android:name="com.example.learningfragment.ExampleFragment"
            android:id="@+id/fragment1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    

    当系统创建这个Activity的布局文件时,系统会实例化每一个fragment,并且调用它们的onCreateView()方法,来获得相应fragment的布局,并将返回值插入fragment标签所在的地方。

    加载方式2:通过编程的方式将Fragment加入到一个ViewGroup中
    FragmentManager fragmentManager = getFragmentManager()
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    ExampleFragment fragment = new ExampleFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
    

    (注,如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager = getSupportFragmentManager();)

    以下是“全景浏览”:

    涉及了fragment和activity的相关代码,一下代码是集成了几篇出色的文章而整理出来的所谓代码例子,甚至可以直接粘贴复制就能用了。

    Fragment:
    /**
     * @desc
     * @auth 方毅超
     * @time 2017/10/30 14:00
     */
    
    public class ExampleFragment extends Fragment {
    
        Bundle savedState;
    
        public ExampleFragment() {
            super();
        }
    
        /**
         * @param isVisibleToUser
         * 注意:setUserVisibleHint()方法是在onCreate()方法、
         * 甚至是onAttach()方法之前调用的,所以它里面不能有任何对Context上下文对象的调用!
         * getUserVisibleHint()返回的变量,是App提供的代表此Fragment当前对于用户是否可见的一个布尔值;
         *
         * setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false
         * 如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true
         * 如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false
         * 总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调
         * 如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个
         */
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            // Restore State Here
            if (!restoreStateFromArguments()) {
                // First Time, Initialize something here
                onFirstTimeLaunched();
            }
        }
    
        /**
         * 第一次加载该类时,需要做的动作
         */
        protected void onFirstTimeLaunched() {
            // TODO: 2017/10/30
    
        }
        //===============必须实现的三个回调函数===============//
    
        /**
         * @param savedInstanceState
         * 系统在创建Fragment的时候调用这个方法,
         * 这里应该初始化相关的组件,
         * 一些即便是被暂停或者被停止时依然需要保留的东西。
         */
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
    
        }
    
        /**
         * @param inflater
         * @param container
         * @param savedInstanceState
         * @return
         * 当第一次绘制Fragment的UI时系统调用这个方法,
         * 必须返回一个View,如果Fragment不提供UI也可以返回null。
         */
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    //        return super.onCreateView(inflater, container, savedInstanceState);
            return inflater.inflate(R.layout.example_fragment_layout, container, false);
        }
    
        /**
         * 当用户离开Fragment时第一个调用这个方法,
         * 需要提交一些变化,因为用户很可能不再返回来。
         */
        @Override
        public void onPause() {
            super.onPause();
        }
    
        //========================保存数据相关=====================//
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            // Save State Here
            saveStateToArguments();
        }
    
        /*onSaveInstanceState中保存数据很简单,
        因为它有Bundle参数,但是onDestroyView没有,那保存在哪里呢?
        答案是能和Fragment一起共存的Argument。
        setArguments方法必须在fragment创建以后,添加给Activity前完成。
        千万不要,首先调用了add,然后设置arguments。*/
        @Override
        public void onDestroyView() {
            super.onDestroyView();
            // Save State Here
            saveStateToArguments();
        }
    
        ////////////////////
        // Don't Touch !!
        ////////////////////
    
        private void saveStateToArguments() {
            if (getView() != null)
                savedState = saveState();
            if (savedState != null) {
                Bundle b = getArguments();
                if (b != null) {
                    b.putBundle("internalSavedViewState8954201239547", savedState);
                }
            }
        }
        //////////////////////////////
        // Save Instance State Here
        //////////////////////////////
    
        private Bundle saveState() {
            Bundle state = new Bundle();
            // For Example
            //state.putString(text, tv1.getText().toString());
            onSaveState(state);
            return state;
        }
    
        /**
         * @param outState 保存该类当前的各种数据状态
         */
        protected void onSaveState(Bundle outState) {
            // TODO: 2017/10/30
            // super.onSaveState(outState);
            // For example:
            //outState.putString(text, tvSample.getText().toString());
        }
        //========================保存数据相关结束=====================//
    
        //========================恢复数据相关=====================//
        ////////////////////
        // Don't Touch !!
        ////////////////////
        private boolean restoreStateFromArguments() {
            Bundle b = getArguments();
            if (b == null) return false;
            savedState = b.getBundle("internalSavedViewState8954201239547");
            if (savedState != null) {
                restoreState();
                return true;
            }
            return false;
        }
    
        /////////////////////////////////
        // Restore Instance State Here
        /////////////////////////////////
        private void restoreState() {
            if (savedState != null) {
                // For Example
                //tv1.setText(savedState.getString(text));
                onRestoreState(savedState);
            }
        }
    
        /**
         * @param savedInstanceState 恢复该类当前的各种数据状态
         */
        protected void onRestoreState(Bundle savedInstanceState) {
            // TODO: 2017/10/30
            // super.onRestoreState(savedInstanceState);
            // For example:
            //tvSample.setText(savedInstanceState.getString(text));
        }
    //========================恢复数据相关结束=====================//
    
    }
    
    fragment的布局文件:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num1"
               />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/num2"
            />  
    </LinearLayout>
    
    主Activity:
    /**
     * @desc
     * @auth 方毅超
     * @time 2017/10/30 14:31
     */
    
    public class ExampleActivity extends FragmentActivity {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_learn_fragment);
    
    
            //在程序中加入Fragment
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
            ExampleFragment fragment = new ExampleFragment();
            fragmentTransaction.add(R.id.linear, fragment);
            fragmentTransaction.commit();
        }
    
    }
    
    Activity的布局文件:
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <Button
            android:id="@+id/btn1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/btn1"      
            />
    
        <fragment 
            android:name="com.example.learningfragment.ExampleFragment"
            android:id="@+id/fragment1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
    
            />
        <Button
            android:id="@+id/btn2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/btn2"      
            />
    
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/linear"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            >
         <Button
            android:id="@+id/btn3"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/btn3"      
            />
         </LinearLayout>
    
    </LinearLayout>
    

    感谢:
    Android中保存和恢复Fragment状态的最好方法
    Android Fragment 基本介绍
    【Android】再来一篇Fragment懒加载(只加载一次哦)

    相关文章

      网友评论

        本文标题:Fragment 一个简单的全景感受

        本文链接:https://www.haomeiwen.com/subject/szwppxtx.html