学习内容来自“慕课网”

网站上一共有4种方法来实现APP主界面的TAB方法

这里学习第一种

ViewPager实现Tab

布局文件有7个,

主界面acitivity.layout

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<include layout="@layout/top"/> <android.support.v4.view.ViewPager
android:id="@+id/id_viewpager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight=""> </android.support.v4.view.ViewPager> <include layout="@layout/bottom"/>
</LinearLayout>

activity_main.xml

头部部分top.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@drawable/title_bar"
android:layout_height="45dp"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:text="微信"
android:textColor="#ffffff"
android:textSize="20sp"
android:textStyle="bold" /> </LinearLayout>

top.xml

底部部分bottom.xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<include layout="@layout/top"/> <android.support.v4.view.ViewPager
android:id="@+id/id_viewpager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight=""> </android.support.v4.view.ViewPager> <include layout="@layout/bottom"/>
</LinearLayout>

bottom.xml

这里有个需要注意的地方,就是ImageButton  他有一个属性android:clickable="false"

注意点在于为LinearLayout设置监听器的时候,会出现点击文字能响应监听事件,而点击图片不会响应的情况,问题在于LinearLayout会把监听事件先交给ImageButton,因为它是可以点击的,而ImageButton中未实现监听器,所以不能响应。解决方法就是设置它不能被点击。在XML文件中,添加android:clickable="false",就可以。

(大家可以试试没有这行属性的情况下,点击图片是否有响应)

还有4个对应功能的layout

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="微信"
android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>

tab(相同的四个)

Mainactivity.java文件

 package com.example.viewpager_tab;

 import java.util.ArrayList;
import java.util.List; import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Gallery.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout; public class MainActivity extends Activity implements OnClickListener{ private ViewPager mViewPager;
private PagerAdapter mAdapter;
private List<View> mviews = new ArrayList<View>(); //Tab
private LinearLayout mTabweixin;
private LinearLayout mTabset;
private LinearLayout mTabfrd;
private LinearLayout mTabadd; private ImageButton mweixin_image;
private ImageButton mfrd_image;
private ImageButton madd_image;
private ImageButton mset_image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); initView(); //初始化 initEvent();//初始化事件 } private void initEvent(){
mTabweixin.setOnClickListener(this);
mTabadd.setOnClickListener(this);
mTabset.setOnClickListener(this);
mTabfrd.setOnClickListener(this); //设置view左右滑动的响应事件
mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
int currentItem = mViewPager.getCurrentItem();
resgmit();
switch (currentItem) {
case :
mweixin_image.setImageResource(R.drawable.tab_weixin_pressed);
break;
case :
madd_image.setImageResource(R.drawable.tab_address_pressed);
break;
case :
mfrd_image.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case :
mset_image.setImageResource(R.drawable.tab_settings_pressed);
break;
default:
break;
} } @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub } @Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub }
});
} private void initView(){
mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
//layout
mTabadd = (LinearLayout) findViewById(R.id.id_tab_add);
mTabfrd = (LinearLayout) findViewById(R.id.id_tab_frd);
mTabset = (LinearLayout) findViewById(R.id.id_tab_set);
mTabweixin = (LinearLayout) findViewById(R.id.id_tab_weixin); //imagebutton
mweixin_image = (ImageButton) findViewById(R.id.id_tab_weixin_image);
madd_image = (ImageButton) findViewById(R.id.id_tab_add_image);
mfrd_image = (ImageButton) findViewById(R.id.id_tab_frd_image);
mset_image = (ImageButton) findViewById(R.id.id_tab_set_image); LayoutInflater mInflater = LayoutInflater.from(this);
View tab_1 = mInflater.inflate(R.layout.tab_1, null);
View tab_2 = mInflater.inflate(R.layout.tab_2, null);
View tab_3 = mInflater.inflate(R.layout.tab_3, null);
View tab_4 = mInflater.inflate(R.layout.tab_4, null); mviews.add(tab_1);
mviews.add(tab_2);
mviews.add(tab_3);
mviews.add(tab_4); mAdapter = new PagerAdapter() { @Override
public void destroyItem(View container, int position,
Object object) {
// TODO Auto-generated method stub
((ViewPager) container).removeView(mviews.get(position)); } @Override
public Object instantiateItem(View container, int position) {
// TODO Auto-generated method stub
View view = mviews.get(position);
((ViewGroup) container).addView(view);
return view;
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
} @Override
public int getCount() {
// TODO Auto-generated method stub
return mviews.size();
}
}; mViewPager.setAdapter(mAdapter); } @Override
public void onClick(View v) {
// TODO Auto-generated method stub resgmit(); switch (v.getId()) {
case R.id.id_tab_weixin:
mViewPager.setCurrentItem();
mweixin_image.setImageResource(R.drawable.tab_weixin_pressed);
break;
case R.id.id_tab_add:
mViewPager.setCurrentItem();
madd_image.setImageResource(R.drawable.tab_address_pressed);
break;
case R.id.id_tab_frd:
mViewPager.setCurrentItem();
mfrd_image.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case R.id.id_tab_set:
mViewPager.setCurrentItem();
mset_image.setImageResource(R.drawable.tab_settings_pressed);
break; default:
break;
} } //将所有的图片切换为暗色
private void resgmit() {
// TODO Auto-generated method stub
mweixin_image.setImageResource(R.drawable.tab_weixin_normal);
madd_image.setImageResource(R.drawable.tab_address_normal);
mfrd_image.setImageResource(R.drawable.tab_find_frd_normal);
mset_image.setImageResource(R.drawable.tab_settings_normal); } }

