1先在activity的布局中将自定义的控件摆好
2关于MainViewPager的代码,首先是三个构造方法,无论调用哪个都会走其初始化,初始化中的layout_bottom布局也在下方。
初始化方法initview中首先1显示寻找到底部三个include进来的控件,然后2初始化数值让他开始显示第一个被点击,最后3设置三个控件的点击事件。
设置setOnclickListner后重写onClick方法,利用switch判断点击的是哪个控件,然后分别设置他们的图标和颜色利用setResidAndColor方法。
setResidAndColor这个方法调用changDataItem方法(他的参数1是图片的选中数组,2是文字选中排序数字),对他们进行分别得设置,方法中传入的参数不同。
3这里1创建了了一个接口方法
public interface ICallbackListener {
public void click(int id);
}
然后对外提供调用方法2 setOnCallbackListener,他的参数即为接口,并且我们在onclick事件中调用了他3 iCallbackListener.click(v.getId());
当我们在4 activity中调用setOnCallbackListener的时候,我们会重写click方法,并且会将你点中的控件的int值传递给我们,当你点击控件的时候,就会走我们activity中复写的click方法,我们就可以设置当前的fregment,实现底部导航栏与fregment联动。
package android.coolweather.com.xinguangfirstactivitydemo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MyBottomLayout extends LinearLayout implements View.OnClickListener{
private Context context;
private RelativeLayout homeLayout;
private RelativeLayout messageLayout;
private RelativeLayout mineLayout;
private ICallbackListener iCallbackListener = null;
public MyBottomLayout(Context context) {
super(context);
this.context = context;
initView();
}
public MyBottomLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
initView();
}
public MyBottomLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
initView();
}
/**
* 初始化
*/
private void initView(){
View view = LayoutInflater.from(context).inflate(R.layout.layout_bottom, this);
findView(view);
initData();
initListener();
}
/**
* 找到控件的方法
*
* @param view
*/
private void findView(View view) {
homeLayout = (RelativeLayout) view.findViewById(R.id.homeLayout);
messageLayout = (RelativeLayout) view.findViewById(R.id.messageLayout);
mineLayout = (RelativeLayout) view.findViewById(R.id.mineLayout);
}
/**
* 初始化数据
*/
private void initData() {
setResidAndColor(0);
}
public void setResidAndColor(int i) {
switch (i) {
case 0:
changeDataItem(setResid(new int[] {1, 0, 0}),
new int[] {1, 0, 0});
break;
case 1:
changeDataItem(setResid(new int[] {0, 1, 0}),
new int[] {0, 1, 0});
break;
case 2:
changeDataItem(setResid(new int[] {0, 0, 1}),
new int[] {0, 0, 1});
break;
}
}
/**
* 控件的监听事件
*/
private void initListener() {
homeLayout.setOnClickListener(this);
messageLayout.setOnClickListener(this);
mineLayout.setOnClickListener(this);
}
/**
* 控件的点击事件
* 点击后改变显示的图标和文字的颜色
* @param v
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.homeLayout:
setResidAndColor(0);
break;
case R.id.messageLayout:
setResidAndColor(1);
break;
case R.id.mineLayout:
setResidAndColor(2);
break;
}
//这里加入了一个接口方法,留给ViewPager去实现
//功能是点击item后viewPager也会跟着变
iCallbackListener.click(v.getId());
}
/**
* 把所有的数据整合一起进行抽取
*/
private void changeDataItem(int[] resid, int[] color) {
initDataItem(homeLayout, resid[0], "首页", color[0]);
initDataItem(messageLayout, resid[1], "消息", color[1]);
initDataItem(mineLayout, resid[2], "我的", color[2]);
}
/**
* 初始化数据的抽取方法
* @param resid
* @param name
* @param color
*/
private void initDataItem(View view, int resid, String name, int color) {
view.findViewById(R.id.tabImg).setBackgroundResource(resid);
TextView tv = (TextView) view.findViewById(R.id.tabText);
tv.setText(name);
// tv.setTextColor( (color == 1) ? getResources().getColor(R.color) : Color.WHITE);
}
public int[] setResid(int[] resid) {
int resHome = (resid[0] == 1) ? R.drawable.main_home_press : R.drawable.main_home;
int resMessage = (resid[1] == 1) ? R.drawable.main_msg_press : R.drawable.main_msg;
int resMine = (resid[2] == 1) ? R.drawable.main_mine_press : R.drawable.main_mine;
return new int[] {resHome, resMessage, resMine};
}
//初始化接口,由需要实现activity(MainActivity)调用
//通过findviewbyid获取MyBottomLayout,进行调用
public void setOnCallbackListener(ICallbackListener iCallbackListener) {
this.iCallbackListener = iCallbackListener;
}
//自定义接口文件,click方法由调用处实现,功能是完成viewpager的滑动
public interface ICallbackListener {
public void click(int id);
}
}
3layout_bottom的代码,三个include横向排列,也就是底部有三个可点击的图片+文字控件。
里面include引用了共同的布局作为子布局,可以看出子布局就是纵向排列的一个图片+文字
MainViewPaper 中并没有什么重点代码。
package android.coolweather.com.xinguangfirstactivitydemo.fragment;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
public class MainViewPaper extends ViewPager {
public MainViewPaper(Context context) {
super(context);
}
public MainViewPaper(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setCurrentItem(int item) {
// TODO Auto-generated method stub
super.setCurrentItem(item, false);
}
}
接下来就是mainactivity中的调用,首先是initview中viewpager的使用,其次就是viewpager与底部的联动了1viewpage滑动,底部相应条目被选中。2底部条目点击,viewpager滑动到相应界面的fregment。
1的实现是对viewpager监听,然后当页面停止滑动的时候 调用myBottomLayout.setResidAndColor(myViewPager.getCurrentItem())方法即可。
2的实现是我们上面写的回调方法,在onclik总调用myViewPager.setCurrentItem(0)即可。
package com.huazhan.org.main;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.KeyEvent;
import android.widget.Toast;
import com.huazhan.org.R;
import com.huazhan.org.app.BaseActivity;
import com.huazhan.org.main.fragment.HomeFragment;
import com.huazhan.org.main.fragment.MainViewPaper;
import com.huazhan.org.main.fragment.MessageFragment;
import com.huazhan.org.main.fragment.MineFragment;
import com.huazhan.org.main.view.MyBottomLayout;
import com.huazhan.org.util.image.ZoomOutPageTransformer;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends BaseActivity {
private long exitTime = 0;
private MainViewPaper myViewPager;
private MyBottomLayout myBottomLayout;
private List fragments;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
setViewClick();
}
public void initView() {
fragments = new ArrayList<>();
fragments.add(new HomeFragment());
fragments.add(new MessageFragment());
fragments.add(new MineFragment());
myViewPager = (MainViewPaper) findViewById(R.id.myViewPager);
//设置动画
myViewPager.setPageTransformer(true, new ZoomOutPageTransformer());
myBottomLayout = (MyBottomLayout) findViewById(R.id.myBottomLayout);
}
//给viewpager设置当前的fregment
public void initData() {
myViewPager.setAdapter(new MyFragmentAdapter(getSupportFragmentManager()));
}
public void setViewClick() {
//设值注入,初始化MyBottomLayout页面的回调实例
myBottomLayout.setOnCallbackListener(new MyCallBackListener());
//ViewPager页面监听 使用add而不是set
myViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
//0是静止,1是正在滑动,2是停止滑动
if (state == 2) {
//设置滑动ViewPager导航同步变化
myBottomLayout.setResidAndColor(myViewPager.getCurrentItem());
}
}
});
}
/**
* 实现回调监听方法,用于改变当前item值
* 在FragmentPagerAdapter的getItem方法中切换Fragment
*/
private class MyCallBackListener implements MyBottomLayout.ICallbackListener {
@Override
public void click(int id) {
switch (id) {
case R.id.homeLayout:
myViewPager.setCurrentItem(0);
break;
case R.id.messageLayout:
myViewPager.setCurrentItem(1);
break;
case R.id.mineLayout:
myViewPager.setCurrentItem(2);
break;
}
}
}
/**
* viewPager的adapter,改变当前fragment
*/
private class MyFragmentAdapter extends FragmentPagerAdapter {
private MyFragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
//一共3个页面
return 3;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
exit();
return false;
}
return super.onKeyDown(keyCode, event);
}
public void exit() {
if ((System.currentTimeMillis() - exitTime) > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程序",
Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
}
}
综上,即可简单的实现标题。