ActionBar + ViewPager(PagerSlidingTabStrip)
既然是要实现ActionBar。那么第一步当然就是编辑menu文件夹下的main.xml文件了。代码例如以下所看到的:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity" > <item
android:id="@+id/action_search"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/actionbar_search_icon"
android:showAsAction="ifRoom|collapseActionView"
android:title="@string/action_search"/>
<item
android:id="@+id/action_my_travels"
android:icon="@drawable/actionbar_add_icon"
android:showAsAction="ifRoom"
android:title="@string/action_my_travels"/> <item android:id="@+id/action_offline_browse"
android:title="@string/action_offline_browse"
android:showAsAction="never" />
<item android:id="@+id/action_feedback"
android:title="@string/action_feedback"
android:showAsAction="never" />
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:showAsAction="never" />
<item android:id="@+id/action_photo_test"
android:title="@string/action_photo_test"
android:showAsAction="never" />
</menu>
PagerSlidingTabStrip是GitHub上的一个开源框架,由Andreas Stuetz编写,它能够完毕和ActionBar Tab基本类似的功能,只是因为是全然开源的,我们能够任意改动当中的代码,因而扩展性很好。
之后是activity_main的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <com.francis.changtravels.utils.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="40dp" /> <android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tabs" /> </RelativeLayout>
比較简单,当中放置了两个控件,PagerSlidingTabStrip在最顶部,ViewPager在PagerSlidingTabStrip的以下。
接着创建TravelsFragment、SubjectFragment、DestinationFragment,分别相应着游记、专题、目的地这三个界面。Fragment中仅仅需放置一个TextView用于表示这个界面就可以,TravesFragment(SubjectFragment、DestinationFragment就不说啦)例如以下所看到的:
package com.francis.changtravels.fragment; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.francis.changtravels.R;
/**
* Created by Francis on 14-9-18.
*/
public class TravelsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.photo_wall_falls_demo,container,false);
return rootView;
}
}
当中photo_wall_falls_demo是自己定义的布局。这里先不赘述(主要是讲ViewPager嘛)
最后改动MainActivity中的代码。增加PagerSlidingTabStrip的配置。例如以下所看到的:
package com.francis.changtravels.activity; import java.lang.reflect.Field;
import java.lang.reflect.Method; import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewConfiguration;
import android.view.Window; import com.francis.changtravels.utils.PagerSlidingTabStrip;
import com.francis.changtravels.fragment.DestinationFragment;
import com.francis.changtravels.R;
import com.francis.changtravels.fragment.SubjectFragment;
import com.francis.changtravels.fragment.TravelsFragment; public class MainActivity extends FragmentActivity { /**
* 游记界面的Fragment
*/
private TravelsFragment travelsFragment; /**
* 专题界面的Fragment
*/
private SubjectFragment subjectFragment; /**
* 目的地界面的Fragment
*/
private DestinationFragment destinationFragment; /**
* PagerSlidingTabStrip的实例
*/
private PagerSlidingTabStrip tabs; /**
* 获取当前屏幕的密度
*/
private DisplayMetrics dm; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setOverflowShowingAlways();
dm = getResources().getDisplayMetrics();
ViewPager pager = (ViewPager) findViewById(R.id.pager);
tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
// 为ViewPager实例加入自己定义的Adapter
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
// 将ViewPager的实例设置到了PagerSlidingTabStrip中
tabs.setViewPager(pager);
// 对PagerSlidingTabStrip的细节进行配置
setTabsValue();
} /**
* 对PagerSlidingTabStrip的各项属性进行赋值。 */
private void setTabsValue() {
// 设置Tab是自己主动填充满屏幕的
tabs.setShouldExpand(true);
// 设置Tab的切割线是透明的
tabs.setDividerColor(Color.TRANSPARENT);
// 设置Tab底部线的高度
tabs.setUnderlineHeight((int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 1, dm));
// 设置Tab Indicator的高度
tabs.setIndicatorHeight((int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, dm));
// 设置Tab标题文字的大小
tabs.setTextSize((int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, 16, dm));
// 设置Tab Indicator的颜色
tabs.setIndicatorColor(Color.parseColor("#45c01a"));
// 设置选中Tab文字的颜色 (这是我自己定义的一个方法)
tabs.setSelectedTextColor(Color.parseColor("#45c01a"));
// 取消点击Tab时的背景色
tabs.setTabBackground(0);
} public class MyPagerAdapter extends FragmentPagerAdapter { public MyPagerAdapter(FragmentManager fm) {
super(fm);
} private final String[] titles = { "游记", "专题", "目的地" }; @Override
public CharSequence getPageTitle(int position) {
return titles[position];
} @Override
public int getCount() {
return titles.length;
} @Override
public Fragment getItem(int position) {
switch (position) {
case 0:
if (travelsFragment == null) {
travelsFragment = new TravelsFragment();
}
return travelsFragment;
case 1:
if (subjectFragment == null) {
subjectFragment = new SubjectFragment();
}
return subjectFragment;
case 2:
if (destinationFragment == null) {
destinationFragment = new DestinationFragment();
}
return destinationFragment;
default:
return null;
}
} } @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
return false;
} @Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
}
}
}
return super.onMenuOpened(featureId, menu);
} private void setOverflowShowingAlways() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
} catch (Exception e) {
e.printStackTrace();
}
} }
效果如图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZnJhbmNpc3NoaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
在游记的Fragment中,使用了不规则的瀑布流,关于瀑布流的使用请參考下一篇博文。
ActionBar + ViewPager(PagerSlidingTabStrip)的更多相关文章
- Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航
一.问题描述 PagerSlidingTabStrip是android开源项目,指示器控件.官网地址:https://github.com/astuetz/PagerSlidingTabStrip 该 ...
- Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)
通过前几篇文章,我们对Android的导航栏有了一定的了解认识,本次文章将对Toolbar进行综合应用,主要结合DrawerLayout.ViewPager.PagerSlidingTabStrip一 ...
- android actionbar viewpager 实现类微信主界面布局
1 Activity public class MainActivity extends FragmentActivity { private ViewPager pager; private Act ...
- 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航
Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...
- PagerSlidingTabStrip介绍及使用,让ViewPager更绚丽
转载请注明出处http://blog.csdn.net/harryweasley/article/details/42290595,谢谢. 以前一直想着,ViewPager中间的那个横线怎么跟着屏幕的 ...
- 安卓开发_深入学习ViewPager控件
一.概述 ViewPager是android扩展包v4包(android.support.v4.view.ViewPager)中的类,这个类可以让用户左右切换当前的view. ViewPager特点: ...
- Navigation Bar options for Android (based on photosomething project)
1, Tab控件即标签页,可以在一页中切换显示n页内容,要使用此效果,需要用到TabHost和Tabwidget类.(过时了?) Tab控件具有两种实现过程,一是在同一个Activity中切换显示不同 ...
- 3种方式实现可滑动的Tab
1. 第一种,使用 TabHost + ViewPager 实现 该方法会有一个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显示(准确的说是加载),只有点击 ...
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
随机推荐
- linux-更改文件属性-chattr与lsattr
chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] 文件 最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这 ...
- winfrom GDI知识
c#使用GDI+简单绘图 http://blog.csdn.net/smartsmile2012/article/details/30255303 NET3.5 GDI+ 图形操作1 http:// ...
- JavaScript中的模块化之AMD和CMD
前言: 为什么我们需要模块化开发,模块化开发的好处有哪些? 首先我们先说一下非模块化的开发方式带来的弊端. 非模块化开发中会导致一些问题的出现,变量和函数命名可能相同,会造成变量污染和冲突,并且出错时 ...
- Firefox中好用的几个快捷键
对于一些经常用FF(firefox)上网的朋友来说, 怎样加快上网的操作速度呢, 使用Firefox快捷键是很好的方法. 本人也经常遇到一些Firefox的很好的快捷键,现在我来告诉大家Firefox ...
- Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 --转
Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 通过前6节的Demo制作演示,大家应该已经相当熟悉这款Silverlight-2D游戏场景 ...
- $apply用法注意
Angular为我们提供了一些接口绑定JavaScript代码和数据,而绑定数据改变和更新angular则是使用$apply方法实现的. $apply 进行数据变化检查的实际上是$digest函数,但 ...
- iptables配置
iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTAB ...
- javascript快速入门10--运算符,语句
一元运算符 一元运算符只有一个参数,即要操作的对象或值.它们是 ECMAScript 中最简单的运算符. delete 运算符删除对以前定义的对象属性或方法的引用.例如: var obj = new ...
- paste,两个文件相同行拼接在一起的shell命令
今天又学到一个命令,果然厉害 参考这里 http://blog.csdn.net/anders_zhuo/article/details/8461641
- grid 布局 属性示例
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...