第一行代碼筆記 (fragment)碎片的使用

碎片的生命週期

1.運行狀態:可見,並且能交互

2.暫停狀態:可見,不能交互

3.停止狀態:不可見,很可能被系統回收。(出現的情況:1.activity進入停止狀態。2.在通過調用remove/repalce方法將碎片從活動中移除,但在commit之前調用了addToBackStack)

4.銷燬狀態:不可見 (出現情況:activity被銷燬時,或調用remove/repalce方法將碎片從活動中移除,但在commit之前沒有調用addToBackStack。)







使用

方法一:直接寫在xml文件中

1.定義fragment的佈局名爲:left_layout

<?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">

    <TextView
        android:text="leftFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
2.在定義的fragment裏面引用佈局

public class LeftFragment extends Fragment {

    /**
     * 當碎片和activity建立關聯的時候
     * @param context
     */
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    /**
     * 當碎片創建試圖時(加載佈局的時候調用)
     * @param inflater
     * @param container
     * @param savedInstanceState
     * @return
     */
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_layout, container, false);
        return view;
    }

    /**
     * 確保與碎片相關的activity一定已經創建完畢的時候調用
     * @param savedInstanceState
     */
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    /**
     * 當碎片關聯的試圖被移除的時候調用
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    /**
     * 當碎片和activity解除關聯的時候調用
     */
    @Override
    public void onDetach() {
        super.onDetach();
    }

    /**
     * 防止被系統回收存儲一些數據,通過bundle存儲下來。可以在onCreateView()或者
     * onActivityCreated()或者onCreat的bundle中取到值。
     * @param outState
     */
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }
}
3.定義一個activty

public class FragmentActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);
    }
}
4.在activty的xml佈局中引用fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lvyequeen.test.day01.fragment.FragmentActivity">

    <fragment
        android:name="com.lvyequeen.test.day01.fragment.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>



方法二:動態添加碎片

1.像上面一樣簡單創建兩個fragment     名爲:RightFragment  和  AnotherFragment

2.創建一個activty

public class FragmentActivity extends AppCompatActivity implements View.OnClickListener {

    private Button leftButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment);
        initView();
        repalceFragment(new RightFragment());
    }

    private void initView() {
        leftButton = ((Button) findViewById(R.id.leftButton));
        leftButton.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.leftButton:
                repalceFragment(new AnotherFragment());
                getFragment();
                break;
        }
    }


    /**
     * 替換fragment
     *
     * @param fragment
     */
    private void repalceFragment(Fragment fragment) {
//        獲取FragmentManager
        FragmentManager manager = getSupportFragmentManager();
        manager.findFragmentById(R.id.right_Layout);
//        開啓一個事物
        FragmentTransaction transaction = manager.beginTransaction();
//        向容器內添加或替換碎片,一般用replace  參數1:傳入容器的id,參數2:待添加的fragment實例
        transaction.replace(R.id.right_Layout, fragment);
//        在碎片中模擬返回棧,點擊回退鍵回到上一個fragment
        transaction.addToBackStack(null);
//        提交事物
        transaction.commit();
    }


    /**
     * 獲取fragment的實例
     */
    private void getFragment() {
        //        獲取FragmentManager
        FragmentManager manager = getSupportFragmentManager();
//        獲取fragment的實例
        RightFragment rightFragment = (RightFragment) manager.findFragmentById(R.id.right_Layout);
        rightFragment.testContectWithActivity();
    }


}
3.佈局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lvyequeen.test.day01.fragment.FragmentActivity">

    <fragment
        android:name="com.lvyequeen.test.day01.fragment.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/right_Layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

三 動態加載佈局的技巧(區分平板和手機)

1.使用限定符

在res文件夾下創建一個layout-large文件夾寫一個和activity引用原先layout文件一樣名稱的xml佈局。屏幕被認爲是large的設備就會加載layout-large文件夾裏面的文件。

2.使用最小寬度限定符

在res文件夾下創建一個layout-sw600dp文件夾。和上面一樣。當程序運行在屏幕寬度大於600dp的設備上時加載layout-sw600dp裏的佈局,小於時,加載默認layout裏面的佈局。



使用注意事項

點擊打開鏈接


發佈了44 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章