自定义底部工具栏及顶部工具栏和Fragment配合使用demo
首先简单的介绍下fragment,fragment是android3.0新增的概念,其中文意思是碎片,它与activity非常相似,用来在一个activity中描述一些行为或一部分用户界面。使用锁个fragment可以再一个单独的activity中建立多个UI面板,也可以在多个activity中重用fragment,一个fragment必须被嵌入到一个activity中,它的生命周期直接受其所宿主的activity的生命周期的影响。
首先创建一个fragment,要创建一个fragment,必须创建一个fragment的子类,或者继承自另外一个已经存在的Fragment的子类,并重写相应的方法。
编写Fragment的xml文件和类文件,这里我写了四个,贴出来其中两个代码,其他的copy就行。
fragment_main.xml
<RelativeLayout 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"
tools:context=".MainActivity" > <TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:gravity="center"
android:text="主页面"
/> </RelativeLayout>
MainFragment.java
public class MainFragment extends Fragment{ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container,false);
return view;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
} }
fragment_grxx.xml
<RelativeLayout 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"
tools:context=".MainActivity" > <com.qyh.view.TitleView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:gravity="center"
android:text="个人信息"
/> </RelativeLayout>
GrxxFragment.java
public class GrxxFragment extends Fragment{
private TitleView titleView;
private FragmentActivity mActivity;
private View mParent; @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_grxx, container,false);
return view;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mActivity = getActivity();
mParent = getView();
titleView = (TitleView) mActivity.findViewById(R.id.title);
titleView.setTitle("个人信息");
titleView.setBackButton(new TitleView.OnBackButtonClickListener() {
@Override
public void onClick(View button) {
getFragmentManager().beginTransaction()
.hide(com.qyh.main.MainActivity.mFragments[1])
.show(com.qyh.main.MainActivity.mFragments[0]).commit();
FragmentIndicator.setIndicator(0);
}
});
} }
自定义底部工具栏
FragmentIndicator.java
public class FragmentIndicator extends LinearLayout implements OnClickListener { private static String TAG = "FragmentIndicator";
private int mDefaultIndicator = 0;// 默认位置
private static int mCurIndicator;// 当前位置
private static View[] mIndicators;
private OnIndicateListener mOnIndicateListener; private static final String TAG_ICON_0 = "icon_tag_0";
private static final String TAG_ICON_1 = "icon_tag_1";
private static final String TAG_ICON_2 = "icon_tag_2";
private static final String TAG_ICON_3 = "icon_tag_3"; private FragmentIndicator(Context context) {
super(context);
} public FragmentIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
mCurIndicator = mDefaultIndicator;
setOrientation(LinearLayout.HORIZONTAL);
initView();
} private View createIndicator(int iconResID, int stringResID,
int stringColor, String iconTag, String textTag) {
LinearLayout view = new LinearLayout(getContext()); view.setOrientation(LinearLayout.HORIZONTAL);
view.setLayoutParams(new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT,1));
view.setGravity(Gravity.CENTER); ImageView iconView = new ImageView(getContext());
iconView.setTag(iconTag);
iconView.setLayoutParams(new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, 1));
iconView.setImageResource(iconResID);
view.addView(iconView);
return view;
} private void initView() {
mIndicators = new View[4];
mIndicators[0] = createIndicator(R.drawable.main_home, 0, 0, TAG_ICON_0,
null);
mIndicators[0].setBackgroundResource(R.drawable.indic_select);
mIndicators[0].setTag(Integer.valueOf(0));
mIndicators[0].setOnClickListener(this);
addView(mIndicators[0]); mIndicators[1] = createIndicator(R.drawable.main_user, 0, 0, TAG_ICON_1,
null);
mIndicators[1].setBackgroundResource(Color.alpha(0));
mIndicators[1].setTag(Integer.valueOf(1));
mIndicators[1].setOnClickListener(this);
addView(mIndicators[1]); mIndicators[2] = createIndicator(R.drawable.main_set, 0, 0, TAG_ICON_2,
null);
mIndicators[2].setBackgroundResource(Color.alpha(0));
mIndicators[2].setTag(Integer.valueOf(2));
mIndicators[2].setOnClickListener(this);
addView(mIndicators[2]); mIndicators[3] = createIndicator(R.drawable.main_more, 0, 0,
TAG_ICON_3, null);
mIndicators[3].setBackgroundResource(Color.alpha(0));
mIndicators[3].setTag(Integer.valueOf(3));
mIndicators[3].setOnClickListener(this); addView(mIndicators[3]);
} public static void setIndicator(int which) {
// 以前状态
mIndicators[mCurIndicator].setBackgroundColor(Color.alpha(0));
ImageView prevIcon;
switch (mCurIndicator) {
case 0:
prevIcon = (ImageView) mIndicators[mCurIndicator]
.findViewWithTag(TAG_ICON_0);
prevIcon.setImageResource(R.drawable.main_home);
break;
case 1:
prevIcon = (ImageView) mIndicators[mCurIndicator]
.findViewWithTag(TAG_ICON_1);
prevIcon.setImageResource(R.drawable.main_user);
break;
case 2:
prevIcon = (ImageView) mIndicators[mCurIndicator]
.findViewWithTag(TAG_ICON_2);
prevIcon.setImageResource(R.drawable.main_set);
break;
case 3:
prevIcon = (ImageView) mIndicators[mCurIndicator]
.findViewWithTag(TAG_ICON_3);
prevIcon.setImageResource(R.drawable.main_more);
break;
default:
break;
}
Log.i(TAG, "setIndicator:mCurIndicator=" + mCurIndicator);
// 更新当前状态
mIndicators[which].setBackgroundResource(R.drawable.indic_select);
ImageView currIcon;
switch (which) {
case 0:
currIcon = (ImageView) mIndicators[which]
.findViewWithTag(TAG_ICON_0);
currIcon.setImageResource(R.drawable.main_home_hover);// 选中后的图片
break;
case 1:
currIcon = (ImageView) mIndicators[which]
.findViewWithTag(TAG_ICON_1);
currIcon.setImageResource(R.drawable.main_user_hover);
break;
case 2:
currIcon = (ImageView) mIndicators[which]
.findViewWithTag(TAG_ICON_2);
currIcon.setImageResource(R.drawable.main_set_hover);
break;
case 3:
currIcon = (ImageView) mIndicators[which]
.findViewWithTag(TAG_ICON_3);
currIcon.setImageResource(R.drawable.main_more_hover);
break;
default:
break;
}
mCurIndicator = which;
} public interface OnIndicateListener {
public void onIndicate(View v, int which);
} public void setOnIndicateListener(OnIndicateListener listener) {
mOnIndicateListener = listener;
} @Override
public void onClick(View v) {
if (mOnIndicateListener != null) {
int tag = (Integer) v.getTag();
switch (tag) {
case 0:
if (mCurIndicator != 0) {
mOnIndicateListener.onIndicate(v, 0);
setIndicator(0);
}
break;
case 1:
if (mCurIndicator != 1) {
mOnIndicateListener.onIndicate(v, 1);
setIndicator(1);
}
break;
case 2:
if (mCurIndicator != 2) {
mOnIndicateListener.onIndicate(v, 2);
setIndicator(2);
}
break;
case 3:
if (mCurIndicator != 3) {
mOnIndicateListener.onIndicate(v, 3);
setIndicator(3);
}
break;
default:
break;
} } } }
自定义顶部工具栏
title_view.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="48dip"
android:background="#18222E" > <ImageButton
android:id="@+id/ib_back"
android:layout_width="48dp"
android:layout_height="match_parent"
android:src="@drawable/ic_titleback"
/> <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:text="个人信息"/> <ImageButton
android:id="@+id/ib_handle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:layout_marginRight="12dp"
android:visibility="gone"/> </FrameLayout>
TitleView.java
/**
* 功能描述:自定义顶部工具栏
*/
public class TitleView extends FrameLayout implements View.OnClickListener {
public OnBackButtonClickListener mOnBackButtonClickListener;
public OnHandleButtonClickListener mHandleButtonClickListener;
private TextView mTitle;
private ImageButton mBackButton;
private ImageButton ib_handle; public TitleView(Context context) {
this(context, null);
} public TitleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public TitleView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.title_view, this, true);
mBackButton = (ImageButton) findViewById(R.id.ib_back);
mBackButton.setOnClickListener(this);
mTitle = (TextView) findViewById(R.id.tv_title);
mTitle.setVisibility(View.INVISIBLE);
ib_handle = (ImageButton) findViewById(R.id.ib_handle);
ib_handle.setOnClickListener(this);
} public interface OnBackButtonClickListener {
public void onClick(View button);
} public interface OnHandleButtonClickListener {
public void onClick(View button);
} /**
* 标题返回按钮
*
* @param listener
*/
public void setBackButton(OnBackButtonClickListener listener) {
mOnBackButtonClickListener = listener;
} public void showBackBtn(){
mBackButton.setVisibility(View.VISIBLE);
} public void hiddenBackBtn(){
mBackButton.setVisibility(View.GONE);
} /**
* 标题操作按钮
*
* @param listener
*/
public void setHandleButton(OnHandleButtonClickListener listener) {
mHandleButtonClickListener = listener;
} public void hiddenHandleBtn(){
ib_handle.setVisibility(View.GONE);
} public void showHandleBtn(int iamgeBtnID){
ib_handle.setImageResource(iamgeBtnID);
ib_handle.setVisibility(View.VISIBLE);
}
//设置标题
public void setTitle(String text) {
mTitle.setVisibility(View.VISIBLE);
mTitle.setText(text);
} public void setTitle(int stringID) {
mTitle.setVisibility(View.VISIBLE);
mTitle.setText(stringID);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ib_back:
if (mOnBackButtonClickListener != null) {
mOnBackButtonClickListener.onClick(v);
}
break;
case R.id.ib_handle:
if (mHandleButtonClickListener != null) {
mHandleButtonClickListener.onClick(v);
}
break;
default:
break;
}
} }
在main.xml里面添加相关fragment和自定义底部工具栏,注意name属性
<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" > <fragment
android:id="@+id/fragment_main"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:name="com.qyh.fragment.MainFragment" /> <fragment
android:id="@+id/fragment_grxx"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:name="com.qyh.fragment.GrxxFragment" /> <fragment
android:id="@+id/fragment_sz"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:name="com.qyh.fragment.SzFragment" /> <fragment
android:id="@+id/fragment_others"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:name="com.qyh.fragment.OthersFragment" /> <!--此处为自定义底部菜单栏 -->
<com.qyh.fragment.FragmentIndicator
android:id="@+id/indicator"
android:layout_width="fill_parent"
android:layout_height="48dp"
/> </LinearLayout>
在主线程中对fragment做相关操作
public class MainActivity extends FragmentActivity { public static Fragment[] mFragments; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
setFragmentIndicator(0); } private void setFragmentIndicator(int whichIsDefault) {
mFragments = new Fragment[4];
mFragments[0] = getSupportFragmentManager().findFragmentById(
R.id.fragment_main);
mFragments[1] = getSupportFragmentManager().findFragmentById(
R.id.fragment_grxx);
mFragments[2] = getSupportFragmentManager().findFragmentById(
R.id.fragment_sz);
mFragments[3] = getSupportFragmentManager().findFragmentById(
R.id.fragment_others);
getSupportFragmentManager().beginTransaction().hide(mFragments[0])
.hide(mFragments[1]).hide(mFragments[2]).hide(mFragments[3])
.show(mFragments[whichIsDefault]).commit(); FragmentIndicator mIndicator = (FragmentIndicator) findViewById(R.id.indicator);
FragmentIndicator.setIndicator(whichIsDefault);
mIndicator.setOnIndicateListener(new OnIndicateListener() { @Override
public void onIndicate(View v, int which) {
getSupportFragmentManager().beginTransaction()
.hide(mFragments[0]).hide(mFragments[1])
.hide(mFragments[2]).hide(mFragments[3])
.show(mFragments[which]).commit();
}
});
}
}
运行相关效果图
自定义底部工具栏及顶部工具栏和Fragment配合使用demo的更多相关文章
- TabBottomFragmentLayout【自定义底部选项卡区域(搭配Fragment)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义底部选项卡布局LinearLayout类,然后配合Fragment,实现切换Fragment功能. 缺点: 1.底部选项卡区域 ...
- 【Android UI设计与开发】5.底部菜单栏(二)使用Fragment实现底部菜单栏
既然 Fragment 取代了TabActivity,当然 TabActivity 的能实现的菜单栏,Fragment 当然也能实现.主要其实就是通过菜单栏的点击事件切换 Fragment 的显示和隐 ...
- Android自定义底部带有动画的Dialog
Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...
- Android 自定义底部公用菜单
注释:此案例主要展示自定义底部菜单,一处封装处处调用.使用起来相当方便 一.初始的Activity package com.example.myapi.buttommenu; import andro ...
- 微信小程序-自定义底部导航
代码地址如下:http://www.demodashi.com/demo/14258.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- [RN] React Native 自定义 底部 弹出 选择框 实现
React Native 自定义 底部选择框 实现 效果如图所示: 实现方法: 一.组件封装 CustomAlertDialog.js import React, {Component} from ' ...
- 15 Flutter BottomNavigationBar自定义底部导航条 以及实现页面切换 以及模块化
效果: /** * Flutter BottomNavigationBar 自定义底部导航条.以及实现页面切换: * BottomNavigationBar是底部导航条,可以让我们定义底部Tab ...
- C# 自定义样式实现菜单和工具栏的分割线
在做WinForm界面布局时,菜单和工具栏必不可少!但是MenuStrip和ToolStrip不能够对边框的样式直接设置,如果想实现菜单和工具栏之间的分割线就不容易实现:今天查阅了一下msdn找到了一 ...
- XAF ListView 移除顶部工具栏
此方法适用于C/S及B/S,无需分别写在web和win中. Module下新建ViewController,代码如下: public partial class GongZuoJiaoShen_Yin ...
随机推荐
- 15天玩转redis —— 第七篇 同事的一次缓存操作引起对慢查询的认识
上个星期同事做一个业务模块,需要将一个80M的数据存入到redis缓存中,想法总是好的,真操作的时候遇到了HSet超时,我们使用的是C#的 StackExchange.Redis驱动. <red ...
- iOs 自定义UIView 日历的实现 Swift2.1
学习Swift有一个月了,动手写一个UIView吧. 所有源代码在最后,直接用就可以了,第一次写Swift,和C#,Java还是有区别的 (博客园可以考虑在代码插入中添加Swift的着色了) 1 函 ...
- 微软Dynamics 使用葡萄城的Wijmo 5提供移动端用户界面选择
近日,全球最大的控件提供商葡萄城公司宣布: 葡萄城近日与微软公司达成合作,将Wijmo 产品线的HTML5和JaveScript 控件融合到微软Dynamics CRMOnline 2016版中. 随 ...
- mysql学习笔记 第五天
使用分区数据表: 分区数据表和merge数据表具有相似的作用,但是分区数据表确确实实是一个数据表 ,不像merge是列出数据表的逻辑关系,并且分区数据表可以包括像myisam以外的 的数据表.创建分区 ...
- javascript--Function
概述 函数的声明 (1)function命令 函数就是使用function命令命名的代码区块,便于反复调用. function print(){ // ... } 上面的代码命名了一个print函数, ...
- JVM调优总结:调优方法
JVM调优总结:调优方法 2012-01-10 14:35 和你在一起 和你在一起的博客 字号:T | T 下面文章将讲解JVM的调优工具以及如何去调优等等问题,还有一些异常问题的处理.详细请看下文. ...
- (2)RGB-D SLAM系列- 工具篇(依赖库及编译)
做了个SLAM的小视频,有兴趣的朋友可以看下 https://youtu.be/z5wDzMZF10Q 1)Library depended 一个完整的SLAM系统包括,数据流获取,数据读取,特征提取 ...
- 【html5】Web存储_locaStorage对象的应用
Web存储 html5可以在本地存储用户浏览的数据,数据的存储原理是以 键/值 存储的 存储对象分类 localStorage:没有时间限制的数据存储 sessionStorage:针对一个会话的数据 ...
- [deviceone开发]-cnodejs论坛移动端App
一. 简介 这个App是利用cnodejs.net的API来实现论坛的移动端,使用了deviceone的官方的js库(github.com/do-js). 从而使代码非常简洁,便于阅读和参考,值得推荐 ...
- Eclipse OSGi调试过程
当你在开发的插件直接运行的时候,看起来正常的.但导出放到eclipse时候,又发觉不对劲,插件运行有问题.这个时候需要去OSGi的控制台调试插件,这一篇文章将讲述怎么简单调试eclipse插件(插件已 ...