android 通用菜单栏实现(一)

一、前言介绍

直奔主题啦,很多Android app都有菜单栏,菜单栏除了背景图片、图标的不同外,布局基本一致。大致可以分为三部分:菜单栏的左侧区域、菜单栏中间区域、菜单栏右侧区域。

为了考虑代码的重用性,本文将给大家讲解通用菜单栏的实现方式。示例中的代码,大家稍微变通,可以满足大部分软件开发需要。

二、示例截图

我的一贯习惯,有图有真相。下面先看下通用菜单栏的截图:

三、实现介绍

3.1菜单栏布局文件:title_top_view.xml

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
    >

    <RelativeLayout android:id="@+id/title_bar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/title_bg">

        <!-- 左侧区域 -->
        <ImageButton android:id="@+id/left_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="5dip"
            android:background="@drawable/select_back"/>

        <!-- 中间区域 -->
        <TextView android:id="@+id/mid_txt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:singleLine="true"
            android:ellipsize="end"
            android:layout_marginLeft="60dip"
            android:layout_marginRight="60dip"
            />

        <!-- 右侧区域 -->
         <ImageButton android:id="@+id/right_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dip"
            android:layout_centerVertical="true"
            android:background="@drawable/selector_setting"/>
    </RelativeLayout>

</RelativeLayout>
</span>

3.2 MainActivity页面布局文件:activity_main.xml

<span style="font-size:14px;"><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"
    >

    <!-- 通过该标签导入菜单栏 -->
    <include
        android:id="@+id/title_bar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        layout="@layout/title_top_view"/>

    <TextView
        android:layout_below="@id/title_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
</span>

3.3java代码部分

提到java代码部分,先看通用菜单栏代码设计类图,如下:

类图说明:本Demo将菜单栏的左侧区域(mLeftView)、中间区域(mMidView)、右侧区域(mRightView)成员声明为protected,有违反代码封装性,各位可以下载Demo自行修改为private,并提供对外接口。本Demo主要用意方便子类访问、提供访问速度。

BaseActivity.java 代码如下:

<span style="font-size:14px;">package com.example.titledemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public abstract class BaseActivity extends Activity implements OnClickListener {

	protected View mTitleView;
	protected ImageView mLeftView;// 左侧按钮
	protected TextView mMidView;// 中间文本
	protected ImageView mRightView;// 右侧按钮

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		// 设置标题栏
		requestWindowFeature(Window.FEATURE_NO_TITLE);

		initView(savedInstanceState);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.left_btn: {
			onClickLeftBtn();
			break;
		}
		case R.id.right_btn: {
			onClickRigthBtn();
			break;
		}
		default: {
			break;
		}
		}
	}

	/**
	 * 初始化菜单栏
	 */
	protected void initTitleBar() {
		mTitleView = findViewById(R.id.title_bar);
		if (mTitleView != null) {
			mTitleView.setVisibility(View.VISIBLE);
			mLeftView = (ImageView) findViewById(R.id.left_btn);
			mLeftView.setOnClickListener(this);
			mMidView = (TextView) findViewById(R.id.mid_txt);
			mRightView = (ImageView) findViewById(R.id.right_btn);
			mRightView.setOnClickListener(this);
		}
	}

	/**
	 * 设置中间文本
	 */
	protected void setMidTxt(String strTxt) {
		if (mMidView != null) {
			mMidView.setText(strTxt);
		}
	}

	/**
	 * 初始化页面
	 * @param savedInstanceState
	 */
	protected abstract void initView(Bundle savedInstanceState);

	/**
	 * 单击菜单栏左侧按钮,响应处理函数,子类可继承实现自己的处理方式
	 */
	protected abstract void onClickLeftBtn();
	protected abstract void onClickRigthBtn();
}
</span>

MainActivity.java 代码如下:

<span style="font-size:14px;">package com.example.titledemo;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Toast;

public class MainActivity extends BaseActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	protected void initView(Bundle savedInstanceState) {
		// TODO Auto-generated method stub

		setContentView(R.layout.activity_main);

		//设置菜单栏
		initTitleBar();

		//设置菜单中间文本值
		setMidTxt(getResources().getString(R.string.app_name));
	}

	@Override
	protected void onClickLeftBtn() {
		// TODO Auto-generated method stub
		Toast.makeText(this, "点击了菜单左侧按钮", Toast.LENGTH_SHORT).show();
	}

	@Override
	protected void onClickRigthBtn() {
		// TODO Auto-generated method stub
		Toast.makeText(this, "点击了菜单右侧按钮", Toast.LENGTH_SHORT).show();
	}

}
</span>

