怎样优雅的管理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
随机推荐
- hdu1025 最大上升字串
Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- mybatis的foreach写用法
一.mybatis查询 public abstract List<Model> findByIds(@Param("ids")List<Integer> i ...
- mfc小工具开发之定时闹钟之---功能介绍
使用背景: 之前在xp上用过飞雪日历,感觉挺好用的,还有在音频上的兴趣,促使了我也要自己做一个简单的定时闹钟. 之前开发过图片格式的小工具,没来的急分享,后期整理后,一块奉上,写这篇介绍的时候已近完成 ...
- java ssh介绍(1)
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- Windows平台安装最新OpenCV-2.4.9,利用Eclipse、MinGW构建C++调用OpenCV开发环境
近期电脑重装系统了,第一件事重装OpenCV. 这次直接装最新版,2014-4-25日公布的OpenCV2.4.9版本号,下载链接: http://sourceforge.net/projects/o ...
- JavaScript------Throw和Try-Catch的使用
function test() { try { var x = document.getElementById("demo").value; if (x == "&quo ...
- sizeWithFont:方法使用明细
个人总结: Computing Metrics for a Single Line of Text– sizeWithFont: 同下面,换行方式默认取NSLineBreakByWordWrappin ...
- 【BZOJ4384】[POI2015]Trzy wieże 树状数组
[BZOJ4384][POI2015]Trzy wieże Description 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符 ...
- iOS 错误提示
1.CUICatalog: Invalid asset name supplied: , or invalid scale factor: 2.000000 =>原因: You are call ...
- [LintCode] 带最小值操作的栈
class MinStack { public: MinStack() { // do initialization if necessary } void push(int number) { // ...