安卓开发-自定义标题栏

一个接着一个的activity,写啊写,调啊调,后来,终于发觉,activity的标题栏好难看,好单调啊。咱们为了吸引用户的眼球,得搞点个性化的东西。

  自定义标题栏的方法,网上一搜一大堆,我也稍微提一下,oncreate中加上如下代码就行:

  Java代码

  requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

  setContentView(view);

  getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);

  requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

  setContentView(view);

  getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title);

  这个名为title的layout是这样子的,很简单,就是一个textview,然后有个背景色:

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:background="#66cccccc"  
    >  
<TextView     
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"    
    android:text="hello"  
    />  
</LinearLayout>

  好,运行看效果。看到了吧,发现问题了没,标题栏的背景色没有填充满是吧,这可真是杯具哟。padding、margin什么的都用上也不管用,怎么办呢。

  看源码!

  window初始化,加载标题的地方,咱也不知道在哪里,不过咱能以layout作为切入点。打开源码里面的layout文件夹,找跟标题栏相关的xml文件。里面有screen_title.xml和screen_custom_title.xml,这就是咱们要找的目标了。

  既然是自定义标题,那我们就看screen_custom_title.xml,里面有一个title_container和一个content,组合成了标题栏,我们自定义标题所给出的view,都被content作为子view了,影响不了那个title_container和content,所以,任你怎么弄,它该留白的还是留白,你没招。

  看title_container有个style是这样的:style="?android:attr/windowTitleBackgroundStyle"

  content的foreground是这样的android:foreground="?android:attr/windowContentOverlay"

  好,从这里我们就可以入手改了。

  去values下面的themes.xml找到windowTitleBackgroundStyle这一项,这个应该在注释的下面。

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><item name="windowTitleBackgroundStyle">@android:style/WindowTitleBackground</item>

  然后去styles.xml下找到WindowTitleBackground项,

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><style name="WindowTitleBackground">  
        <item name="android:background">@android:drawable/title_bar</item>  
</style>

  发现是一个drawable,xml的,里面定义了背景图片。ok,我们知道了,这个是定义titlebar的背景色。

  然后,去values下面的themes.xml找到windowContentOverlay,也是属于window attributes。

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><item name="windowContentOverlay">@android:drawable/title_bar_shadow</item>

  发现也是个drawable,ok,我们也知道了,这个是定义contentoverlay的背景的。

  其实,通过研究我发现,不能填充满的原因是title_container的背景的原因,我们覆盖一下就行了。

  首先,写个themes文件

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><resources>  
    <style name="XTheme" parent="android:Theme">       
           
        <!-- Window attributes -->  
        <item name="android:windowTitleStyle">@style/XWindowTitle</item>      
        <item name="android:windowTitleBackgroundStyle">@style/StatusBarBackground</item>        
        <item name="android:windowContentOverlay">@null</item>  
    </style>     
</resources>

  然后写styles文件

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><resources>       
    <style name="StatusBarBackground">  
        <item name="android:background">@drawable/shape</item>  
    </style>  
               
    <style name="XWindowTitle" parent="android:WindowTitle">  
        <item name="android:shadowColor">#BB000000</item>  
        <item name="android:shadowRadius">0</item>  
    </style>  
</resources>

  注意这个XWindowTitle要继承WindowTitle。

  最后,在manifext中给自定义的activity申明主题。

  Xml代码

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><activity android:name=".Entry"  
           android:label="@string/app_name"  
           android:theme="@style/XTheme">  
     <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
     </intent-filter>  
</activity>

  好,我们来看看效果吧:

  

  so cool, isn‘t it?

  当然,你也可以换成别的颜色或者是更炫的图片做背景。

时间: 2024-08-10 16:36:49

安卓开发-自定义标题栏的相关文章

[安卓开发] 自定义View之一: 组合View

一.自定义View的分类 1.组合View 2.继承重写View 3.全写View 二.简介 组合View,就是组合一些View来形成一个新的View.例如QQ的头部栏 三.了解 ** android:layout_width="match_parent" 上面这个前缀android是根据 根控件的 xmlns:**android**="http://schemas.android.com/apk/res/android" 这个来命名的,这是系统的.我们要自定义Vi

安卓自定义标题栏

在一般开发中,应用的Title都是建立应用时在AndroidManifest.xml中配置的,或是用setTitle设置的简单字符串,要是想加入按钮,图片等多个复杂的布局,请使用以下的方法 功能:把title设置成为一个字串和一个按钮的组合 修改xxActivity.Java代码                public void onCreate(Bundle savedInstanceState) {                             super.onCreate(s

安卓开发_浅谈ListView(自定义适配器)

ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ,实现图片文字混合列表 1 package com.example.work; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 7 8 import android.R.in

安卓学习随笔 -- 自定义标题栏

在安卓中不喜欢系统默认的标题栏,那么如何让自定义一个自己的标题栏呢. 自定义后的标题栏如下: 首先这里需要定义一个自定义的标题栏布局 title.xml文件 (里边需要两个图片这个很简单) <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fi

安卓开发笔记——高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现)

先让大家看下效果图,这个是我自己在闲暇时间仿写的新浪微博客户端: 今天来讲讲如何实现上图的效果,这里需要用到SpannableString这个工具类,如果你对这个类并不熟悉,可以先看下我之前写的2篇文章: <安卓开发笔记——个性化TextView(新浪微博)>:http://www.cnblogs.com/lichenwei/p/4411607.html <安卓开发笔记——丰富多彩的TextView>:http://www.cnblogs.com/lichenwei/p/46120

安卓开发技巧二:自定义日志工具类XLog的实现

我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项目,用到打印日志的地方肯定特别多,等到真正上线的时候,我们是不希望日志依旧能够打印出的,原因很简单,不仅多少有些影响效率,更有可能导致信息的泄露,所以我们就需要把所有的日志打印语句全部取消掉,难道我们真的一个一个的去删除这些打印日志的语句吗?项目那么大,就是想删除,也得耗费大量的时间和精力!大家不用怕,笔者这就给大家带来一款控制线上版本和线下版本

【Win 10开发】自定义标题栏

UWP 现在已经可以自定义标题栏了,毕竟看灰色时间长了也会厌烦,开发者们还是希望能够将自己的UI做的更加漂亮,更加与众不同.那么废话不多说,我们开始吧! 首先要了解ApplicationViewTitleBar这个类.其中提供了以下属性: MSDN参考地址:ApplicationViewTitleBar class 首先,我们写一个TitleBarChanged方法,在里面先获取到当前窗口的实例. 1 ApplicationView view = ApplicationView.GetForCu

安卓开发笔记——自定义广告轮播Banner(无限循环实现)

关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户"友好性",下面来看几个示例图:     再来看下我仿写的效果: 关于广告轮播Banner这个东西,GitHub上面应该有现成的开源组件,不过我没去找过,觉得实现起来不会太难,就自己去仿写了,下面我说下实现的思路: 1.首先看到这个可以滑动切换图片的界面,我们很自然就会想到ViewPager

安卓开发_浅谈自定义组件

在Android中,所有的UI界面都是由View类和ViewGroup类及其子类组合而成.其中,View类是所有UI组件的基类,而ViewGroup类是容纳这些UI组件的容器. 其本身也是View类的子类. 在实际开发中,View类还不足以满足程序所有的需求.这时,便可以通过继承View类来开发自己的组件. 开发自定义组件的步骤: 1.创建一个继承android.view.View类的View类,并且重写构造方法. 2.根据需要重写相应的方法. 3.创建并实例化自定义View类,并将其添加到布局