相关阅读:
吊炸天!74款APP完整源码!
github上万颗star的21个JAVA(19个Android相关)开发框架,知道多少,用过多少(截止2016年12月17日)
有了这些免费无限次的API 接口,再也不愁没有服务器开发不了APP了,也可以自己开发小程序了
文/Carson_Ho
原文链接:http://www.jianshu.com/p/a663803b2a44
前言
Android开发中使用底部菜单栏的频次非常高,主要的实现手段有以下:
今天带大家来探索下如何用Fragment+FragmentTabHost++ViewPager
实现底部菜单栏
目录
总体设计思路
Fragment:存放不同选项的页面内容
FragmentTabHost:点击切换选项卡
ViewPager:实现页面的左右滑动效果
概念介绍
1. FragmentTabHost
用于实现点击选项进行切换选项卡的自定义效果
使用FragmentTabHost,就是先用TabHost“装着”Fragment,然后放进MainActivity里面
2. ViewPager
3. Fragment
实现步骤
在主xml布局里面定义一个FragmentTabHost控件
定义底部菜单栏布局
定义每个Fragment布局
定义每个Fragment的Java类
定义适配器以关联页卡和ViewPage
定义MainActivity(具体实现请看注释)
工程文件目录
工程文件目录
具体实现实例
步骤1:在主xml布局里面定义一个FragmentTabHost控件
主xml布局:Main_tab_layout.xml
RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
include layout="@layout/main_top" />
android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
FrameLayout
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/black" >
FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
android.support.v4.app.FragmentTabHost>RelativeLayout>
步骤2:定义底部菜单栏布局
tab_content.xml
一般是图片在上,文字在下
步骤3:定义Fragment布局
fragment_item1.xml&fragment_item2.xml
这里使用两个选项,由于fragment_item1.xml与fragment_item2.xml相同,这里只贴出一个
fragment_item1.xml
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fragment1"
android:textSize="20sp"/>
LinearLayout>
步骤4: 定义每个Fragment的Java类
这里使用两个选项:Fragment1.java&fragmen2.java
由于Fragment1.java&fragmen2.java相同,这里只贴出一个
Fragment1.java
步骤5: 定义适配器关联页卡和ViewPage
MyFragmentAdapter.java
步骤6: 定义MainActivity
具体实现看注释
MainActivity.java
package com.example.carson_ho.tab_menu_demo;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentTabHost;import android.support.v4.view.ViewPager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TabHost;import android.widget.TabWidget;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class MainActivity extends FragmentActivity implements
ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener { private FragmentTabHost mTabHost; private LayoutInflater layoutInflater; private Class fragmentArray[] = { Fragment1.class, Fragment2.class }; private int imageViewArray[] = { R.drawable.tab_home_btn, R.drawable.tab_view_btn }; private String textViewArray[] = { "首页", "分类"}; private List list = new ArrayList(); private ViewPager vp; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initPage();
}
private void initView() {
vp = (ViewPager) findViewById(R.id.pager);
vp.addOnPageChangeListener(this);
layoutInflater = LayoutInflater.from(this);
mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mTabHost.setup(this, getSupportFragmentManager(), R.id.pager);
mTabHost.setOnTabChangedListener(this); int count = textViewArray.length;
for (int i = 0; i // 给每个Tab按钮设置标签、图标和文字
TabHost.TabSpec tabSpec = mTabHost.newTabSpec(textViewArray[i])
.setIndicator(getTabItemView(i));
mTabHost.addTab(tabSpec, fragmentArray[i], null);
mTabHost.setTag(i);
mTabHost.getTabWidget().getChildAt(i)
.setBackgroundResource(R.drawable.selector_tab_background);
}
}
private void initPage() {
Fragment1 fragment1 = new Fragment1();
Fragment2 fragment2 = new Fragment2();
list.add(fragment1);
list.add(fragment2);
vp.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(), list));
mTabHost.getTabWidget().setDividerDrawable(null);
} private View getTabItemView(int i) {
View view = layoutInflater.inflate(R.layout.tab_content, null);
ImageView mImageView = (ImageView) view
.findViewById(R.id.tab_imageview);
TextView mTextView = (TextView) view.findViewById(R.id.tab_textview);
mImageView.setBackgroundResource(imageViewArray[i]);
mTextView.setText(textViewArray[i]); return view;
} @Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
TabWidget widget = mTabHost.getTabWidget(); int oldFocusability = widget.getDescendantFocusability();
widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
mTabHost.setCurrentTab(arg0);
widget.setDescendantFocusability(oldFocusability);
} @Override
public void onTabChanged(String tabId) {
int position = mTabHost.getCurrentTab();
vp.setCurrentItem(position);
}
}
效果图
经过上述6个步骤就完成了可滑动的底部菜单栏了,效果图如下:
默认第一个Tab
点击或滑动到第二个Tab
完整Demo下载地址
Carson_Ho的Github:Tab_menu_Demo
关于Java和Android大牛频道
Java和Android大牛频道是一个数万人关注的探讨Java和Android开发的公众号,分享和原创最有价值的干货文章,让你成为这方面的大牛!
我们探讨android和Java开发最前沿的技术:android性能优化 ,插件化,跨平台,动态化,加固和反破解等,也讨论设计模式/软件架构等。由一群来自BAT的工程师组成的团队。
关注即送红包,回复:“百度” 、“阿里”、“腾讯” 有惊喜!!!关注后可用入微信群。群里都是来自百度阿里腾讯的大牛。
欢迎关注我们,一起讨论技术,扫描和长按下方的二维码可快速关注我们。或搜索微信公众号:JANiubility。
公众号:JANiubility