片段未显示在重复的动态添加片段

时间:2016-02-20 07:58:48

标签: android android-fragments fragmentmanager

我有以下片段设置:

12是分别包含AB片段的标签。 A中有一个按钮,点击后会显示C

正常运行:在第一个标签1中,A通过xml静态添加。点击该按钮后,C启动正常,按后退按钮可以让我回到A

|__1__|  2  |
|  A  |  B  |
   ↓
|  C  |

失败:在B中,有一个动态打开A的按钮。现在推送A中与前一个案例相同的按钮,但在此视图中, C无法显示。我可以在adb中看到数据加载得很好但不知何故它不在视野中。

|  1  |__2__|
|  A  |  B  |
         ↓
      |  A  |
         ↓
      |  C  |

我从AC的按钮代码是:

@Override
public void onReshareTextClick(View v, int position) {
    this.getFragmentManager().beginTransaction().replace(R.id.feedContent,
            LikeReshareFragment.newInstance(feedAdapter.getFeedItem(position), Utils
                    .FragmentType.Reshare))
                    .addToBackStack(null).commit();
}

BA的代码是:

@Override
public void onPhotoClick(View v, int position) {
    this.getFragmentManager().beginTransaction().replace(R.id.llMySnaps,
            FeedFragment.getInstance(sharedFeedItems))
            .addToBackStack(null).commit();
}

问题:由于有两个具有相同名称的片段,我怀疑这一行在标签replace(R.id.feedContent,..中有问题2。它可能实际上替换了标签A中的1(不可见),而不是标签2中的C。这是正确的和/或如何解决这个问题?

更新 我可以确认上述说法。 1实际上显示在标签A中。为什么会这样?因为,android有两个R.id.feedContent(常量ID B)可供选择,如何明确使用if(isset($_POST["submit"])) { $ans=array(); $ans=$_POST['student']; $re=mysql_query("SELECT `st_id` FROM `student_info` WHERE `sem` ='$selsem' AND `st_id` NOT IN (".implode(',',array_map('intval',$ans)).")"); while ($ro = mysql_fetch_row($re)){ mysql_query("insert into manage_attendance(st_id,date,sem,period,subject,status) values('$ro[0]','$seldate','$selsem','$selperiod','$selsub','0')"); } //Here goes array for($i=0;$i<count($_POST['student']);$i++) { $id=$_POST['student'][$i]; //echo $id; $check=1; mysql_query("insert into manage_attendance(st_id,date,sem,period,subject,status) values('$id','$seldate','$selsem','$selperiod','$selsub','$check')"); //print_r ($_POST['student']); } } 启动的那个?

1 个答案:

答案 0 :(得分:0)

问题是Android在R.id.feedContent上执行DFS以查找要在事务中替换的视图。

<强>解决方案 通过以编程方式为视图分配ID,我能够找到 正确的观点来取代。

设置视图ID:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_feed, container, false);
    CoordinatorLayout coordinatorLayout = (CoordinatorLayout) view.findViewById(R.id.feedContent);
    coordinatorLayout.setId(feedID+10); // here feedID is what differentiates the two feed fragments

    return view;
}

以下是替换片段的调用:

this.getFragmentManager().beginTransaction().replace(feedID+10, openPostFragment)
                .addToBackStack(null).commit();