转载请标明出处:

http://blog.csdn.net/hai_qing_xu_kong/article/details/50997095

本文出自:【顾林海的博客】

前言

随着项目越来越大。页面数也对应的添加。每一个页面都须要顶部的ActionBar,假设在每一个xml文件里去include我们的actionbar布局。工作量也是非常大。并且不利于后期维护。

今天这篇文章是教大家合理的管理我们的actionbar,代码非常easy,主要是一个思路。

注意看actionbar,效果图:

管理ActionBar

为了达到actionbar的统一管理。这里须要获取系统的ActionBar。通过下面方法进行布局的替换:

public abstract void setCustomView(View view, LayoutParams layoutParams);

1、先创建我们的actionbar布局。总体布局非常easy。包括左边返回button、左边标题、中间标题和右边标题。详细情况下面common_action_bar.xml文件:

<?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="57dp" > <LinearLayout
android:id="@+id/ll_common_back"
android:layout_width="30dp"
android:layout_height="57dp"
android:gravity="center_vertical"
android:orientation="horizontal" > <ImageView
android:id="@+id/iv_common_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:src="@drawable/common_left" />
</LinearLayout> <TextView
android:id="@+id/tv_common_left_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/ll_common_back"
android:singleLine="true"
android:textColor="@android:color/black"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_common_middle_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:singleLine="true"
android:textColor="@android:color/black"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_common_right_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:singleLine="true"
android:textColor="@android:color/black"
android:textSize="16sp" /> </RelativeLayout>

效果图例如以下:

2、创建完actionbar布局后。我们新建一个继承Activity的BaseActionBarActivity抽象类,获取系统actionbar,进行布局的替换:

        mActionBar = getActionBar();
if (mActionBar != null) {
mActionBar.setDisplayShowCustomEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
mActionBar.setDisplayShowHomeEnabled(false);
mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
mActionBar.setBackgroundDrawable(getResources().getDrawable(
R.drawable.common_bg));
initView(mCommonActionBar);
ActionBar.LayoutParams params = new ActionBar.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
mActionBar.setCustomView(mCommonActionBar, params);

mCommonActionBar就是我们前面定义的actionbar布局View。

3、在BaseActionBarActivity中定义一些方法。用于子类调用,例如以下:

/**
* 设置左边的标题
*
* @param leftTitle
*/
protected void setLeftTitle(String leftTitle) {
tv_common_left_title.setText(leftTitle);
} /**
* 设置中间标题
*
* @param middleTitle
*/
protected void setMiddleTitle(String middleTitle) {
tv_common_middle_title.setText(middleTitle);
} /**
* 设置右边标题
*
* @param rightTitle
*/
protected void setRightTitle(String rightTitle) {
tv_common_middle_title.setText(rightTitle);
} /**
* 主页的Actionbar样式
*/
protected void setMainAction() {
ll_common_back.setVisibility(View.GONE);
} /**
* 子页面通用样式
*/
protected void setCommonAction() {
iv_common_back.setVisibility(View.VISIBLE);
}

4、创建我们的点击事件的回调,在BaseActionBarActivity中定义一个抽象方法:

protected abstract void onClickActionBar(int type);

方法的详细实现由子类实现,type的值有下面几种:

protected final int ACTION_LEFT = 0x01;// 左边标题点击
protected final int ACTION_MIDDLE = 0x02;// 中间标题点击
protected final int ACTION_RIGHT = 0x03;// 右边标题点击

最后注冊点击事件,调用对应的方法:

    /**
* 事件注冊
*/
private void initEvent() {
/**
* 返回
*/
ll_common_back.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
onBackPressed();
}
}); /**
* 右边标题点击
*/
tv_common_right_title.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
onClickActionBar(ACTION_RIGHT);
}
}); /**
* 左边标题点击
*/
tv_common_left_title.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
onClickActionBar(ACTION_LEFT);
}
}); /**
* 中间标题点击
*/
tv_common_middle_title.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
onClickActionBar(ACTION_MIDDLE);
}
});
}

5、到这里启动程序,会出现背景黑色闪屏,在style文件里定义下面:

<style name="TranslucentTheme" >
<item name="android:windowContentOverlay">@null</item>
</style>

别忘了在AndroidManifest.xml中引用:

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/TranslucentTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.actionbarbuildproject.SecondActivity"></activity>
</application>

优雅的使用ActionBar

到这里定义的ActionBar已经创建完成。接下来我们的子Activity继承我们的BaseActionBarActivity。例如以下:

package com.example.actionbarbuildproject;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; import com.example.actionbarbuildproject.base.BaseActionBarActivity; public class MainActivity extends BaseActionBarActivity { private Button btn_start; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setMainAction();
setMiddleTitle("主页");
initViews();
initEvent();
} private void initViews() {
btn_start = (Button) findViewById(R.id.btn_start);
} private void initEvent() {
btn_start.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,
SecondActivity.class));
}
});
} @Override
protected void onClickActionBar(int type) {
if (type == ACTION_MIDDLE) {
Toast.makeText(this, "点击了中间标题", Toast.LENGTH_SHORT).show();
}
} }

