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

Android 动态更改片段布局,而不是替换片段,android,listview,android-fragments,Android,Listview,Android Fragments,我正在尝试制作一个应用程序,当用户单击相应的listview项目时,它会在特定的布局中显示大量的文本和图像。由于我希望为单独的“章节”使用特定的.xml布局,所以我只希望片段的布局更改为相应的章节 谷歌告诉我,我可以用片段来实现这一点,但据我所知,我需要为我想要实现的每一章提供单独的片段类和.xml布局。有了2到3章,这是可以做到的,但是有了更多的章节,我想,仅仅保留两个片段(一个带有listview,一个带有章节文本)不是更简单吗?如果用户单击listview中的某个项目,动态地更改第二个片段

我正在尝试制作一个应用程序,当用户单击相应的listview项目时,它会在特定的布局中显示大量的文本和图像。由于我希望为单独的“章节”使用特定的.xml布局,所以我只希望片段的布局更改为相应的章节

谷歌告诉我,我可以用片段来实现这一点,但据我所知,我需要为我想要实现的每一章提供单独的片段类和.xml布局。有了2到3章,这是可以做到的,但是有了更多的章节,我想,仅仅保留两个片段(一个带有listview,一个带有章节文本)不是更简单吗?如果用户单击listview中的某个项目,动态地更改第二个片段的布局

这样的代码可以做到吗(只是大声思考)


或者有其他方法可以实现这一点吗?

片段的核心是包含视图状态的视图包装器。您可以将它们用于其他目的,如资源处理,但大多数情况下它们只是活动状态的一部分。除非每一章都有自己独特的状态需要保存,否则最好不要为每一章都添加一个片段。然而,如果视图是静态的,那么您真正需要的只是一个片段

在这种情况下,您只需使用如下方法:

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);
}
因此,这将清除容器中当前的所有视图,膨胀一个新视图,并将其放入容器中(很可能是一个简单的框架布局)


如果您想在某一点打开片段,可以使用原始问题中的代码初始化片段<代码>onCreate_389;()方法仅在“生成”或“创建”项时调用<但是,不会再次调用code>onCreateView(),因此需要一种方法来在设置布局后更改布局

因此,据我所知,您的“setChapter”方法需要放在ListFragment中,然后我将有一个类似于setChapter(I)的onClick方法,其中I是我在listView中单击的项目的ID。是吗?不是。假设你的
布局
数组是所有要显示的章节。它将出现在显示布局的任何片段中。您的ListView可以通过调用
getFragmentManager().findFragmentBy__;()方法。然后它只对返回的片段调用
setChapter()
。不幸的是,我无法让它工作。单击可展开列表视图中的项目不会使应用程序崩溃,但似乎也不会改变片段的布局。但当我点击列表中的“第4项”时,当我的int数组“layouts”中只指定了3个布局时,它就会崩溃。你知道我在这里可能会做错什么吗?将
。那是一个打字错误。好吧,这很有效!现在我还有一个问题你可以回答。我使用的是一个可扩展列表,OnChildClickListener将int ChildPosition传递到setChapter(ChildPosition)中。现在,因为它是一个可扩展的列表,所以每个组都从id为0的子组开始。有没有办法改变这一点,或者您更喜欢使用常规的listview?
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);
}