怎样优雅的管理ActionBar
转载请标明出处:
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的更多相关文章
- 【swift学习笔记】五.使用枚举优雅的管理Segue
在做页面转跳的时候,我们要给Segue命名,如果Segue多了,管理他们就是一个恶梦.我们可以枚举更优雅的管理这些Segue. 1.我们先来建立一个protocol,他的功能就是让实现类实现一个Seg ...
- 如何使用Defender优雅的管理权限?
何为权限管理 权限管理已经不知不觉深入到了我们生活的每一个角落,例如地铁进站的闸机,高速公路上的过路费,停车场的杠杆等等等等. 作为一名开发人员,权限二字对我们的映像更加深刻,无论任何系统,都多多少少 ...
- 「SpringBoot」如何优雅地管理SpringBoot项目
本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的Sp ...
- 在Asp.NET Core中如何优雅的管理用户机密数据
在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法.在早期VB/VB.NET时代,经常使用.ini文 ...
- python编程【环境篇】- 如何优雅的管理python的版本
简介 之前的文章(Python2还是python3 )中我们提到,建议现在大家都采用python3,因为python2在今年年底将不在维护.但在实际的开发和使用python过程中,我们避免不了还得用到 ...
- 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏
转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D ...
- Vuex结合 async/await 优雅的管理接口请求
先看看 async/await 的语法 async 函数返回一个 Promise 对象 async 函数内部 return 返回的值.会成为 then 方法回调函数的参数. 1 2 3 4 async ...
- Unity3D 之脚本架构,优雅地管理你的代码
本文参考雨松MOMO大神的帖子: 图片全部来自他的帖子(请允许我偷懒下) --------------------------------------------------------------- ...
- 如何使用maven优雅地管理项目版本号
原文: https://blog.csdn.net/TeleDCOS/article/details/79853782
随机推荐
- python学习之多行字符串
多行字符串的写法 ("..." "..." "...") 例子 >>> err = ("a" ... ...
- CCNA2.0笔记_OSI模型
OSI模型分为七层: –由下到上分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 特点:1.OSI模型每层都有自己的功能集:2.层与层之间相互独立又相互依靠:3.上层依赖于下层,下层 ...
- html 基本标签 ---字体
<b> </b>加粗 <i> </i> 斜体 <del> </del> 删除 <ins> </ins> ...
- 设置VMware随系统开机自动启动并引导虚拟机操作系统
设置VMware随系统开机自动启动并引导虚拟机操作系统 转载 2012年03月15日 19:50:53 标签: vmware / 虚拟机 / windows / parameters / tools ...
- MapReduce编程实例3
MapReduce编程实例: MapReduce编程实例(一),详细介绍在集成环境中运行第一个MapReduce程序 WordCount及代码分析 MapReduce编程实例(二),计算学生平均成绩 ...
- Ubuntu 12.04 server 如何安装 OpenERP 7(转)
不经意的一次看到OpenERP这个开源ERP,就被其丰富的功能,简洁的画面,熟悉的语言所吸引.迫不及待的多方查询资料,自己架设一个测试环境来进行了解.以下为测试安装时候的步骤说明,以备查询,并供有需要 ...
- 清空oracle数据库
在开发过程中,可能经常需要重新初始化数据库,在初始化之前,我们肯定希望不再有以前的老表.存储过程等用户对象,用下面的教本就可以做到这一点: BEGIN FOR rec IN (SELECT objec ...
- 在CentOS 7上利用systemctl添加自定义系统服务 /usr/lib/systemd/
在CentOS 7上利用systemctl添加自定义系统服务[日期:2014-07-21] 来源:blog.csdn.net/yuanguozhengjust 作者:yuanguozhengjust ...
- 常用的AJAX框架
你有没有想过设计你的网站像桌面应用程序?幸运的是,使用AJAX,我们可以做到这一点.通过使用AJAX,当我们只想更新网站的一部分(如天气信息或新闻面板)时,我们无需刷新整个页面.这使我们的网络应用看起 ...
- python笔记6:常用模块
模块,模块就是封装了特殊功能的代码. 模块分为三种: 自定义模块 第三方模块 内置模块 1.自定义模块 自定义模块就是自己定义的模块,如何import自定义模块,如下: (1)主程序与模块程序在同一目 ...