【问题标题】:Android Fragments Displaying On Top Of Each Other When Screen Orientation Changes屏幕方向更改时,Android 片段重叠显示
【发布时间】:2016-01-02 10:31:29
【问题描述】:

我有一个导航菜单,它向用户显示各种操作模式。当用户选择一个特定的选项时,activity会加载相应的fragment(例如:Add Product应该加载AddProduct的fragment)。

加载工作正常 - 我使用 FragmentManager 和 FragmentTransaction 用新片段替换当前片段。当屏幕旋转时出现问题 - 我使用的当前两个片段彼此重叠显示。

这是我为 NavigationDrawerListener(加载的部分)设置的代码:

  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    DrawerLayout drawerLayout = (DrawerLayout) currentActivty.findViewById(R.id
            .homeDrawer);
    TextView heading = (TextView) currentActivty.findViewById(R.id.AppHeadingTextView);
    switch (position)
    {
        case 0:
            heading.setText("Home");
            drawerLayout.closeDrawers();
            UserMainScreenFragment homeScreen = new UserMainScreenFragment();
            FragmentManager homeManager = currentActivty.getFragmentManager();
            FragmentTransaction homeTransaction = homeManager.beginTransaction();
            homeTransaction.replace(R.id.contentArea, homeScreen);
            homeTransaction.commit();
            break;
        case 2:
            heading.setText("Add a Product");
            drawerLayout.closeDrawers();
            AddProductFragment newProductFragment = new AddProductFragment();
            FragmentManager manager = currentActivty.getFragmentManager();
            FragmentTransaction replace = manager.beginTransaction();
            replace.replace(R.id.contentArea, newProductFragment);
            replace.commit();
           break;
    }
}

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您需要根据方向为所需的活动创建单独的布局。

    【讨论】:

      【解决方案2】:

      在您的活动中,您需要检查 savedInstanceState 是否为 null 以避免再次添加相同的片段:

      //when the orientation changes, the savedInstanceState bundle is not null
      if(savedInstanceState!=null){
      //add your fragment to the layout
      }
      

      另外,我注意到你通过 currentActivty.getFragmentManager(); 引用了片段管理器;

      也许 currentActivty.getFragmentManager(); 对被销毁的 Activity 有旧引用,如果您正在使用支持,您还应该使用 getSupportFragmentManager()图书馆

      【讨论】:

        【解决方案3】:

        你必须为两个方向添加不同的布局(同名),然后Android会根据方向自动膨胀合适的xml。

        文件结构如下所示,

        res
         - drawable
         - layout                        // for portrait
            - layout_name.xml            
         - layout-land                   // for landscape
            - layout_name.xml            // same name should be used
         - .....
        

        查找示例解决方案here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多