Android,Fragment事务replace()的奇怪行为

3
我希望在更宽的屏幕上使用多窗格布局。数据使用SQL进行持久化,每个片段都获取正确的数据。额外的布局xml文件位于资源目录文件夹中(即layout-w500dp)。但是我遇到了一些奇怪的行为。只有在我选择某些内容然后按下返回按钮后,它才能正常工作。目前,我最多使用两个FrameLayouts,但以后我想使用四个。我检查最深层次选择的级别,并相应地分配片段。(这里仅到第1级,但以后我需要选择达到第3级)。这是我想要实现的效果。

image 1

这在onCreate和选择后被调用。

private void setScreens(){

  int i = getLowestSelection();//returns 0 when nothing is selected. 
  //And 1 if selection is made in lvl1 ...
  int p = 1;

  FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

   if (findViewById(R.id.fragtwo) != null) {
       p = 2;

       if (i == 1){
           SectionsScreen secondFragment = new SectionsScreen();
           transaction.replace(R.id.fragtwo,secondFragment);
       }
   }

  if (findViewById(R.id.fragone) != null) {
      if(p == 2){
          if (i == 0 ){
              StatuteScreen statuteScreenFragment = new StatuteScreen();
              transaction.replace(R.id.fragone,statuteScreenFragment);
          }
      }
      if (p == 1){
          if (i == 0){
              StatuteScreen statuteScreenFragment = new StatuteScreen();
              transaction.replace(R.id.fragone,statuteScreenFragment);
          }
          else if (i == 1){
              SectionsScreen sectionsScreenFragment = new SectionsScreen();
              transaction.replace(R.id.fragone,sectionsScreenFragment);
          }
      }
  }
   transaction.addToBackStack(null);
   transaction.commit();
 }

目前只有按以下步骤才能正常工作:
1. 启动应用程序=在纵向和横向中各有一个片段(这是期望的行为)。 2. 在纵向中进行选择=什么都不会发生!!!!(这就是问题所在) 3. 切换到横向=2个具有正确选择的片段(正确的行为)(如果我在横向中进行初始选择,则需要旋转到纵向,然后再旋转回来)。 4. 切换到纵向=LvL 2带有正确数据的片段(正确的行为)。 5. 按下返回按钮=LvL 1片段(正确的行为)。 6. 从现在开始,我可以在纵向和横向方向之间切换,并且在所有方向上选择项目时都会得到正确的行为。即使在横向上按下返回键时,也只显示一个带有lvl 1的片段,当选择被删除时。
为什么会出现这种行为?这是否是首先正确的方法?考虑到我想要扩展到更高级别和屏幕宽度!例如:
这里的返回堆栈是否能正常工作?如果有人需要额外的信息,请告诉我,我很乐意添加它!

如果您给问题投反对票,请解释原因,以便我可以改进问题。 - M4tchB0X3r
1个回答

0
愚蠢的错误。我将选择保存在应用程序类中,并在onCreate中实例化,但在getLowestSelection()方法中获取当前选择之前,需要重新实例化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接