Android - 我需要一些關於片段與活動和視圖的說明



Answers

  1. 片段是活動的一部分,它為該活動貢獻了自己的用戶界面。 片段可以被認為是一個子活動。 用戶與之交互的完整屏幕稱為活動。 活動可以包含多個片段。片段大多是活動的子部分。

  2. 根據屏幕大小,活動可能包含0或多個片段。 片段可以在多個活動中重複使用,因此它在活動中充當可重用組件。

  3. 一個片段不能獨立存在。 它應該永遠是活動的一部分。 活動可以在任何片段中存在。

Question

在Android API 11+中,Google發布了一個名為Fragment的新類。

在視頻中,Google建議盡可能(鏈接1,鏈接2),我們應該使用片段而不是活動,但他們沒有解釋原因。

碎片的目的和它們的一些可能的用途是什麼(除了可以通過簡單的視圖/佈局輕鬆實現的一些UI示例之外)?

我的問題是關於碎片:

  1. 什麼是使用片段的目的?
  2. 與使用活動/視圖/佈局相比,使用片段有什麼優點和缺點?

獎金問題:

  1. 你可以給一些片段真正有趣的用途嗎? 谷歌沒有在他們的視頻中提到的東西?
  2. 片段與包含它們的活動之間進行通信的最佳方式是什麼?
  3. 當使用碎片時,要記住什麼是最重要的事情? 你的經驗提示和警告?



碎片在某些情況下特別有用,例如我們想要在所有頁面中保留導航抽屜的地方。 你可以用你想要的任何片段膨脹一個框架佈局,並仍然可以訪問導航抽屜。

如果您使用過一項活動,您將不得不將抽屜放在所有導致冗餘代碼的活動中。 這是片段的一個有趣用途。

我是Android的新手,仍然認為一個片段是有用的。




片段表示活動中的行為或用戶界面的一部分。 您可以在單個活動中組合多個片段來構建多窗格用戶界面,並在多個活動中重用片段。 您可以將片段視為活動的模塊化部分,該活動有其自己的生命週期,接收自己的輸入事件以及可以在活動運行時添加或刪除的活動。

  • 您可以獨立操作每個片段,例如添加或刪除它們。 當您執行這樣的片段事務時,您還可以將其添加到由活動管理的後端堆棧中 - 活動中的每個後端堆棧條目都是發生的片段事務的記錄。 後退堆棧允許用戶通過按下後退按鈕來反轉片段事務(向後導航)。

  • 將片段作為活動佈局的一部分添加時,它位於活動視圖層次結構內的ViewGroup中,片段定義其自己的視圖佈局。 您可以通過將活動佈局文件中的片段作為元素或通過將應用程序代碼添加到現有ViewGroup中,從而將片段插入到活動佈局中。 但是,片段不需要成為活動佈局的一部分; 你也可以使用一個沒有自己UI的片段作為活動的隱形工作者。

  • 例如:如果您要使用不帶Fragments的NavigationDrawer,那麼最好將NavigationDrawer實例保存在單個Activity中,並且通過從NavigationDrawer中的項目中進行選擇來導航應用程序時,那麼所啟動的每個活動都不應該實現NavigationDrawer,而應該實現後退按鈕以導航回到實現NavigationDrawer的“Main”/ single Activity。

    注意:如果您確實想要在多個活動中實現NavigationDrawer,則必須在每個要顯示它的活動中重新創建一個NavigationDrawer的新實例。

    我想這與使用Fragments相比是一個缺點,而如果你使用了一個片段,你將不需要很多抽屜實例,你只需要一個。

    抽屜與片段而不是活動

    如果您在Fragments中使用NavigationDrawer,則抽屜應該在單個Activity中實現,並且每個抽屜項目被選中時,其內容將顯示在他們各自的Fragments中。

  • 在片段與其活動之間進行通信:要允許片段與其活動進行通信,可以在Fragment類中定義一個接口並在Activity中實現它。片段捕獲onAttach()生命週期方法期間的接口實現,然後調用接口方法以便與活動進行通信。

    public class YourFragment extends ListFragment {
    OnSelectedListener mCallback;
    
    // Container Activity must implement this interface
    public interface OnSelectedListener {
        public void onItemSelected(int position);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.your_view, container, false);
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnSelectedListener");
        }
    }
    
    }...
    

現在片段可以通過使用OnSelectedListener接口的mCallback實例調用onItemSelected()方法(或接口中的其他方法)來將消息傳遞給活動。

public static class MainActivity extends Activity
        implements YourFragment.OnSelectedListener{
    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }

    public void onItemSelected(int position) {
        // The user selected the headline of an article from the YourFragment
        // Do something here to display that article

        YourFragment yourFrag = (YourFragment)
                getSupportFragmentManager().findFragmentById(R.id.your_fragment);

        if (yourFrag != null) {
            // If your frag is available, we're in two-pane layout...

            // Call a method in the YourFragment to update its content
            yourFrag.updateView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected item
            YourFragment newFragment = new YourFragment();
            Bundle args = new Bundle();
            args.putInt(YourFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}



一個片段存在於一個活動中。

一項活動依靠自己。




片段是應用程序的用戶界面或行為的一部分,可以放置在一個活動中,以啟用更模塊化的活動設計。 如果我們說一個片段是一種子活動,那不會是錯誤的。

以下是有關片段的重要觀點:

  1. 片段擁有自己的佈局和自己的行為以及自己的生命週期回調。

  2. 活動正在運行時,您可以在活動中添加或移除碎片。

  3. 您可以在單個活動中組合多個片段來構建多窗格用戶界面。

  4. 一個片段可以用於多個活動。

  5. 片段生命週期與其宿主活動的生命週期密切相關。

  6. 當活動暫停時,活動中可用的所有片段也將停止。

  7. 片段可以實現沒有用戶界面組件的行為。

  8. 片段被添加到Android 3 (Honeycomb)中的API API版本11中。

欲了解更多詳情,請訪問官方網站Fragments




Links