开发 Android APP 经常会用到自定义标题栏,而有多级页面的情况下还需要给自定义标题栏传递数据。

本文要点:

  1. 自定义标题填充不完整
  2. 自定义标题栏返回按钮的点击事件

一、代码

这里先介绍一下流程:

1. 创建一个标题栏布局文件 mytitlebar.xml

2. 在style.xml中创建 mytitlestyle 主题

3. 创建类 CustomTitleBar

4. 在需要自定义标题栏的Activity的OnCreate方法中实例化 CustomTitleBar

5. 在 AndroidManifest.xml 对使用了自定义标题栏的Activity定义主题

1.定义一个自定义的标题栏布局 mytitlebar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/re_title" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="50dp" //定义自定义标题栏的高度
android:background="@color/start_background"
android:orientation="horizontal"> <ImageButton
android:scaleType="fitXY"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:id="@+id/bt_back"
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/left_back"
android:background="@color/touming"/>
<TextView
android:id="@+id/mytitle"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"//使文字在整个标题栏的中间
android:textColor="#fff"
android:textSize="20dp" /> </RelativeLayout >

2.在 style.xml 中创建 mytitlestyle 主题

<resources>
<!-- 自定义标题栏 parent="android:Theme" 这个属性必须写 -->
<style name="mytitlestyle" parent="android:Theme">
<!-- 设置高度,和 mytitlebar.xml中保持一致 -->
<item name="android:windowTitleSize">50dp</item>
<!-- 设置内填充为0 使自定义标题填充整个标题栏,否则左右两边有空隙 -->
<item name="android:padding">0dp</item>
</style>
</resources>

3.创建类 CustomTitleBar

public class CustomTitleBar {

    private Activity mActivity;
//不要使用 static 因为有三级页面返回时会报错 /**
* @param activity
* @param title
* @see [自定义标题栏]
*/
public void getTitleBar(Activity activity, String title) {
mActivity = activity;
activity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
//指定自定义标题栏的布局文件
activity.setContentView(R.layout.mytitlebar);
activity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
R.layout.mytitlebar);
//获取自定义标题栏的TextView控件并设置内容为传递过来的字符串
TextView textView = (TextView) activity.findViewById(R.id.mytitle);
textView.setText(title);
//设置返回按钮的点击事件
ImageButton titleBackBtn = (ImageButton) activity.findViewById(R.id.bt_back);
titleBackBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//调用系统的返回按键的点击事件
mActivity.onBackPressed();
}
});
}
}

4.在需要自定义标题栏的Activity的OnCreate方法中实例化 CustomTitleBar,这里是food页面

public class food extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//实例化CustomTitleBar 传递相应的参数
CustomTitleBar ct = new CustomTitleBar();
ct.getTitleBar(this, "美食");
setContentView(R.layout.page_food);
}
}

5.在 AndroidManifest.xml 对使用了自定义标题栏的Activity定义主题

//省略了其余部分,android:theme="@style/mytitlestyle"这句必需写
<activity
android:name=".food"
android:label="@string/activity_food"
android:theme="@style/mytitlestyle" />

二、总结

使用自定义标题栏的时候,很多人会遇到填充不满,左右两边有空隙以及返回按钮点击事件不响应的问题,这里测试和总结了最为合适的方式解决。

自定义标题栏填充不满,网上有不少解决方案,有的还比较复杂,我这里直接在定义Theme时一个属性就解决了,还比较容易理解。

自定义标题栏返回按钮点击事件不响应或出错的问题,也是测试了网上的很多代码,用onBackPressed()最为方便,也有人使用finish(),其余的OnKeyDown之类的测试未通过。

我的独立博客:时光无罪

