iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Mobile Development

Android Studio - 30天菜鳥筆記系列 第 23

Android Studio菜鳥筆記 - Day23 - Fragment基本介紹及replace()用法

  • 分享至 

  • xImage
  •  

Fragment是依賴於Activity之下,可以根據螢幕尺寸大小,方便實現不同的佈局,且不用把所有程式碼寫在Activity,而是把程式碼寫在各自的Fragment,優化程式。
一個Activity裡可以有多個Fragment。
一個Fragment可以被多個Activity重用。

創建Fragment

一開始先New幾個Fargment(Blank) (這是系統內建的Fragment,也可以自己創建一個class去繼承)

創建完會得到Fragment的.java與.xml

可以設計內容,到時候做切換就可以了

fragmentContainerView

這是用來讓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>

FragmentManager與FragmentTransaction

負責應用fragment執行一些操作,如添加、移除或替換等等操作

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每次commit之前一定要重新給予一的指令
fragmentTransaction = fragmentManager.beginTransaction();
一個fragmentTransaction不容許有兩個commit,所以要對Fragment做一系列動作就要再重新給予指令,不然會出錯。

replace()方法

replace()裡要輸入兩個參數

  1. 要顯示到在哪裡(上面提到的fragmentContainerView)
  2. 要顯示的Fragment
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一個新的出來。
在換個實際的例子來說,今天你用手機點餐,點完按下一步後,突然發現少點了一樣想回去加點,就按下返回鍵,缺發現剛剛點完的都未點選跟新的一樣,又要重新來過。

完整程式碼範例

MainActivity.java

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();
            }
        });
    }
}
創建的三個fragment沒有太大個跟改我就不顯示出來了

activity_main.xml

<?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內容,使其可重複使用


上一篇
Android Studio菜鳥筆記 - Day22 - BottomNavigationView
下一篇
Android Studio菜鳥筆記 - Day24 - Fragment之add()、show()、hide()使用方法
系列文
Android Studio - 30天菜鳥筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言