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中,如有錯誤請批評指正!