动态更改片段布局而不是替换片段 Android SDK

Thi*_*93H 4 android listview android-fragments

我正在尝试制作一个应用程序,当用户单击相应的列表视图项时,该应用程序以特定布局显示大量文本和图像。由于我想要单独的“章节”的特定 .xml 布局,我只想将片段的布局更改为相应的章节。

谷歌搜索告诉我我可以用片段来做到这一点,但据我所知,我需要为我想要实现的每一章单独的片段类和 .xml 布局。有 2 或 3 章,这可以完成,但随着更多的章节,我想,只保留两个片段(一个带有列表视图,一个带有章节文本)不是更简单,而是动态更改布局如果用户单击列表视图中的项目,则第二个片段。

这可以用这样的代码来完成吗(只是​​大声思考)?

Int[] layouts = {
        {R.layout.chapter1, R.layout.chapter2, R.layout.chapter3}
    };

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    index = intent.getIntent("index", 0);
    return inflater.inflate(layouts[index], container, false);
}
Run Code Online (Sandbox Code Playgroud)

还是有另一种方法来实现这一目标?

Dee*_*eeV 5

片段的核心是包含视图状态的视图包装器。您可以将它们用于其他目的,例如资源处理,但大多数情况下它们只是 Activity 状态的片段。除非每个章节都有自己独特的状态需要保留,否则为每个章节都设置一个 Fragment 很可能不是一个好主意。但是,如果视图是静态的,那么您真正需要的只是一个片段。

在这种情况下,您只需要有一个这样的方法:

public void setChapter(int chapter)
{
   Context ctx = getActivity();
   if(ctx == null) {
      // detached from Activity, so bail.
      return;
   }

   if(chapter > layouts.length) {
     return;
   }

   ViewGroup container = (ViewGroup) getView().findViewById(R.id.chapter_container);
   container.removeAllViews();
   View chapterInflater = LayoutInflater.from(ctx).inflate(layouts[chapter], container);
}
Run Code Online (Sandbox Code Playgroud)

因此,这将清除当前容器中的所有视图,扩充一个新视图,并将其放入容器中(很可能是一个简单的 FrameLayout)。

如果您想在某个时刻打开它,可以使用原始问题中的代码来初始化 Fragment。onCreate_()仅在“构建”或“创建”项目时调用方法。onCreateView()但是不会再次调用,因此您需要一种方法来在设置后更改布局。