Android技术知识Android知识首页投稿(暂停使用,暂停投稿)

Fragment 一个简单的全景感受

2017-10-30  本文已影响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懒加载(只加载一次哦)

上一篇 下一篇

猜你喜欢

热点阅读