MainActivity.java

效果图:

安卓开发_慕课网_ViewPager实现Tab(App主界面)的更多相关文章

  1. 安卓开发_慕课网_Fragment实现Tab(App主界面)

    学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信 ...

  2. 安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

    学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来.效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragme ...

  3. 安卓开发_浅谈Fragment之ListFragment

    ListFragment,即Fragment的一个子类,当我们用的一个Fragment只需要一个listview视图的时候使用 该类有几个特点: 1.ListFragment 本身具只有一个ListV ...

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

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

  5. 安卓开发_浅谈ListView(SimpleAdapter数组适配器)

    安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...

  6. 安卓开发_浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  7. 安卓开发_数据存储技术_sqlite

    一.SQLite SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了.SQLite已经被多种软件和产品使用 ...

  8. 安卓开发_浅谈ListView(自定义适配器)

    ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...

  9. 安卓开发_数据存储技术_SharedPreferences类

    SharedPreferences类 供开发人员保存和获取基本数据类型的键值对. 该类主要用于基本类型,例如:booleans,ints,longs,strings.在应用程序结束后,数据仍旧会保存. ...

随机推荐

  1. djngo快速实现--使用Bootstrap

    继续django学习之旅,之前我们所做的Django练习前端都非常丑.这节我们使用Bootstrap,顿时使丑陋的页面变成白天鹅. 安装Bootstrap                        ...

  2. 谷歌联合 Adobe 发布 Noto 字体【免费下载】

    Noto 涵盖了世界上所有主要语言,包括欧洲,非洲,中东,印度语,南亚和东南亚,中亚,美洲和东亚语言.也支持几个少数民族和历史语言.不久前,还发布了针对文.日文.韩文的开源字体——Noto Sans ...

  3. iOS-nil,Nil,NULL的区别

    一.简述 1.nil用来给对象赋值(Objective-C中的任何对象都属于id类型) 2.NULL则给任何指针赋值,NULL和nil不能互换 3.nil用于类指针赋值(在Objective-C中类是 ...

  4. 基于openssl的单向和双向认证

    1.前言 最近工作涉及到https,需要修改nginx的openssl模块,引入keyless方案.关于keyless可以参考CloudFlare的官方博客: https://blog.cloudfl ...

  5. C#函数式程序设计之代码即数据

    自3.5版本以来,.NET以及微软的.NET语言开始支持表达式树.它们为这些语言的某个特定子集提供了eval形式的求值功能.考虑下面这个简单的Lambda表达式: Func<int, int, ...

  6. C#属性封装

    1.属性封装是为了保护与之相对应的字段的,保证字段的读取和赋值是否符合要求 2.属性可以分为:读写,只读,只写 3.允许外部访问的变量一定要申明为属性 4.属性的本质就是两个方法. 5.自动属性 6. ...

  7. 全新重装win8.1系统后 配置开发及办公环境步骤

    全新重装win8.1系统后 配置开发及办公环境步骤 这两天,系统因配置开发环境出错,重装了一下,为日后方便,故此记录系统配置流程,防日后重装系统计划不周. 安装前,对照步骤,准备好下列安装文件. 0. ...

  8. C#设计模式——生成器模式(Builder Pattern)

    一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...

  9. jQuery数据类型总结

    jQuery除了包含原生JS中的内置数据类型(built-in datatype),还包括一些扩展的数据类型(virtual types),如Selectors.Events等. 1. String ...

  10. Netty学习之客户端创建

    一.客户端开发时序图 图片来源:Netty权威指南(第2版) 二.Netty客户端开发步骤 使用Netty进行客户端开发主要有以下几个步骤: 1.用户线程创建Bootstrap Bootstrap b ...