ActionBar + ViewPager(PagerSlidingTabStrip)

Posted wzjhoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); } } }

效果如图:

技术分享

在游记的Fragment中,使用了不规则的瀑布流,关于瀑布流的使用请參考下一篇博文。










以上是关于ActionBar + ViewPager(PagerSlidingTabStrip)的主要内容,如果未能解决你的问题,请参考以下文章

Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPag

Android编程心得-使用ActionBar+Fragment+ViewPager实现动态切换Menu效果

FragmentPagerAdapter+ViewPager实现Tab切换效果

横向中的Android actionBar选项卡不占据全宽

Android 5.0(L) ToolBar(替代ActionBar) 实战

滚动 ListView 时推出/拉入 ActionBar