Android 自定义标题栏的更多相关文章

  1. [置顶] xamarin android自定义标题栏(自定义属性、回调事件)

    自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...

  2. setFeatureInt、android 自定义标题栏

    Android 自带的toolbar 往往不能很好的的满足我们的个性化要求.因此我们经常使用自定的的标题栏.而Android系统本身也允许我们自定以标题栏. 记录一下,自定义标题栏常遇到的问题.先上效 ...

  3. Android -- 自定义标题栏,背景颜色填充满

    设置标题栏背景 1> 准备背景图片: background_pix.png 注:用背景图片比用颜色好处,可以让背景看起来有凹凸感. 2> drawable文件夹下放xml文件 bitmap ...

  4. (转)Android 自定义标题栏(title栏)

    转:http://blog.csdn.net/jamin0107/article/details/6715678 第一步,向实现自定义标题栏,需要在onCreate方法里这样写 requestWind ...

  5. Android自定义标题栏

    预览一下效果: 素材: 新建一个布局title_bar.xml,代码如下: <?xml version="1.0" encoding="utf-8"?&g ...

  6. android 自定义标题栏 titleBar自定义

    在value文件夹下添加style.xml <?xml version="1.0" encoding="utf-8"?> <resources ...

  7. Android—自定义标题栏的实现及遇见的问题解决

    开发者设计界面时候往往不会使用系统自带的标题栏,因为不美观,所以需要自己设置标题栏. 1.根据需求在xml文件中设置标题布局 <?xml version="1.0" enco ...

  8. Android开发-取消程序标题栏或自定义标题栏

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在Android开发中,跟据需要我们有时候需要自定义应用程序的标题栏或者取消程序的标题栏,下面本菜鸟在此记录与分享一下自己使用的方法 ...

  9. Android应用开发基础篇(14)-----自定义标题栏

    一.概述 每一个应用程序默认的标题栏(注意与状态栏的区别)只有一行文字(新建工程时的名字),而且颜色.大小等都是固定的,给人的感觉比较单调.但当程序需要美化的时候,那么修改标题栏是就是其中一项内容,虽 ...

随机推荐

  1. Markdown语法及SublimeText下使用技巧

    Markdown语法及SublimeText下使用技巧 0.缘起 最近因为一直在学习Sublime Text,所以也就顺便试用了一下ST对Markdown的支持.正好CSDN正在大力宣传新上线的Mar ...

  2. ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS下使用传感器和执行器

    ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS使用传感器和执行器 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第四 ...

  3. Spark发展现状与战线

    前言 现今Spark正是风头正劲时,Spark本是UCBerkeley的AMPLab诞生的项目,后来捐赠给了Apache来管理源码和后续发展.今年从Apache孵化器终于孵化出了1.0版本.其对大数据 ...

  4. 简单搭建iOS开发项目框架

    今天我们来谈谈如何搭建框架,框架需要做一些什么. 第一步:找到我们的目标我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题. 第二步:我们需要做哪些东西各位跟着我一步一步来进行. 假 ...

  5. 带你深入理解STL之Deque容器

    在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点.vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操 ...

  6. 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条

    混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...

  7. OpenMP并行化实例----Mandelbrot集合并行化计算

    在理想情况下,编译器使用自动并行化能够管理一切事务,使用OpenMP指令的一个优点是将并行性和算法分离,阅读代码时候无需考虑并行化是如何实现的.当然for循环是可以并行化处理的天然材料,满足一些约束的 ...

  8. Android简易实战教程--第十五话《在外部存储中读写文件》

    第七话里面介绍了在内部存储读写文件 点击打开链接. 这样有一个比较打的问题,假设系统内存不够用,杀本应用无法执行,或者本应用被用户卸载重新安装后.以前保存的用户名和密码都不会得到回显.所以,有必要注意 ...

  9. AndroidManifest.xml中的application中的name属性

    被这个不起眼的属性折磨了一天,终于解决了. 由于项目需要,要合并两个android应用,于是拷代码,拷布局文件,拷values,所有的都搞定之后程序还是频频崩溃,一直没有找到原因,学android时间 ...

  10. path和classpath的区别

    path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\jdk1.6 ...