如何优雅的管理ActionBar

转载请标明出处:

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项目源码地址:点击【项目源码】

时间: 2024-10-05 04:33:07

如何优雅的管理ActionBar的相关文章

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

在做页面转跳的时候,我们要给Segue命名,如果Segue多了,管理他们就是一个恶梦.我们可以枚举更优雅的管理这些Segue. 1.我们先来建立一个protocol,他的功能就是让实现类实现一个SegueIdentifier别名,这个SegueIdentifier必需为RawRepresentable类型,在后边我们就会用 protocol SegueHandlerType { associatedtype SegueIdentifier: RawRepresentable } 2.我们要对上边

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

本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的SpringBoot项目的? 小明(自信满满):启动时使用java -jar xxxx.jar命令启动,停止服务时,使用ps -ef找到服务的pid,然后再kill掉停止. 胖虎:就这? 这让小明很有挫败感,原计划按时放学回去陪隔壁小花打王者荣耀的小明,毅然决然留在教室潜心研究一番到底什么是Spring

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

转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静

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

本文参考雨松MOMO大神的帖子: 图片全部来自他的帖子(请允许我偷懒下) ------------------------------------------------------------------------ 写代码,我相信大家都会,但我看过不少网上的源代码,发现很多人代码写得很随意, 想到什么写什么,没有个固定的框架,代码乱,高耦合,不仅看起来不舒服,以后要维护也非常困难, 而且还容易出现一直莫名其妙的BUG. 呐,本人有点小洁癖,有点强迫症,虽然我还只是个菜鸟,但我却非常在意代码的

跨平台渲染框架尝试 - constant buffer的管理

1. Preface Constant buffer是我们在编写shader的时候,打交道最多的一种buffer resource了.constant表明了constant buffer中的数据,在一次draw call的执行过程中都是不变的:而在不同的draw call之间,我们可以修改其中的数据.它是我们把数据从CPU传递到GPU最常见的方法.constant buffer的概念和定义就不在这里赘述了,鄙文主要讨论如何优雅的管理constant buffer. 2. How to creat

如何养成良好的 C++ 编程习惯(一)—— 内存管理

开篇导读 “养成良好的编程习惯”其实是相当综合的一个命题,可以从多个角度.维度和层次进行论述和评判.如代码的风格.效率和可读性:模块设计的灵活性.可扩展性和耦合度等等.要试图把所有方面都阐述清楚必须花很多的精力,而且也不一定能阐述得全面.因此,本系列文章以软件开发的基础问题为切入点,阐述程序设计和代码编写方面的细节问题,以点带面,旨在激发大家的思考与总结,希望能为大家带来实际的帮助.     虽然本系列文章定位为科普读物,但本座相信它们不但适合新手们学习借鉴,同时也能引发老鸟们的反思与共鸣.欢迎

python之上下文管理器

关于计算器运行的上下文的概念,我的理解也不是很深:按我的理解就是程序在运行之前,其所需要的资源,运行环境等都会被序列化,然后加入到CPU的任务队列中,等待调度系统分配时间片执行.下面谈谈python上下文管理器的使用. 自定义上下文管理器 python中最常用的上下文管理器就是文件的打开和关闭了. with open(filename,'r') as file: file.read() 原理 python上下文使用with触发,内部实现了__enter__和__exit__两个魔法方法. cla

IOS中CoreData浅析

CoreData简介: 什么是CoreData? Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象.在此数据操作期间,我们不需要编写任何SQL语句 CoreData 不能执行SQL语句 取而代之,操作的是对象.而常用的三方库 FMDB SQLite 可以直接SQL语句 CoreData和数据库有什么区别? CoreData是一个苹果原生的框架,它拥有像数

CocoaPods 安装和使用

一.<什么是CocoaPods> 官网描述:CocoaPods is the dependency manager for Swift and Objective-C Cocoa projects. It has almost ten thousand libraries and can help you scale your projects elegantly.(CocoaPods是一个独立的管理器,可以为Swift/Objective-C项目提供管理,它拥有数千万计的第三方库,因而可以帮