簡體   English   中英

哪個布局與片段一起使用?

[英]Which Layout to use with Fragments?

最近深入研究片段,根據我的理解,要創建一個片段,您需要一個 java 類和片段布局。 這是有道理的。 然而,我似乎無法理解的是我用來存儲/插入片段的“容器”或布局是什么? 在 android studio 中,您可以使用來插入片段,也可以使用任何其他布局。 但哪一種最適合使用?

此外,我在 reddit 帖子中看到,我根本不應該使用片段,而是更喜歡使用框架布局並使用視圖可見性來獲得所需的效果。 這是真的?

你讓 Fragments 的概念有點過於復雜了。

片段與活動一樣,實際上並不需要專門的片段布局 xml 文件。 如果您選擇這樣做,您可以通過 Java 代碼創建整個布局,但我不會理解您為什么會選擇這樣做。

因此對於 Fragments,您不需要 Java 類和 Fragment 的布局文件。 唯一的要求是 Java 類,布局文件只是擴展布局的首選方法,類似於活動的方式。

至於您關於片段容器的問題,這實際上是您的應用程序設計的問題。

您可以通過代碼中的FragmentManager或 layout.xml 文件中的<fragment>標記將 Fragment 添加到您的 Activity 或其他 Fragment。

這兩種方式都不是最佳方式或首選方式,因為這實際上取決於您的應用程序需要什么。

使用<fragment>標簽將導致在布局膨脹時總是添加該片段。 如果您的 Activity 由於您使用 ViewPagers、Tabs、Drawer Navigation 等內容而需要動態切換 Fragment,這實際上非常糟糕。但是,如果不需要動態切換 Fragment 並且對於該特定 Activity 或父 Fragment,那就太好了,這個片段是一個總是加載的片段。

例如,假設您設計了一個靈活的 AddNew Fragment,用於 Dialog 和 AddNewActivity。 由於重用相同的屏幕和代碼,您決定將代碼的這部分作為片段,以便將其插入到 DialogFragment 或另一個活動中。 但是,對於那些 DialogFragment 和 Activity,它唯一的Fragment 是 AddNewFragment,因此只需通過<fragment>標記將該片段插入到 Dialog 布局和 Activity 布局中就很有意義。

至於使用 Java 代碼的選項,首選方法是使用FrameLayout 但是沒有必要玩弄任何視圖可見性!

常見的方法是只使用:

<FrameLayout 
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

使用 FrameLayout 是因為它將成為 Fragment 的容器。 換句話說,Fragment 將存儲在此布局內。

因此,在 Java 代碼中,您可以簡單地使用此代碼將容器內的 Fragment 替換為新的 Fragment:

getSupportFragmentManager().beginTransaction().replace(R.id.container, AddNewFragment.newInstance()).commit(); 

或者,如果您希望將片段放置在 FrameLayout 容器內的另一個片段之上,則可以使用add()而不是replace()

所以是的,要對您的問題給出一個決定性的答案,將 Fragment 添加到 Activity 或另一個 Fragment 沒有理想的方法。 每個選項都有它的優點和缺點,有些在某些情況下效果更好,而另一些在其他情況下效果更好。

最后,這真的取決於您的應用程序需要什么。 如果你需要你的 Fragment 靈活,所以你可以切換 Fragments,那么這必須通過 Java 代碼來完成,因為通過<fragment>標簽添加的 Fragment 在運行時無法刪除。 但是,如果您不需要替換 Fragment 並且它肯定會始終顯示相同的 Fragment,那么使用<fragment>標簽就無需編寫額外的 Java 代碼來加載專用的 Fragment。

我真正需要指出的一件事是……你讀到的那個 reddit 頁面是錯誤的。 使用 Fragment 的“首選”方式是不使用 FrameLayouts 並使用 View 可見性。 我實際上不知道為什么甚至需要更改視圖可見性。

您可以使用新的 androidx.fragment.app.FragmentContainerView 獲得比 FrameLayout 更好的性能。

這里有更多信息。

您可以使用Fragment布局,但這不是很靈活。 如果您只顯示一個Fragment ,它應該可以工作,但是使用FrameLayout並將您的Fragment插入其中效果更好,因為這允許您即時更改它們。

您可能會看到一個帶有 id R.id.container或類似內容的FrameLayout ,它的用途是Transaction

例如,如果您想將FragmentOne插入到您的布局中,您可以這樣做,它會將它放入R.id.container

Fragment fragment = new FragmentOne();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.commit();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM