Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航

摘要:
}在onCreate方法中调用initActionBar和intViewPager分别初始化ActionBar和ViewPager。
一、问题描述

  在Android典型界面设计一文中,实现典型滑动导航界面,其实使用ActionBar 也可以轻松实现这一效果,甚至也可实现类似Android典型界面设计(3)的双导航效果。可见ActionBar还是比较强大的,关键要深入进去、灵活的运用,下面我们就使用ActionBar实现如图所示的效果:

Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航第1张

二、本例特点

1、  兼容低版本

2、 使用ActionBar 分体设计(split)

3、 Tab使用自定义View

4、 结合ViewPager实现滑动导航

三、代码讲解:

  1、在项目中加入v7兼容包

  要向下兼容需要在项目中加入v7兼容包的android-support-v7-appcompat,并创建MainActivity时,继承 ActionBarActivity

public class MainActivity extends ActionBarActivity implements TabListener,
OnPageChangeListener{
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initActionBar();
            initViewPager();
        }
        。。。
}

在onCreeate方法中调用initActionBar和intViewPager,分别实现初始化ActionBar和初始化ViewPager。

  2、initActionBar()代码:初始化ActionBar

private void initActionBar(){
        actionBar=super.getSupportActionBar();
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setIcon(R.drawable.sun);
        actionBar.setTitle(" 二手机");
        //设置导航模式为Tabs方式
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        //创建并配置Tab
        createTab(R.layout.nav, R.drawable.icon_home_weixiu_bg, "热点设备");
        createTab(R.layout.nav, R.drawable.icon_home_zzj_bg, "挖掘机");
        createTab(R.layout.nav, R.drawable.icon_home_sharepro_bg, "装载机");
    }

createTab方法:

private void createTab(int layout,int imgId,String title){
        View view=LayoutInflater.from(this).inflate(layout, null);
        ((TextView)view.findViewById(R.id.tvTitle)).setText(title);
        ((ImageView)view.findViewById(R.id.ivNav)).setImageResource(imgId);
        Tab tab=actionBar.newTab().setCustomView(view)//自定义View
                .setTabListener(this);
        actionBar.addTab(tab);
    }

nav.xml :tab的布局文件,实现ICON在Title上方的效果

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:padding="2dp" >
    <ImageView
        android:id="@+id/ivNav"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:scaleType="centerInside"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>
    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/ivNav"
        android:textColor="#fff"/>
</RelativeLayout>

3、initViewPager方法

private String[] titles={"热点设备","二手挖掘机","二手装载机"};
private void initViewPager(){
        mViewPager = (ViewPager)findViewById(R.id.vpList);
        fragList=new ArrayList<Fragment>();
        Bundle bundle=null;
        Fragment frag=null;
        for(int i=0;i<titles.length;i++){
            frag=new MachineFragment();
            bundle=new Bundle();
            bundle.putString("title",titles[i]);
            frag.setArguments(bundle);
            fragList.add(frag);
        }
        adapter=new MachinePagerAdapter(super.getSupportFragmentManager(), fragList);
        mViewPager.setAdapter(adapter);
        mViewPager.setOnPageChangeListener(this);
    }

MachinePagerAdapter适配器:

public class MachinePagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragmentList;
    public MachinePagerAdapter(FragmentManager fm,List<Fragment> list) {
        super(fm);
        this.fragmentList=list;
    }
    public Fragment getItem(int arg0) {
        return fragmentList.get(arg0);
    }
    public int getCount() {
        return fragmentList.size();
    }
    @Override  
    public int getItemPosition(Object object) {  
       return POSITION_NONE;  //没有找到child要求重新加载
    }  
}

MachineFragment:可根据具体情况进行设计,这里仅显示一个文本框

public class MachineFragment extends Fragment {
    private String title;
    public void setArguments(Bundle bundle) {
            title=bundle.getString("title");//接受传入的参数
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            TextView textView = new TextView(getActivity());
            textView.setText(title);textView.setTextSize(20);
            textView.setTextColor(Color.RED);textView.setGravity(Gravity.CENTER);
            LinearLayout layout = new LinearLayout(getActivity());
            LayoutParams params = new LayoutParams
(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            layout.setBackgroundColor(Color.WHITE);
            layout.addView(textView, params);
            return layout;
        }
}

4、实现侦听

implements  OnPageChangeListener当View滑动时切换Tab
    public void onPageScrollStateChanged(int arg0) {  }
    public void onPageScrolled(int arg0, float arg1, int arg2) { }
    public void onPageSelected(int idx) {
        actionBar.selectTab(actionBar.getTabAt(idx));
    }
implements  TabListener当单击tab时切换ViewPager
    public void onPageScrollStateChanged(int arg0) {}
        public void onPageScrolled(int arg0, float arg1, int arg2) {}
    public void onPageSelected(int idx) {
        actionBar.selectTab(actionBar.getTabAt(idx));
    }

5、ActionBar Menu

  main.xml菜单配置,使用xmlns:app="http://schemas.android.com/apk/res-auto"兼容低版本,并且使用app:showAsAction否则showAsAction将失效,即便设置为always菜单项还是出现在Overflow中

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item  android:id="@+id/action_share"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:title="分享"
        android:icon="@drawable/share_ico"
        />
    <item  android:id="@+id/action_common"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:title="评论"
        android:icon="@drawable/com_btn"
        />
</menu>

产生选项菜单

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

响应单击菜单

public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
        case R.id.action_share:
            Toast.makeText(this, "点击了分享", Toast.LENGTH_LONG).show();
            break;
        case R.id.action_common:
            Toast.makeText(this, "点击了评论", Toast.LENGTH_LONG).show();
            break;    
        }    
        return super.onOptionsItemSelected(item);
    }

6、实现ActionBar 的分体设计

让菜单选项在底部排列显示

Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航第2张

  在AndroidManifest.xml中给MainActivity添加android:uiOptions="splitActionBarWhenNarrow"属性即可

四、ActionBar 样式

  如果兼容低版本Activity必须使用Theme.AppCompat主题样式,可在这个主题基础上定义ActionBar的样式

<style name="Theme.MyActionBar" parent="@style/Theme.AppCompat.Light"></style>

Actionbar样式比较多而且要考虑兼容性,比较麻烦,推荐通过Android Action Bar Style Generator可轻松生成

网址:http://jgilfelt.github.io/android-actionbarstylegenerator/

Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航第3张

  想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。

  疑问咨询或技术交流,请加入官方QQ群:JRedu技术交流 (452379712)

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

免责声明:文章转载自《Android典型界面设计(6)——ActionBar Tab+ViewPager+Fagment实现滑动导航》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【JS笔记】5.3 Date类型ubuntu16创建文件夹无root权限下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

语音信号处理(声速,回声,音高,界面设计PyQt5)_Python语言

def YuSu(self): #语速设置 f = wave.open(r"test.wav", "rb") # 读取格式信息 # (nchannels, sampwidth, framerate, nframes, comptype, compname) params...

(四)WebGIS中通过行列号来换算出多种瓦片的URL 之离线地图

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 在前面我花了两个篇幅来讲解行列号的获取,也解释了为什么要获取行列号。在这一章,我将把常见的几种请求瓦片时的URL样式罗列出来,并且给出大致的解释。 我在这里将地图分为离线地图和在线地图。所谓离线地图,即保存在本地而没有发...

webpack踩坑之路 (2)——图片的路径与打包

刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不能打包进我们的目标文件夹里(bundle)。下面我们就来分析下在webpack项目中图片的应用场景。 在实际生产中有以下几种图片的引用方式: 1. HTML文件中img标签的src属性引用或者内嵌样式引用 <img src="photo.jpg" /&g...

带你由浅入深探索webpack4(一)

 相信你或多或少也听说过webpack、gulp等这些前端构建工具。近年来webpack越来越火,可以说成为了前端开发者必备的工具。如果你有接触过vue或者react项目,我想你应该对它有所了解。 这几天我重新整理了一下webpack中知识点,把一些常用到的总结出来,希望能帮助到大家以及加深自己对webpack的理解。 (由于我在写这篇文章的时候webpa...

android中使用toolbar

系统默认使用的是ActionBar,就是界面中的标题栏,但是由于ActionBar设计的原因,被限定只能位于活动的顶部,从而不能实现Material Design效果,所以官方建议使用Toolbar替换掉ActionBar 下面来看一下,如果使用Toolbar 1、首先先去掉默认的ActionBar,修改styles.xml,这个styles.xml是项目...

【Android 应用开发】 ActionBar 基础

作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/39204393 示例代码下载 :  -- GitHub : https://github.com/han1202012/Octopus_ActionBar.git -...