![](/img/trans.png)
[英]How to use layout components in functions which are out of activities and fragments in Android?
[英]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.