首先简单的介绍下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的更多相关文章

  1. TabBottomFragmentLayout【自定义底部选项卡区域(搭配Fragment)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义底部选项卡布局LinearLayout类,然后配合Fragment,实现切换Fragment功能. 缺点: 1.底部选项卡区域 ...

  2. 【Android UI设计与开发】5.底部菜单栏(二)使用Fragment实现底部菜单栏

    既然 Fragment 取代了TabActivity,当然 TabActivity 的能实现的菜单栏,Fragment 当然也能实现.主要其实就是通过菜单栏的点击事件切换 Fragment 的显示和隐 ...

  3. Android自定义底部带有动画的Dialog

    Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...

  4. Android 自定义底部公用菜单

    注释:此案例主要展示自定义底部菜单,一处封装处处调用.使用起来相当方便 一.初始的Activity package com.example.myapi.buttommenu; import andro ...

  5. 微信小程序-自定义底部导航

    代码地址如下:http://www.demodashi.com/demo/14258.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...

  6. [RN] React Native 自定义 底部 弹出 选择框 实现

    React Native 自定义 底部选择框 实现 效果如图所示: 实现方法: 一.组件封装 CustomAlertDialog.js import React, {Component} from ' ...

  7. 15 Flutter BottomNavigationBar自定义底部导航条 以及实现页面切换 以及模块化

    效果: /**  * Flutter  BottomNavigationBar 自定义底部导航条.以及实现页面切换:  * BottomNavigationBar是底部导航条,可以让我们定义底部Tab ...

  8. C# 自定义样式实现菜单和工具栏的分割线

    在做WinForm界面布局时,菜单和工具栏必不可少!但是MenuStrip和ToolStrip不能够对边框的样式直接设置,如果想实现菜单和工具栏之间的分割线就不容易实现:今天查阅了一下msdn找到了一 ...

  9. XAF ListView 移除顶部工具栏

    此方法适用于C/S及B/S,无需分别写在web和win中. Module下新建ViewController,代码如下: public partial class GongZuoJiaoShen_Yin ...

随机推荐

  1. DataTable 除去列中重复值

    DataTable dtPCI = dtblSourceData.DefaultView.ToTable(true, new string[] { "Server Cell PCI" ...

  2. python不用加号实现加法

    问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.E ...

  3. Spring web应用最大的败笔

    第一篇 介绍下IOC DI Spring主要是业务层框架,现在已经发展成为一个完整JavaEE开发框架,它的主要特点是IoC DI和AOP等概念的融合,强项在面向切面AOP.推出之初因为Ioc/AOP ...

  4. # 关于Apache的25个初中级面试题

    注:本文从自己的Markdown博客复制出,除标题字体加粗.代码风格改变.图片重新上传外其余均为markdown语法. 标签(空格分隔): LAMP --- 原文:[关于Apache的25个初中级面试 ...

  5. win7系统旗舰版path

    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShel ...

  6. Java 经典实例: Unicode字符和String之间的转换

    在Java诞生之际,Unicode码是一个16位的字符集,因此char值似乎顺其自然为16位宽,多年来一个char变量几乎可以表示任何Unicode字符. /** * Created by Frank ...

  7. 玩转Docker之Docker简介(一)

    近几年掀起的docker热潮,可谓席卷全球.什么原因使它这么备受推崇呢?主要是因为它解决了行业痛点.玩linux的都知道,安装个应用时还要先安装所需环境.相关库.解决依赖关系.而docker的出现,很 ...

  8. css知多少(4)——解读浏览器默认样式

    上一节<css知多少(3)——样式来源与层叠规则>介绍了样式的五种来源,咱们再通过一张图回顾一下. 对于上面的三层,咱们大概都比较熟悉了.下面的两层中,用户自定义样式一般也就是改一改字号大 ...

  9. (转)JavaScript一:为什么学习JavaScript?

    Web程序不论是B/S(Browser/Server)还是C/S(Client/Server)架构,分为客户端程序与服务器端程序两种.ASP.NET是开发服务器端程序的强大工具,但是有时候为了降低服务 ...

  10. 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...