iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

Fragment代表應用程式介面的可重複使用部分,片段可讓介面分為不同的區塊,藉此將模組性和可重複使用性導入活動介面中。
Fragment可以因應各種螢幕大小調整畫面,如:較小螢幕可以用線性版面配置顯示底部導覽列和清單。(如下圖)
https://ithelp.ithome.com.tw/upload/images/20240930/20168454NamSh3zeCy.png
https://ithelp.ithome.com.tw/upload/images/20240930/20168454CMWrS45eLS.png

因此一個Activity裡可以有多個Fragment,且一個Fragment可以被多個Activity重用。

來源資訊官網可看更仔細的訊息。

了解大概關於Fragment的資訊後,我們開始上首簡單的範例吧~


Fragment

這次我們需要新增三個Fragment

  • 在自己的com.example.檔名 右鍵 > New > Fragment > 點擊 Fragment(Blank)
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454NziaxkOVF4.png

  • 命名完,點擊Finish
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454NJ9DqR8kzb.png

  • activity_main.xml 利用LinearLayout設置FrameLayout與Button
    (實作會利用Button觸發)
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454hMDTpPYqYu.png

https://ithelp.ithome.com.tw/upload/images/20240930/201684548h3JOdGz6d.png

(完整程式碼)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/main_fragmentLayout_fl"
        android:gravity="center_vertical"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="0.1">

        <Button
            android:id="@+id/main_fragment1_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="更多" />

        <Button
            android:id="@+id/main_fragment2_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="主頁" />

        <Button
            android:id="@+id/main_fragment3_btn"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="訊息" />
    </LinearLayout>

</LinearLayout>
  • MainActivity
public class MainActivity extends AppCompatActivity {
    //宣告
    private Button leftFragmentButton,middleFragmentButton,
            rightFragmentButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        //綁定
        leftFragmentButton = findViewById(R.id.main_fragment1_btn);
        middleFragmentButton = findViewById(R.id.main_fragment2_btn);
        rightFragmentButton = findViewById(R.id.main_fragment3_btn);

        //建立Fragment
        LeftFragment leftFragment = new LeftFragment();
        MiddleFragment middleFragment = new MiddleFragment();
        RightFragment rightFragment = new RightFragment();

        FragmentManager fragmentManager = getSupportFragmentManager();

        //按鈕觸發,呼叫setFragment
        leftFragmentButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //使用FragmentTransaction置換(replace) Fragment 的物件
                fragmentManager.beginTransaction().replace(R.id.main_fragmentLayout_fl,leftFragment).commit();
            }
        });

        middleFragmentButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //使用FragmentTransaction置換(replace) Fragment 的物件
                //呼叫 commit 來確認執行
                fragmentManager.beginTransaction().replace(R.id.main_fragmentLayout_fl,middleFragment).commit();
            }
        });

        rightFragmentButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //使用FragmentTransaction置換(replace) Fragment 的物件
                fragmentManager.beginTransaction().replace(R.id.main_fragmentLayout_fl,rightFragment).commit();
            }
        });
    }

}

FragmentTransaction => 用來操作新增(add)、刪除(delete)或置換(replace) Fragment

通常Fragment的佈局會添加在像是FrameLayout的容器中,在容器裡可以同時存在多個fragment。
replace做的就是取代容器內「所有」Fragment,且容器內不管有幾個Fragment都會被移除。

  • Fragment(因為三個設置依樣只是設置文字不同,所以只介紹其中一個就好)
public class LeftFragment extends Fragment {
    private TextView msgTextView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //這裡通常是用於創建Fragment的View
        return inflater.inflate(R.layout.fragment_left, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        msgTextView = view.findViewById(R.id.fragment_msg1_tv);
        msgTextView.setText("更多頁面");
    }
}
  1. onCreate => Fragment被創建實調用、最先執行程式的地方,這裡通常用來初始化和接收從別處傳來的資料
  2. onCreateView => 用來創建Fragment佈局、創立Fragment的View並且回傳,基本是創立View
  3. onViewCreated => 通常會寫有關元件的行為,如:綁定id、按鈕監聽器等

這些就是我們這次Fragment會用到的程式碼~

  • fragment.xml
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454pWfuQAFMA4.png
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LeftFragment">

    <TextView
        android:id="@+id/fragment_msg1_tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@string/hello_blank_fragment"
        android:textSize="40sp" />

</FrameLayout>

這樣就完成了,試試執行起來是甚麼樣子~

執行畫面

  • 執行一開始
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454Nkz9dJeN53.png

  • 左邊按鈕
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454nSMz09bROR.png

  • 中間按鈕
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454H1OBfZyQne.png

  • 右邊按鈕
    https://ithelp.ithome.com.tw/upload/images/20240930/20168454OmtU909X02.png
    恭喜成功做出簡單的Fragment範例啦(。・∀・)ノ゙


上一篇
元件篇-RecyclerView+Intent Day21
下一篇
元件篇-Fragment+ViewPager2 Day23
系列文
Android 元件總動員 - 運用與實踐元件指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言