基本上我要问的是与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 Fragment布局:
<?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>
答案 0 :(得分:3)
使用您最近的答案和工作的xml布局以及下面的代码,我认为这看起来很简单! :)
编辑:所以想法是你有两个XML布局,一个用于中小屏幕(第一篇文章中的xml),另一个用于平板电脑,大型和xlarge(工作答案中的xml)。
理论上你可以在这两者之间切换:
public class YourClassName extends FragmentActivity {
static boolean isTablet = false;
static ActionBar actionBar = null;
public void onCreate(Bundle savedInstanceState) {
actionBar = getActionBar();
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE) {
setContentView(R.layout.single_pane_fragment_layout);
isTablet = true;
} else {
setContentView(R.layout.viewpager_fragment_layout);
}
...
然后您可以尝试在片段活动中的onTabSelected中调用此代码,但您可能希望在onCreateView下的片段内调用它。注意我将变量设为静态。
示例:
if (YourClassName.actionBar != null && YourClassName.actionBar.isShowing() && YourClassName.isTablet) {
YourClassName.actionBar.removeAllTabs();
}
此处有关于ActionBar.hide()和.removeAllTabs()的更多信息: http://developer.android.com/reference/android/app/ActionBar.html#hide%28%29
答案 1 :(得分:0)
我只是使用Google网站上的代码作为示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frags">
<!-- "Fragment A" -->
<fragment class="com.example.android.TitlesFragment"
android:id="@+id/list_frag"
android:layout_width="@dimen/titles_size"
android:layout_height="match_parent"/>
<!-- "Fragment B" -->
<fragment class="com.example.android.DetailsFragment"
android:id="@+id/details_frag"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
然后我必须在两个片段上方添加ViewPager
。