Fragment是依賴於Activity之下,可以根據螢幕尺寸大小,方便實現不同的佈局,且不用把所有程式碼寫在Activity,而是把程式碼寫在各自的Fragment,優化程式。
一個Activity裡可以有多個Fragment。
一個Fragment可以被多個Activity重用。
一開始先New幾個Fargment(Blank) (這是系統內建的Fragment,也可以自己創建一個class去繼承)
創建完會得到Fragment的.java與.xml
可以設計內容,到時候做切換就可以了
這是用來讓Fragment顯示的區域
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="com.example.fragment_demo.Fragment_one"
android:layout_width="match_parent"
android:layout_height="600dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
負責應用fragment執行一些操作,如添加、移除或替換等等操作
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每次commit之前一定要重新給予一的指令
fragmentTransaction = fragmentManager.beginTransaction();
一個fragmentTransaction不容許有兩個commit,所以要對Fragment做一系列動作就要再重新給予指令,不然會出錯。
replace()裡要輸入兩個參數
fragmentTransaction = fragmentManager.beginTransaction();
fragment_one = new Fragment_one();
fragmentTransaction.replace(R.id.fragmentContainerView, fragment_one);
fragmentTransaction.commit();
使用replace有一個缺點就是他不會保存上一個Fragment,也就是假設有兩個Fragment分別較A、B,現在顯示的是A,若要切換到B,A就會被消除讓B去替代,如果想要再次把A叫出來就要new一個新的出來。
在換個實際的例子來說,今天你用手機點餐,點完按下一步後,突然發現少點了一樣想回去加點,就按下返回鍵,缺發現剛剛點完的都未點選跟新的一樣,又要重新來過。
package com.example.fragment_demo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Fragment_one fragment_one;
private Fragment_two fragment_two;
private Fragment_three fragment_three;
private FragmentManager fragmentManager;
private FragmentTransaction fragmentTransaction;
Button bt_f1, bt_f2, bt_f3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_f1 = findViewById(R.id.bt_f1);
bt_f2 = findViewById(R.id.bt_f2);
bt_f3 = findViewById(R.id.bt_f3);
fragmentManager = getSupportFragmentManager();
bt_f1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragmentTransaction = fragmentManager.beginTransaction();
fragment_one = new Fragment_one();
fragmentTransaction.replace(R.id.fragmentContainerView, fragment_one);
fragmentTransaction.commit();
}
});
bt_f2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragmentTransaction = fragmentManager.beginTransaction();
fragment_two = new Fragment_two();
fragmentTransaction.replace(R.id.fragmentContainerView, fragment_two);
fragmentTransaction.commit();
}
});
bt_f3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fragmentTransaction = fragmentManager.beginTransaction();
fragment_three = new Fragment_three();
fragmentTransaction.replace(R.id.fragmentContainerView, fragment_three);
fragmentTransaction.commit();
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="com.example.fragment_demo.Fragment_one"
android:layout_width="match_parent"
android:layout_height="600dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_f1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginBottom="16dp"
android:text="F1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/bt_f2"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/bt_f3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="f3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/bt_f2" />
<Button
android:id="@+id/bt_f2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="f2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
下一篇會講解如何保留fragment內容,使其可重複使用