如何优雅的管理ActionBar
2016-03-28 13:08
316 查看
转载请标明出处:
http://blog.csdn.net/hai_qing_xu_kong/article/details/50997095
本文出自:【顾林海的博客】
注意看actionbar,效果图:
1、先创建我们的actionbar布局,整体布局很简单,包含左边返回按钮、左边标题、中间标题和右边标题。具体情况以下common_action_bar.xml文件:
效果图如下:
2、创建完actionbar布局后,我们新建一个继承Activity的BaseActionBarActivity抽象类,获取系统actionbar,进行布局的替换:
mCommonActionBar就是我们前面定义的actionbar布局View。
3、在BaseActionBarActivity中定义一些方法,用于子类调用,如下:
4、创建我们的点击事件的回调,在BaseActionBarActivity中定义一个抽象方法:
方法的具体实现由子类实现,type的值有以下几种:
最后注册点击事件,调用相应的方法:
5、到这里启动程序,会出现背景黑色闪屏,在style文件中定义以下:
别忘了在AndroidManifest.xml中引用:
在onCreate方法中通过setMainAction和setMiddleTitle方法实现样式的订制,实现onClickActionBar抽象方法,根据type值获取的我们点击事件,由此ActionBar已经被我们统一管理了,最后使用是不是很简单,当然,这里只是一个思路,actionbar的样式可以根据业务需求来进行订制。
以下是完整的github项目地址,欢迎star,fork。
github项目源码地址:点击【项目源码】
http://blog.csdn.net/hai_qing_xu_kong/article/details/50997095
本文出自:【顾林海的博客】
前言
随着项目越来越大,页面数也相应的增加,每个页面都需要顶部的ActionBar,如果在每个xml文件中去include我们的actionbar布局,工作量也是很大,而且不利于后期维护。今天这篇文章是教大家合理的管理我们的actionbar,代码很简单,主要是一个思路。注意看actionbar,效果图:
管理ActionBar
为了达到actionbar的统一管理,这里需要获取系统的ActionBar。通过以下方法进行布局的替换:public abstract void setCustomView(View view, LayoutParams layoutParams);
1、先创建我们的actionbar布局,整体布局很简单,包含左边返回按钮、左边标题、中间标题和右边标题。具体情况以下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已经被我们统一管理了,最后使用是不是很简单,当然,这里只是一个思路,actionbar的样式可以根据业务需求来进行订制。
以下是完整的github项目地址,欢迎star,fork。
github项目源码地址:点击【项目源码】
相关文章推荐
- 【02单表查询】——03:OVER子句
- Android通知Notification用法
- 小试牛刀——JS闭包
- OC深,浅复制
- 推荐一个学习infiniband的网站
- 自定义控件:含下拉刷新和上拉加载 ListView 的原理
- 在一个字符串中查找另外一个字符串的全排列出现位置
- Python搜索路径
- css中的选择器
- 敏捷开发 个人感想
- 复利计算器的单元测试
- cocos2d-x触摸事件优先级的探究与实践
- code monkey的进化之路
- linux kernel阅读(一) 进程的生命周期
- struts中的helloword(1)
- 网易实习笔试真题C/C++
- Ubuntu 14.04 LTS 64位安装Oracle 11g (二)
- TableTools导出的文件csv都是中文乱码解决办法
- codeforces 25 E Test KMP
- 两个APP共享AccountManager管理的账号