【发布时间】:2012-11-26 21:35:46
【问题描述】:
基本上,我要问的内容与打开屏幕上的 Twitter 应用程序 Plume 中的功能相同。在小屏幕(手机)上,您可以来回滑动三个选项卡。我有这个确切的设置。在平板电脑上它看起来很糟糕,因为有太多的空白。在 Plume 中,他们只是在屏幕上加载了所有三个选项卡——没有滑动,它们都显示出来,每个都占据屏幕的 1/3。更好地利用空间。你是怎么做到的?
这是我的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_layout);
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mViewPager = (ViewPager) findViewById(R.id.viewpager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOffscreenPageLimit(3);
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
actionBar.addTab(actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
catName = getSharedPreferences("catName", Context.MODE_PRIVATE);
itemName = getSharedPreferences("itemName", Context.MODE_PRIVATE);
mViewPager.setCurrentItem(1);
}
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
mViewPager.setCurrentItem(tab.getPosition());
}
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment f = null;
switch (position) {
case 0: {
f = new MasterFrag();
Bundle args = new Bundle();
f.setArguments(args);
break;
}
case 1: {
f = new FeaturedFrag();
Bundle args = new Bundle();
f.setArguments(args);
break;
}
case 2: {
f = new TopFrag();
Bundle args = new Bundle();
f.setArguments(args);
break;
}
default:
throw new IllegalArgumentException("not this many fragments: "
+ position);
}
return f;
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.mastercattab1).toUpperCase(Locale.ENGLISH);
case 1:
return getString(R.string.mastercattab2).toUpperCase(Locale.ENGLISH);
case 2:
return getString(R.string.mastercattab3).toUpperCase(Locale.ENGLISH);
}
return null;
}
}
这是我的 XML 片段布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="horizontal" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</TabHost>
</LinearLayout>
【问题讨论】:
-
对不同尺寸使用不同的布局developer.android.com/guide/practices/tablets-and-handsets.html ... 对于平板电脑布局应该包含 3 个用于手机视图分页器的占位符/片段... 然后在 onCreate of Activity 中,您应该检查哪个视图退出分页器或片段和基于此设置活动为标签或手机正确...
-
我已编辑添加我自己的 XML 布局。另外,我这样做的方式是:一个带有三个内部 ListFragment 的 FragmentActivity。在每个 ListFragment 中都有一个 onActivityCreate,其中加载了不同的 XML 文件。我假设您在谈论主要片段活动的 onCreate ?这种方法兼容吗?
-
这一切都在“创建单窗格和多窗格布局”中...如果您使用支持库,它应该是兼容的...您应该只担心 ActionBar 的东西(对不起,我现在在 Android 上,很难提供更准确的答案)
-
@Luksprog 我现在甚至不应该使用兼容性库。我的目标是 Androind 4.0+(在早期我打算让它向后兼容)。但它有效吗?
-
@Luksprog 我没有因此而崩溃。由于我不是针对旧的 SDK 版本,我应该只转储支持库(和所有引用)吗?这会提高性能/稳定性吗?
标签: android android-fragments android-tabs