更新與整理自己學的安卓相關知識
如有錯誤歡迎指證
第30章
Fragment 是 Android 應用程式開發中的一個重要概念,它是一個獨立的模組化區塊,可以被嵌入到 Activity 中,也可以由多個 Fragment 組成一個 Activity。使用 Fragment 可以創造動態的使用者介面,並在應用程式運行時在 Activity 中增加或移除 Fragment。
每個 Fragment 由一個 XML 檔案和一個對應的 Java class 組成。XML 檔案定義了 Fragment 的使用者介面,而 Java class 則負責處理 Fragment 的邏輯。在 Android 應用程式中,Fragment 可以調用 Activity 的方法,也可以接收 Activity 傳遞過來的資料,因此可以實現 Activity 和 Fragment 之間的互動。
使用 Fragment 可以幫助開發者更好地組織應用程式的架構,使得程式更加模組化和易於維護。同時,Fragment 還可以提高應用程式的彈性和互動性,為使用者帶來更好的體驗。
可以使用 XML 檔案來定義 Fragment 的使用者介面。首先,在 XML 檔案中定義 Fragment 的外觀和元素,然後在 Activity 中使用 FragmentManager 將 Fragment 加入到 Activity 中。
需要注意的是,如果使用的函式庫有兼容較舊的 Android 版本,那麼在 Activity 中使用 Fragment 時,必須繼承 FragmentActivity 而不是 AppCompatActivity class。這是因為 FragmentActivity 是在較舊的 Android 版本中引入的,而 AppCompatActivity 是在後
來的版本中才出現的。
因此,在開發 Android 應用程式時,需要根據使用的函式庫和目標 Android 版本來選擇適當的 Activity 類別,以確保應用程式的正確運行。
import android.os.Bundle;
import androidx.fragment.app.FragmentActivity;
import android.view.Menu;
public class MainActivity extends FragmentActivity {
//繼承FragmentActivity而不是AppCompatiActivity class
..
單純使用XML檔無法在運行時動態的控制Fragment,所以必須使用程式碼去控制。
Fragment可以被視為小型Activity,它擁有自己的布局、類別和生命週期。因此,Fragment中的小部件(View)也可以產生事件。要處理Fragment中的小部件產生的事件,需要根據事件處理器的宣告位置來決定,可以是Fragment本身,也可以是包含Fragment的Activity。
在應用程式中,Fragment可以與Activity和其他Fragment進行通信,並且可以在運行時動態添加或刪除。因此,Fragment提供了更靈活和可重用的UI元素,可以增強應用程式的可維護性和可擴展性。
Fragment通常與Activity進行通信,而不是直接與其他Fragment進行通信。
情況一: 當Activity需要向Fragment進行通信時,可以通過Fragment的ID來引用Fragment對象,並使用該對象的方法來進行交互。
情況二: 當Fragment需要向Activity進行通信時,情況就會變得更複雜。Fragment需要定義一個Listener接口,並實現該接口的Activity類。然後,在Fragment中可以調用Listener接口的方法來與Activity進行交互。這種方法可以實現Fragment和Activity之間的鬆散耦合,從而提高應用程式的可維護性和可擴展性,請參考以下的例子:
下面的代碼在ToolbarFragment類中定義了一個ToolbarListener接口,同時創建了一個名為activityCallback的變量,用於引用Activity。
//Fragment class中
public class ToolbarFragment extends Fragment {
ToolbarListener activityCallback;
public interface ToolbarListener {
public void onButtonClick(int position, String text);
}
..}
同時fragment class中的onAttach()方法也必須被複寫以及實現,這個方法會被安卓系統自動使用當Fragment連同activity被初始化的時候,onAttach()會被傳入一個activity的參照,該方法必須存取activity的參照同時驗證ToolbarListener interface 是否被實現。參考以下的code:
//Fragment class中
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
activityCallback = (ToolbarListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ToolbarListener");
}
}
下一步是呼叫fragment中的回呼函數(callback method),以下例子是當按鈕被按下時呼叫回呼函數
/*Fragment class中*/
public void buttonClicked (View view) {
activityCallback.onButtonClick(arg1, arg2);
}
最後是修改Activity類去實現ToolbarListener接口:
//Activity class中
public class MainActivity extends FragmentActivity implements ToolbarFragment.ToolbarListener {
//onButtonClick被宣告在ToolbarListener裡面
public void onButtonClick(String arg1, int arg2) {
// Implement code for callback method
}
.
.
}
Activity實現了ToolbarListener接口並且附加了ToolbarFragment時,ToolbarFragment可以通過activityCallback變量調用Activity的onButtonClick方法。這種方法可以實現Fragment和Activity之間的鬆散耦合,從而提高應用程式的可維護性和可擴展性。