既然是要实现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)的更多相关文章

  1. Android典型界面设计(8) ——ViewPager+PagerSlidingTabStrip实现双导航

    一.问题描述 PagerSlidingTabStrip是android开源项目,指示器控件.官网地址:https://github.com/astuetz/PagerSlidingTabStrip 该 ...

  2. Android之官方导航栏之Toolbar(Toolbar+DrawerLayout+ViewPager+PagerSlidingTabStrip)

    通过前几篇文章,我们对Android的导航栏有了一定的了解认识,本次文章将对Toolbar进行综合应用,主要结合DrawerLayout.ViewPager.PagerSlidingTabStrip一 ...

  3. android actionbar viewpager 实现类微信主界面布局

    1 Activity public class MainActivity extends FragmentActivity { private ViewPager pager; private Act ...

  4. 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

    Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...

  5. PagerSlidingTabStrip介绍及使用,让ViewPager更绚丽

    转载请注明出处http://blog.csdn.net/harryweasley/article/details/42290595,谢谢. 以前一直想着,ViewPager中间的那个横线怎么跟着屏幕的 ...

  6. 安卓开发_深入学习ViewPager控件

    一.概述 ViewPager是android扩展包v4包(android.support.v4.view.ViewPager)中的类,这个类可以让用户左右切换当前的view. ViewPager特点: ...

  7. Navigation Bar options for Android (based on photosomething project)

    1, Tab控件即标签页,可以在一页中切换显示n页内容,要使用此效果,需要用到TabHost和Tabwidget类.(过时了?) Tab控件具有两种实现过程,一是在同一个Activity中切换显示不同 ...

  8. 3种方式实现可滑动的Tab

    1. 第一种,使用 TabHost + ViewPager 实现 该方法会有一个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显示(准确的说是加载),只有点击 ...

  9. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

随机推荐

  1. [HDU6252]Subway Chasing

    题目大意: 一条直线上有n个点,两个人在直线上走,保持x的距离. 告诉你m条信息,告诉你一个人在ab之间时,另一个人在cd之间. 问这些信息是否矛盾,如果不矛盾,求相邻两点之间的最小距离. 思路: m ...

  2. Problem Z: 零起点学算法22——求正弦和余弦

    #include<stdio.h> #include <math.h> int main() { int n; ); double a,b; while(scanf(" ...

  3. IntelliJ 常用设置

    一.智能代码提示忽略大小写 打开设置(CTRL+ALT+S)搜索editor,找到“Code Completion”->点击Case sensitive completion后面的选择框,选中N ...

  4. 7zip File: How to Uncompress 7z files on Ubuntu, Debian, Fedora

    转:http://www.thegeekstuff.com/2010/04/7z-7zip-7za-file-compression/ Question: How do I uncompress a ...

  5. zk client获取数据

    获取数据 它返回znode的关联数据和指定znode的元数据.你将获得信息,例如上次修改数据的时间,修改的位置以及数据的相关信息.此CLI还用于分配监视器以显示数据相关的通知. 语法 get /pat ...

  6. Shiro+SpringMVC 实现更安全的登录(加密匹配&登录失败超次数锁定帐号)

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/48518003 前言 初学shiro,shiro提供了一系列安全相关的解决方案,根据官方的介绍 ...

  7. css活用,评分点击星星

    1.字符图集 2.css样式 .cleanfloat::after{display: block; clear: both; content:""; visibility: hid ...

  8. 通过API获取 Portus+registry docker仓库信息

    接口获取docker centos 镜像的 tag 列表脚本 # -*- encoding:utf-8 -*- import requests import json ""&quo ...

  9. KVO(Key Value Observing)

    *KVO能够监听某个对象属性的改变 原理:仅仅要给一个对象注冊一个监听,那么在执行时, 系统就会自己主动给该对象生成一个子类对象,而且重写自己主动生成的子类对象的被监听属性的set方法.然后在set方 ...

  10. HDU 4289 Control (最小割 拆点)

    Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...