在onCreate方法中通过setMainAction和setMiddleTitle方法实现样式的订制,实现onClickActionBar抽象方法,依据type值获取的我们点击事件。由此ActionBar已经被我们统一管理了。最后使用是不是非常easy,当然。这里仅仅是一个思路,actionbar的样式能够依据业务需求来进行订制。

下面是完整的github项目地址,欢迎star,fork。

github项目源代码地址:点击【项目源代码】

怎样优雅的管理ActionBar的更多相关文章

  1. 【swift学习笔记】五.使用枚举优雅的管理Segue

    在做页面转跳的时候,我们要给Segue命名,如果Segue多了,管理他们就是一个恶梦.我们可以枚举更优雅的管理这些Segue. 1.我们先来建立一个protocol,他的功能就是让实现类实现一个Seg ...

  2. 如何使用Defender优雅的管理权限?

    何为权限管理 权限管理已经不知不觉深入到了我们生活的每一个角落,例如地铁进站的闸机,高速公路上的过路费,停车场的杠杆等等等等. 作为一名开发人员,权限二字对我们的映像更加深刻,无论任何系统,都多多少少 ...

  3. 「SpringBoot」如何优雅地管理SpringBoot项目

    本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的Sp ...

  4. 在Asp.NET Core中如何优雅的管理用户机密数据

    在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法.在早期VB/VB.NET时代,经常使用.ini文 ...

  5. python编程【环境篇】- 如何优雅的管理python的版本

    简介 之前的文章(Python2还是python3 )中我们提到,建议现在大家都采用python3,因为python2在今年年底将不在维护.但在实际的开发和使用python过程中,我们避免不了还得用到 ...

  6. 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏

    转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D  ...

  7. Vuex结合 async/await 优雅的管理接口请求

    先看看 async/await 的语法 async 函数返回一个 Promise 对象 async 函数内部 return 返回的值.会成为 then 方法回调函数的参数. 1 2 3 4 async ...

  8. Unity3D 之脚本架构,优雅地管理你的代码

    本文参考雨松MOMO大神的帖子: 图片全部来自他的帖子(请允许我偷懒下) --------------------------------------------------------------- ...

  9. 如何使用maven优雅地管理项目版本号

    原文: https://blog.csdn.net/TeleDCOS/article/details/79853782

随机推荐

  1. 蓝牙(CoreBluetooth)-外部设备(服务端)

    蓝牙(CoreBluetooth)-外部设备(服务端) 主要内容 1. 创建外部管理器对象 2. 设置本地外设的服务和特征 3. 添加服务和特征到到你的设置的数据库中 4. 向外公布你的的服务 5. ...

  2. spring boot +mybatis+druid 多数据源配置

    因为我的工程需要在两个数据库中操作数据,所以要配置两个数据库,我这里没有数据源没有什么主从之分,只是配合多数据源必须要指定一个主数据源,所以我就把 操作相对要对的那个数据库设置为主数据(dataBas ...

  3. c3p0 APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks

    2018-01-04 15:02:03,319 ---com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.T ...

  4. 2. Retrofit2 -- Basic Authentication on Android

    2. Retrofit2 -- Basic Authentication on Android android Retrofit tutorial 整合基本的认证 Retrofit 1.9 Retro ...

  5. 碉堡完整的高性能PHP应用服务器appserver

    完全企业级的开发模式,是一个多线程的 PHP 应用服务器,实现真正多线程的 PHP 编程,高效安全而且快速,以Magento 为例比基于 Nginx的标准安装要快 50%.概念上非常像 Java 的 ...

  6. linux控制台超时自动注销

    仅让root用户超时退出: 编辑/root/.bash_profile文件,添加 export TMOUT=300 #300秒超时自动退出root 对所有用户设置自动注销: vi /etc/profi ...

  7. c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段(转但是都是使用过)

    DateTime dt = DateTime.Now;  //当前时间 DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 24小时制 Dat ...

  8. Java 使用 HttpClient调用https 最新源码 JDK7+ apache4.3+

    在项目使用https方式调用别人服务的时候,以前要写很多的代码,现在框架封装了很多,所以不用再写那么多了. 网上看了一下,都是很老的版本,用过时的DefaultHttpClient. 以spring为 ...

  9. 第二百零五节,jQuery EasyUI,Messager(消息窗口)组件

    jQuery EasyUI,Messager(消息窗口)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 Messager(消息窗口)组件的使用方法,这个组 ...

  10. linux 知识点拾遗

    文件名称 在 Linux 底下,每个档案或文件夹的文件名称最长能够到达 255 的字符,加上完整路径时,最长可达 4096 个字符; 因为 Linux 在文字接口下的一些指令操作关系,一般来说,您在设 ...