android6.0+下如何使用TabHost
How to use TabHost under android 6.0+
好的,我决定在我的小应用程序中使用 TabHost 会很好。
但是,在 Android 6.0+ 下,TabActivity 和其他几个已被弃用。
所以我写了这个:
public class TabMain extends Activity{
@Override
protected void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.tab_main);
TabHost tabHost = (TabHost)findViewById(R.id.tab_main_tabhost);
tabHost.setup();//several lines here....}}
当我 运行 这段代码时,IDE 向我抛出一个 RuntimtException:
"java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?"
而且我发现 ActivityGroup 也被弃用了。
我应该如何绕过它?
你应该使用 TabLayout 和 ViewPager。
试试这个
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"/>
<android.support.v4.view.ViewPager
android:id="@+id/home_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
在你的activity
viewPager = (ViewPager) findViewById(R.id.home_viewpager);
viewPager.setOffscreenPageLimit(4);
if (viewPager != null) {
setupViewPager(viewPager);
}
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
方法是
private void setupViewPager(ViewPager viewPager) {
adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(new Store(), "Store");//fragment class name
adapter.addFragment(new Post(), "GG Connect");//fragment class name
viewPager.setAdapter(adapter);
}
static class Adapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public Adapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
这是我通过数小时的互联网搜索找到的答案 Android Tabs with Fragements。
我认为这是一个可行的解决方案。
ViewPage 和 TabLayout 在 android.support 包中意味着它们支持向后版本,这是我选择不使用它的主要原因。甚至研究 android 的新版本都很难,制作向后兼容的代码更难。
好的,我决定在我的小应用程序中使用 TabHost 会很好。 但是,在 Android 6.0+ 下,TabActivity 和其他几个已被弃用。 所以我写了这个:
public class TabMain extends Activity{
@Override
protected void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.tab_main);
TabHost tabHost = (TabHost)findViewById(R.id.tab_main_tabhost);
tabHost.setup();//several lines here....}}
当我 运行 这段代码时,IDE 向我抛出一个 RuntimtException: "java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?" 而且我发现 ActivityGroup 也被弃用了。 我应该如何绕过它?
你应该使用 TabLayout 和 ViewPager。
试试这个
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="fill"/>
<android.support.v4.view.ViewPager
android:id="@+id/home_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
在你的activity
viewPager = (ViewPager) findViewById(R.id.home_viewpager);
viewPager.setOffscreenPageLimit(4);
if (viewPager != null) {
setupViewPager(viewPager);
}
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
方法是
private void setupViewPager(ViewPager viewPager) {
adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(new Store(), "Store");//fragment class name
adapter.addFragment(new Post(), "GG Connect");//fragment class name
viewPager.setAdapter(adapter);
}
static class Adapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public Adapter(FragmentManager fm) {
super(fm);
}
public void addFragment(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitles.get(position);
}
}
这是我通过数小时的互联网搜索找到的答案 Android Tabs with Fragements。 我认为这是一个可行的解决方案。
ViewPage 和 TabLayout 在 android.support 包中意味着它们支持向后版本,这是我选择不使用它的主要原因。甚至研究 android 的新版本都很难,制作向后兼容的代码更难。