我的Android进阶之旅------>Android自定义窗口标题实例

简介:    该实例的功能比较简单,但是通过该实例的扩展可以在自定义标题中做出菜单导航等实用的功能,为了实现自定义窗口标题,需要做以下几个步骤: 1、给自定义标题提供一个界面 2、将自定义标题应用给Activity窗口 3、把android系统为Activit...

  

该实例的功能比较简单,但是通过该实例的扩展可以在自定义标题中做出菜单导航等实用的功能,为了实现自定义窗口标题,需要做以下几个步骤:

1、给自定义标题提供一个界面

2、将自定义标题应用给Activity窗口

3、把android系统为Activity设置的默认主题改为自己的主题


============================下面查看实现该例子的具体代码================================

step1、新建一个项目MyCustomTitle

step2、编写自定义标题的布局文件 /res/layout/custom_title.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="fill_parent" android:background="@drawable/rectangle"> <!-- 指定背景,该背景自己画的 -->

	<Button android:id="@+id/infoAtMeTextView"
		android:textColor="#FF0000" android:layout_width="wrap_content"
		android:layout_height="match_parent" android:layout_weight="1"
		android:gravity="center" android:text="\@我" />
	<Button android:id="@+id/infoCommentTextView"
		android:textColor="#FF0000" android:layout_width="wrap_content"
		android:layout_height="match_parent" android:layout_weight="1"
		android:gravity="center" android:text="评论" />
	<Button android:id="@+id/infoPrivateMsgTextView"
		android:textColor="#FF0000" android:layout_width="wrap_content"
		android:layout_height="match_parent" android:layout_weight="1"
		android:gravity="center" android:text="私信" />
</LinearLayout>

step3、上面布局文件中使用的背景是一个drawable文件,该drawable文件绘制了一个长方形。该文件是/drawable/rectangle.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 下面定义了一个长方形 -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
	android:shape="rectangle">
	<gradient android:angle="270" android:endColor="#1DC9CD"
		android:startColor="#A2E0FB" />
	<padding android:left="2dp" android:top="2dp" android:right="2dp"
		android:bottom="2dp" />
</shape>

step4、将自定义标题设置到Activity中,CustomTitleActivity.java

package cn.oyp.title;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class CustomTitleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //指定使用自定义标题
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.main);
        //设置窗口的自定义标题布局文件
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
        
    }
}

===================================== 读源码开始 ==============================================


然后运行该应用,发现用户设置后的自定义layout没有办法填充整个标题栏。

通过查看Android源代码得知Android系统为Activity的title默认设置了一个布局文件,该布局文件是core/res/res/layout/screen_title.xml


<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
          http://www.apache.org/licenses/LICENSE-2.0
  
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<!--
This is an optimized layout for a screen, with the minimum set of features
enabled.
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:fitsSystemWindows="true">
    <FrameLayout
        android:layout_width="match_parent" 
        android:layout_height="?android:attr/windowTitleSize"
        style="?android:attr/windowTitleBackgroundStyle">
        <TextView android:id="@android:id/title" 
            style="?android:attr/windowTitleStyle"
            android:background="@null"
            android:fadingEdge="horizontal"
            android:gravity="center_vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
    <FrameLayout android:id="@android:id/content"
        android:layout_width="match_parent" 
        android:layout_height="0dip"
        android:layout_weight="1"
        android:foregroundGravity="fill_horizontal|top"
        android:foreground="?android:attr/windowContentOverlay" />
</LinearLayout>

读上一段代码可以发现该布局文件由两个帧布局构成,而其中的几个属性

?android:attr/windowTitleSize 标题高度

?android:attr/windowTitleBackgroundStyle     标题背景样式

?android:attr/windowContentOverlay 标题前景色

而这几个属性的值都是在core/res/res/values/themes.xml文件中被赋值了

	<style name="Theme">
		<item name="android:windowContentOverlay">@android:drawable/title_bar_shadow</item>
		<item name="android:windowTitleSize">25dp</item>
		<item name="android:windowTitleBackgroundStyle">@android:style/WindowTitleBackground</item>
	</style>

而上面的@android:style/WindowTitleBackground样式在core/res/res/values/styles.xml文件中被定义

        <style name="WindowTitleBackground">
		<item name="android:background">@android:drawable/title_bar</item>
	</style>

===================================== 读源码结束 ==============================================

step5、自定义样式 /res/values/style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<!-- 该样式继承系统的默认样式 -->
	<style name="customTheme" parent="android:Theme">
		<!-- 设置标题前景色为透明 -->
		<item name="android:windowContentOverlay">@drawable/nocolor</item>
		<!-- 设置标题高度为44dp -->
		<item name="android:windowTitleSize">44dp</item>
		<!-- 设置标题背景色 -->
		<item name="android:windowTitleBackgroundStyle">@style/customBg</item>
	</style>
	
	<!-- 定义一个背景样式 -->
	<style name="customBg">
		<item name="android:background">@drawable/rectangle</item>
	</style>
</resources>

上面的@drawable/nocolor定义在/res/values/strings.xml文件中

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">该应用的目的是自定义窗口标题!</string>
    <string name="app_name">自定义窗口标题</string>
    <!-- 定义一个透明色 -->
	<drawable name="nocolor">#00000000</drawable>
</resources>

step6、将在自定义的标题样式应用到窗口中,在描述文件AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.oyp.title"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".CustomTitleActivity"
                android:theme="@style/customTheme"><!-- 使用自定义主题 -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

step7:查看该自定义窗口的效果

=================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

==================================================================================================



相关文章
|
2月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
42 3
|
4月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
79 2
基于Android P,自定义Android开机动画的方法
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
91 0
|
4月前
|
Android开发
Android Stadio Build 窗口字符串乱码问题
在使用Android Studio过程中,如果遇到Build窗口字符串乱码问题,可以通过编辑`studio.vmoptions`文件添加`-Dfile.encoding=UTF-8`配置并重启Android Studio来解决。
181 1
Android Stadio Build 窗口字符串乱码问题
|
4月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
4月前
|
测试技术 Android开发 Python
探索软件测试的艺术:从基础到高级安卓应用开发中的自定义视图
【8月更文挑战第29天】在软件开发的世界中,测试是不可或缺的一环。它如同艺术一般,需要精细的技巧和深厚的知识。本文旨在通过浅显易懂的语言,引领读者从软件测试的基础出发,逐步深入到更复杂的测试策略和工具的使用,最终达到能够独立进行高效测试的水平。我们将一起探索如何通过不同的测试方法来确保软件的质量和性能,就像艺术家通过不同的色彩和笔触来完成一幅画作一样。
|
24天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
26天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
32 5
|
2月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
3月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
63 10