Android导航Tab栏实现
前言
Navigation Tabs
例如以下图所看到的,这是Navigation Tabs的典型演示样例:
public class MainUIActivity extends FragmentActivity {
private static final int CACHE_PAGER = 5; private ViewPager mViewPager;
private MainUIPagerAdapter mainUIPagerAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); mViewPager = new ViewPager(this);
mViewPager.setId(11);
setContentView(mViewPager); buildPhoneInterface();
} private void buildPhoneInterface() {
buildViewPager();
buildActionBarAndViewPagerTitles();
getActionBar().setSelectedNavigationItem(1);
} private void buildViewPager() {
mViewPager = (ViewPager) findViewById(R.id.mainviewpager);
mainUIPagerAdapter = new MainUIPagerAdapter(getFragmentManager());
mViewPager.setOffscreenPageLimit(CACHE_PAGER);
mViewPager.setAdapter(mainUIPagerAdapter);
mViewPager.setOnPageChangeListener(onPageChangeListener);
} private void buildActionBarAndViewPagerTitles() {
// 获取action bar的引用
ActionBar actionBar = getActionBar();
// 设置action bar的模式为导航模式,这样。action bar才会显示Tab标签
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // 仅仅显示navigation tabs,不显示actionbar上面的标题等布局
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowHomeEnabled(false); // 构建一个自己定义的adapter。将viewpager的切换和action bar tab的点击关联起来
MainTabListener mainTabListener = new MainTabListener();
actionBar.addTab(actionBar.newTab().setText(R.string.first).setTabListener(mainTabListener)); actionBar.addTab(actionBar.newTab().setText(R.string.second).setTabListener(mainTabListener)); actionBar.addTab(actionBar.newTab().setText(R.string.thrid).setTabListener(mainTabListener)); actionBar.addTab(actionBar.newTab().setText(R.string.fourth).setTabListener(mainTabListener));
} private Fragment getFirstFragment() {
return getFragmentManager().findFragmentByTag(FirstFragment.class.getName());
} private Fragment getSecondFragment() {
return getFragmentManager().findFragmentByTag(SecondFragment.class.getName());
} private Fragment getThirdFragment() {
return getFragmentManager().findFragmentByTag(ThirdFragment.class.getName());
} private Fragment getFourthFragment() {
return getFragmentManager().findFragmentByTag(FourthFragment.class.getName());
} // 构建一个简单的Viewpager切换监听类,将tab的点击与viewpager的切换关联起来
ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
getActionBar().setSelectedNavigationItem(position);
} }; private class MainUIPagerAdapter extends AppFragmentPagerAdapter {
List<Fragment> list = new ArrayList<Fragment>(); public MainUIPagerAdapter(FragmentManager fm) {
super(fm); if (getFirstFragment() == null) {
list.add(new FirstFragment());
} else {
list.add(getFirstFragment());
} if (getSecondFragment() == null) {
list.add(new SecondFragment());
} else {
list.add(getSecondFragment());
} if (getThirdFragment() == null) {
list.add(new ThirdFragment());
} else {
list.add(getThirdFragment());
} if (getFourthFragment() == null) {
list.add(new FourthFragment());
} else {
list.add(getFourthFragment());
}
} @Override
public Fragment getItem(int position) {
return list.get(position);
} @Override
protected String getTag(int position) {
List<String> tagsList = new ArrayList<String>();
tagsList.add(FirstFragment.class.getName());
tagsList.add(SecondFragment.class.getName());
tagsList.add(ThirdFragment.class.getName());
tagsList.add(FourthFragment.class.getName()); return tagsList.get(position);
} @Override
public int getCount() {
return list.size();
}
} private class MainTabListener implements ActionBar.TabListener {
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mViewPager.getCurrentItem() != tab.getPosition()) {
mViewPager.setCurrentItem(tab.getPosition());
}
} @Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
} @Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
}
自己定义样式
<activity
android:name="××××××"
android:theme="@android:style/Theme.Holo.Light">
主题的定义位于Android源代码的framework文件夹,路径为:“frameworks/base/core/res/res/values/themes.xml”,当中与Action Bar相关的属性例如以下:
<!-- Action bar styles -->
1476 <item name="actionDropDownStyle">@android:style/Widget.Holo.Light.Spinner.DropDown.ActionBar</item>
1477 <item name="actionButtonStyle">@android:style/Widget.Holo.Light.ActionButton</item>
1478 <item name="actionOverflowButtonStyle">@android:style/Widget.Holo.Light.ActionButton.Overflow</item>
1479 <item name="actionModeBackground">@android:drawable/cab_background_top_holo_light</item>
1480 <item name="actionModeSplitBackground">@android:drawable/cab_background_bottom_holo_light</item>
1481 <item name="actionModeCloseDrawable">@android:drawable/ic_cab_done_holo_light</item>
1482 <item name="actionBarTabStyle">@style/Widget.Holo.Light.ActionBar.TabView</item>
1483 <item name="actionBarTabBarStyle">@style/Widget.Holo.Light.ActionBar.TabBar</item>
1484 <item name="actionBarTabTextStyle">@style/Widget.Holo.Light.ActionBar.TabText</item>
1485 <item name="actionModeStyle">@style/Widget.Holo.Light.ActionMode</item>
1486 <item name="actionModeCloseButtonStyle">@style/Widget.Holo.Light.ActionButton.CloseMode</item>
1487 <item name="android:actionBarStyle">@android:style/Widget.Holo.Light.ActionBar.Solid</item>
1488 <item name="actionBarSize">@dimen/action_bar_default_height</item>
1489 <item name="actionModePopupWindowStyle">@android:style/Widget.Holo.Light.PopupWindow.ActionMode</item>
1490 <item name="actionBarWidgetTheme">@null</item>
1491
1492 <item name="actionModeCutDrawable">@android:drawable/ic_menu_cut_holo_light</item>
1493 <item name="actionModeCopyDrawable">@android:drawable/ic_menu_copy_holo_light</item>
1494 <item name="actionModePasteDrawable">@android:drawable/ic_menu_paste_holo_light</item>
1495 <item name="actionModeSelectAllDrawable">@android:drawable/ic_menu_selectall_holo_light</item>
1496 <item name="actionModeShareDrawable">@android:drawable/ic_menu_share_holo_light</item>
1497 <item name="actionModeFindDrawable">@android:drawable/ic_menu_find_holo_light</item>
1498 <item name="actionModeWebSearchDrawable">@android:drawable/ic_menu_search_holo_light</item>
1499
1500 <item name="dividerVertical">?android:attr/listDivider</item>
1501 <item name="dividerHorizontal">?android:attr/listDivider</item>
1502 <item name="buttonBarStyle">@android:style/Holo.Light.ButtonBar</item>
1503 <item name="buttonBarButtonStyle">?android:attr/borderlessButtonStyle</item>
1504 <item name="segmentedButtonStyle">@android:style/Holo.Light.SegmentedButton</item>
与Navigation Tab相关的属性例如以下:
Android导航Tab栏实现的更多相关文章
- Android 常用UI控件之TabHost(5)Tab栏在底部且在最上层也不盖tab页
tab栏在底部 <TabHost android:id="@android:id/tabhost" android:layout_width="match_pare ...
- Android典型界面设计(3)——访网易新闻实现双导航tab切换
一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...
- Android Actionbar Tab 导航模式
Android Actionbar Tab 下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果. 初次尝试 package com.example.it ...
- 使用vue封装一个tab栏切换的左侧导航栏的公共组件
首先看最终效果图: 1.compent文件夹里添加tab文件夹,里面创建index.vue index.js index.css index.vue内的template部份代码如下:(最新更正:代码 ...
- Android典型界面设计-访网易新闻实现双导航tab切换
一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...
- ViewPage显示Fragment集合实现左右滑动并且出现tab栏--第三方开源--SlidingTabLayout和SlidingTabStrip实现
注意:有关Fragment的方法和ViewPager的全部是android.support.v4包的,否则会报很多的错误 MainActivity: package com.zzw.fragmentt ...
- HTMLCSS--案例| 超链接美化 | 模态框 | tab栏选项卡
一.超链接美化 二.模态框 三.tab栏选项卡 -------------------------------------------- 一.超链接美化 <!DOCTYPE html> & ...
- Vue(小案例)底部tab栏和顶部title栏的实现
---恢复内容开始--- 一.前言 1.底部tab栏实现 2.顶部title栏实现 二.主要内容 1.底部tab栏实现(将底部导航提取到公共的组件中) 具体效果:当点击切换不同的tab的时候,对应 ...
- react native底部tab栏切换
1.安装tab栏插件 npm i react-native-tab-navigator --save 2.引入对应的组件和tab插件 import { Platform, StyleSheet, Te ...
随机推荐
- js常见语法错误
“Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...
- 浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
html_entity_decode():把html实体转换为字符. $str = "just atest & 'learn to use '"; echo html_en ...
- 如何绑定host
绑定host一般分为windows和linux下两种情况. windows下,首先打开host文件,其操作步骤 ,打开 C:\Windows\System32\Drivers\etc\hosts的文件 ...
- Centos6.6 yum源更新
1备份: cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d//CentOS-Base.repo.ori 2下载: wget -O /etc/y ...
- 关于iptables允许samba的问题
今天同事跟我说他们部门的共享不能用了,想了想,最近变更的只有iptables,于是看看是否是这个原因,发现没有允许samba的入站和出站规则,我的iptables规则默认是所有都drop的,但是不知确 ...
- spring中IOC的简单使用
spring的ioc主要就是依赖注入,有基于构造器的依赖注入还有通过设值注入,这里我只简单的实现设值注入的方法,通过spring的依赖管理,我们可以很方便的了解各层之间的依赖关系,降低了各层之间的耦合 ...
- Linux学习总结(11)——Linux文件查找
Linux下的常用查找命令 locate whereis which find locate -i, 忽略大小写 find 根据文件名或正则表达式搜索 -name 条件限制 -a 与条 ...
- 对jvm进行gc的时间、数量、jvm停顿时间的监控
在jdk中一个类可以获得gc的信息: public static void main(String[] args) { List<GarbageCollectorMXBean> garba ...
- Android基础笔记(十三)- 内容提供者原理和简单使用
为什么要有内容提供者 内容提供者的工作原理 使用内容解析者对内容提供者进行增删改查操作 利用内容提供者和内容解析者备份手机短信 利用内容提供者插入短信 为什么要有内容提供者 内容提供者技术的目的是: ...
- java匿名内部类的使用注意事项
1.首先匿名内部类要继承自抽象基类或者实现基类接口 like this abstract class Seed{ int cnt; public Seed(int x){ cnt=x; } abstr ...