【问题标题】:Tablet Layout, change depending on screen orientation Error平板电脑布局,根据屏幕方向更改错误
【发布时间】:2012-10-16 01:45:57
【问题描述】:

基本上我的问题有点“简单”:
我有这个平板电脑横向布局:

如果用户将平板电脑旋转为纵向模式,并且想要将布局更改为以下布局:

在第一个,横向,布局UI同时显示两个片段,Fragment1在左边,Fragment2在右边。 Fragment2 的容器是一个ViewPager,其中还包含Fragment3Fragment3 对用户滑动可见,或单击ActionBar 中的选项卡。

在第二个,纵向,布局UI同时显示所有三个Fragments,ViewPager被删除,标签也被删除,因为它们是不必要的。

我在 MainActivity 中创建横向布局,如下所示:

    // ActionBar Stuff
    mActionbar = getSupportActionBar();
    mActionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mActionbar.setHomeButtonEnabled(false);

    // Swipe Stuff
    mAdapter = new FragmentAdapter(fm);
    mPager = (ViewPager) findViewById(R.id.viewpager);
    mPager.setAdapter(mAdapter);
    mPager.setOnPageChangeListener(this);

    // Initialize Tabs
    Tab1 = mActionbar.newTab().setText("Tab1");
    Tab2 = mActionbar.newTab().setText("Tab2");

    // Set Tab to Fragment // they're initialized here and accessed in the ViewPager (mPager)
    Fragment1 = new FirstFragment();
    Fragment3 = new ThirdFragment();

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_one_container, Fragment1).commit();

    // //TabListener///////////////////////////
    Tab1.setTabListener(new TabsListener(mApp, 0 + "", mPager));
    Tab2.setTabListener(new TabsListener(mApp, 1 + "", mPager));

    // //Add Tabs//////////////////////////////
    mActionbar.addTab(Tab1);
    mActionbar.addTab(Tab2);

ViewPager 在滑动时在这两个 Fragment 之间切换,并切换到一些更复杂的东西,例如在运行时将 Fragment2 替换为其他 Fragments(用于导航)。

到目前为止一切都很好,我的纵向布局代码类似:

    // ActionBar Stuff
    mActionbar = getSupportActionBar();
    mActionbar.setHomeButtonEnabled(false);

    // Swipe Stuff
    mAdapter = new FragmentAdapter(fm);
    mPager = (ViewPager) findViewById(R.id.viewpager);
    mPager.setAdapter(mAdapter);
    mPager.setOnPageChangeListener(this);

    // Set Tab to Fragment // they're initialized here and accessed in the ViewPager (mPager)
    Fragment1 = new FirstFragment();
    Fragment3 = new ThirdFragment();

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_one_container, Fragment1);
    ft.replace(R.id.fragment_three_container, Fragment3);
    ft.commit();

ViewPager 是Fragment2 的容器,其他容器在上面的代码中说明。

布局文件R.layout.main_tablet_landR.layout.main_tablet_port 位于layout-lard-landlayout-large-port

我的实际问题不是显示,这是可行的,我的问题是方向改变,我得到这个异常:java.lang.IllegalStateException: Can't change container ID of fragment Fragment3

我覆盖了onConfiguratioChange 并尝试使用setContentView(layout) 重新应用布局,并调用布局tablet_land(第一个代码块)和tablet_port(第二个代码块)的方法。 (还有更多..)

有什么办法可以避免这种情况吗?

编辑:没有想法?

【问题讨论】:

    标签: android layout android-fragments actionbarsherlock fragment


    【解决方案1】:

    如果在两个面板布局中没有容器,您必须添加一些代码来清除 fragment3:

    所以,尝试像这样重写您的 XXX_FragmentActivity onCreate 方法:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity);
        // fragment 3 trick
        FragmentManager fm = getSupportFragmentManager();
        Fragment oldFragment3 = fm.findFragmentById(R.id.fragment_three_container);
        View fragment3Container = findViewById(R.id.fragment_three_container);
        if(null==fragment3Container && null!=oldFragment3){
            FragmentTransaction ft = fm.beginTransaction();
            ft.remove(oldFragment3);
            ft.commit();
            fm.executePendingTransactions();
        }
        // other stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2013-02-14
      • 2017-06-29
      • 2016-01-07
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多