平板电脑布局,根据屏幕方向更改错误
Posted
技术标签:
【中文标题】平板电脑布局,根据屏幕方向更改错误【英文标题】:Tablet Layout, change depending on screen orientation Error 【发布时间】:2012-10-16 01:45:57 【问题描述】:基本上我的问题有点“简单”:我有这个平板电脑横向布局:
如果用户将平板电脑旋转为纵向模式,并且想要将布局更改为以下布局:
在第一个,横向,布局UI同时显示两个片段,Fragment1
在左边,Fragment2
在右边。 Fragment2
的容器是一个ViewPager
,其中还包含Fragment3
。 Fragment3
对用户滑动可见,或单击ActionBar
中的选项卡。
在第二个,纵向,布局UI同时显示所有三个Fragment
s,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
替换为其他 Fragment
s(用于导航)。
到目前为止一切都很好,我的纵向布局代码类似:
// 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_land
和R.layout.main_tablet_port
位于layout-lard-land
和layout-large-port
。
我的实际问题不是显示,这是可行的,我的问题是方向改变,我得到这个异常:java.lang.IllegalStateException: Can't change container ID of fragment Fragment3
我覆盖了onConfiguratioChange
并尝试使用setContentView(layout)
重新应用布局,并调用布局tablet_land
(第一个代码块)和tablet_port
(第二个代码块)的方法。 (还有更多..)
有什么办法可以避免这种情况吗?
编辑:没有想法?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于平板电脑布局,根据屏幕方向更改错误的主要内容,如果未能解决你的问题,请参考以下文章