四、示例下载

以下为Demo示例代码下载路径,http://download.csdn.net/detail/improveyourself/7505935

ps:如果各位有更好的实现方式,可以给我留言,在此先感谢各位。

android 通用菜单栏实现(一)

时间: 2024-10-11 05:14:07

android 通用菜单栏实现(一)的相关文章

Android底部菜单栏(用TabHost一次性加载耗内存)

上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率.今天把demo贴出来一是方便以后自己查询,二是希望同时也能帮到大家. 底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏做.我这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下

《React-Native系列》19、 ListView组件之上拉刷新(iOS和Android通用)

ReactNative提供了RefreshControl下拉刷新组件,但是没有提供上拉刷新组件,上拉刷新在App中是很常用的. 今天我们来实现一个iOS和Android通用的上拉刷新功能. 下面简要介绍下我实现的思路. 如果你对ListView的基础知识不是很清楚,建议先移步:<React-Native系列>16. RN组件之ListView 思路: 1.常量定义: const moreText = "加载完毕"; //foot显示的文案 //页码 var pageNum

60.Android通用流行框架大全

转载:https://segmentfault.com/a/1190000005073746 Android通用流行框架大全 1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 名称 描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库 Picasso 一个强大的图片下载与缓存的库 Fresco 一个用于管理图像和他们使用的内存的库 Glide 一个图片加载和缓存的库 3. 图片处理 名称 描述 Pi

Android通用脱壳工具DexHunter的原理分析和使用说明(二)

本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53715325 前面的博文<Android通用脱壳工具DexHunter的原理分析和使用说明(一)>中已经记录了很多关于DexHunter脱壳工具的脱壳原理和思考的思路问题并没有涉及到DexHunter脱壳工具的代码的分析,今天我就代码分析.理解和DexHunter脱壳工具的使用以及需要注意的地方进行博文的记录. 在阅读DexHunter的代码之前,复习下几个须知: 1>.

android开发从零开始 -----Android通用流行框架大全

好东西值得分享 ,这是网络上总结的一些开源的东西直接就拿过来了  .... Android通用流行框架大全 先把这张图放在这 ,先来谈一谈项目结构 .我喜欢将东西按模块来划分: 都知道module .它的应用非常方便 .对于一个项目刚开始开发时要考虑这个项目是由那些部分组成 lib_base  :包含各种Base基类 .如 BaseActivty  BaseFragment  BaseApplication   这是一些项目的开始基础. lib_ui:各种自定义UI ,或第三方ui .现在and

C#/IOS/Android通用加密解密方法

原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密不了,或者反之.下面的是三个平台都可以加密解密的方法.加密解密中用到的key="1234578";在调取方法时传值即可. C#代码 #region 跨平台加解密(c#) /// <summary> /// 对字符串进行DES加密 /// </summary> ///

Android通用框架设计与完整电商APP开发

第1章 课程介绍及APP效果展示(Java版)本章概述了本课程大家能学到什么,老师如何讲解,为什么这么讲解,并介绍了框架的整体架构设计与模块分解,最后展示了用自己设计的框架开发出来的完整电商APP的效果图(服务端API快速搭建教程:http://www.imooc.com/article/19001) ...1-1 课程导学1-2 项目架构设计与模块分解 第2章 项目初始化本章将从零搭建一个空项目,实践项目搭建的过程,并额外教大家搭建一个基于Go语言的Web版Git服务器,实现代码托管的自举.(

android 底部菜单栏实现(转)

1.Android学习之BottomNavigationBar实现Android特色底部导航栏 2.Android底部导航栏的四种实现 3.Android BottomNavigationBar底部导航控制器的使用 4.GitHup 开源的底部和顶部菜单栏项目FlycoTabLayout 5.Android实现顶部底部双导航界面功能

android通用適配器

一.需求分析 在寻常的android开发过程中.ListView.GridView适配的编写是一件非常麻烦并且非常反复的事情,每次都须要考虑性能的优化.item的编写.获取网络图片时候信息的错乱等问题.因此考虑写实现一个通用的适配器,主要考虑的功能: (1)自适应item布局文件,每次使用的时候仅仅须要传入布局的id编号就可以: (2)实现List列表的性能调优.可以复用item,使列表的载入速度大大提升: (3)可以直接从网络上获取图片载入列表,这里考虑仅仅须要传入图片的url地址,就可以以实