1. 程式人生 > >Android 學習之《第一行程式碼》第二版 筆記(九)探究碎片(一)

Android 學習之《第一行程式碼》第二版 筆記(九)探究碎片(一)

一、碎片

1. 碎片是什麼:

碎片(Fragment)是一種可以嵌入在活動當中的UI片段,能讓程式更加合理和充分地利用大螢幕的空間。(可以理解成迷你型活動)

2. 簡單用法:

在一個活動當中新增兩個碎片,並讓這兩個碎片平分活動空間。

1.)效果圖(沒錢買平板,CPU不支援使用Android Studio的模擬器,所以使用手機橫屏演示)

碎片的簡單用法

2.)新建一個左側碎片佈局和一個右側碎片佈局

左側碎片佈局(left_fragment.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:text="Button"/>
</LinearLayout>

右側碎片佈局(right_fragment.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:
background
="#00ff00" android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textSize="20sp" android:text="This is right fragment"/> </LinearLayout>

3.)新建一個LeftFragment類和一個RightFragment類

LeftFragment.java
重寫onCreateView(…)方法,通過LayoutInflater的inflate()方法把剛才定義的佈局動態載入進來。

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class LeftFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment,container,false);
        return view;
    }
}

RightFragment.java
重寫onCreateView(…)方法,通過LayoutInflater的inflate()方法把剛才定義的佈局動態載入進來。

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class RightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.right_fragment,container,false);
        return view;
    }
}

4.)修改activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--使用android:name屬性顯式指明要新增的碎片類名,要將類的包名加上-->
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.thinkpad.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.thinkpad.fragmenttest.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

</LinearLayout>

3. 動態新增碎片

在上面簡單用法上修改程式碼。

1.)效果圖(原先是綠色碎片點選之後變成黃色碎片)

動態新增碎片

2.)新建 another_right_fragment.xml 和 AnotherRightFragment.java 作為動態新增進去的碎片。

another_right_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#ffff00"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="This is another right fragment"/>

</LinearLayout>

AnotherRightFragment.java

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class AnotherRightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.another_right_fragment,container,false);
        return view;
    }
}

3.)修改 activity_main.xml 建立“容器”

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--使用android:name屬性顯式指明要新增的碎片類名,要將類的包名加上-->
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.thinkpad.fragmenttest.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">
    </FrameLayout>

</LinearLayout>

4.)在主活動中向“容器”FrameLayout裡新增內容,從而實現動態新增碎片的功能。

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //new AnotherRightFragment()建立碎片例項
                //點選Button按鈕,出發事件,將綠色碎片替換成黃色碎片
                replaceFragment(new AnotherRightFragment());
            }
        });
        //在Button按鈕未被點選之前先動態載入進去綠色的碎片
        replaceFragment(new RightFragment());
    }

    private void replaceFragment(Fragment fragment){
        //獲取FragmentManager 恩,應該叫碎片管理器吧
        FragmentManager fragmentManager = getSupportFragmentManager();
        //開啟一個碎片事務
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        //向FrameLayout容器替換碎片 第一個引數為容器,第二個引數為替換進去的碎片
        transaction.replace(R.id.right_layout,fragment);
        //提交事務
        transaction.commit();
    }
}

5.)動態新增碎片主要分為5步:

A. 建立待新增的碎片例項。
B. 獲取 FragmentManager “碎片管理者”,在活動中呼叫getSupportFragmentManager();得到。
C. 開啟一個碎片事務,通過beginTransaction();方法開啟。
D. 向容器裡面新增或替換碎片,一般使用replace()方法實現,引數為容器id和待新增或替換的碎片例項。
E. 提交事務,commit();

4. 在碎片中模擬返回棧

在事務提交之前呼叫FragmentTransaction的addToBackStack(null)方法。

5. 碎片和活動之間進行通訊:

1.)在活動中使用碎片方法

FragmentManager 提供的方法 findFragmentById(…); 獲取碎片例項。

2.)在碎片裡使用活動方法

呼叫getActivity()方法(獲取到的活動本身也是一個Context物件)

3.)碎片到碎片

使用2.)再使用1.)

5. 動態載入佈局的技巧——使用限定符


整理學習自郭霖大佬的《第一行程式碼》
目前小白一名,持續學習Android中,如有錯誤請批評指正!