自定义Activity标题栏(Title bar)和窗体显示状态操作(requestWindowFeature()的应用)

转载 2012年03月30日 21:56:08

原文:http://android.blog.51cto.com/268543/636134

1. 标题栏显示图标

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_LEFT_ICON);

        setContentView(R.layout.main);
     
        getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
                        android.R.drawable.icon);

        // ...
}
但实际效果呢,我觉得不好看,和旁边的文字有相当距离!看看别人的图片的:

当然这个图标也可以通过自定义布局,使用ImageView来实现:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    <ImageView android:layout_width="wrap_content"    
            android:layout_height="wrap_content"    
            android:src="@drawable/icon"/>
    <TextView android:id="@+id/text"    
            android:layout_width="wrap_content"    
            android:layout_height="wrap_content"    
            android:layout_alignParentLeft="true"    
            android:text="文本" />    
</LinearLayout>
效果图:

2.自定义布局
看看我自定义的标题栏:
布局代码(titlebar.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="wrap_content"
>
        <TextView
                android:text="@string/app_name"
                android:textColor="#000"
                android:paddingRight="3.0dip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <TextView
                android:text="@string/battery_text"
                android:textColor="#000"
                android:paddingRight="3.0dip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <TextView
                android:id="@+id/battery_text"
                android:textColor="#00f"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
</LinearLayout>

Java代码:
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

        setContentView(R.layout.main);

        //自定义标题栏
        mWindow = getWindow();
        mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar);

        mBatteryText = (TextView)findViewById(R.id.battery_text);

        mBatteryInforeceiver = new BroadcastReceiver(){

             @Override
             public void onReceive(Context context, Intent intent) {
                     int level = intent.getIntExtra("level", 0);
                     int scale = intent.getIntExtra("scale", 1);
                     mBatteryText.setText(String.valueOf((int)(level*100/scale))+"%");
             }
             
        };
}
你还可以添加其他控件,而这些控件的获取和事件响应都是直接在activity里面完成。

3. 设置标题栏的背景色和高度
虽然我们可以通过自定义布局文件在标题栏加入一些控件,但是仍然不能改变标题栏的高度、背景色,要想达到这个目的,只能使用theme(主题)。
\res\values\style.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
        <style name="CustomWindowTitleBackground">
                <item name="android:background">#47B2FF</item>
        </style>

        <style name="activityTitlebar" parent="android:Theme">
                <item name="android:windowTitleSize">34dp</item> <!-- 高度 -->
                <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item>    <!-- 背景色,需要调用前面的颜色设置 -->
        </style>
</resources>


窗体显示状态操作(requestWindowFeature()的应用)

首先介绍一个重要方法那就是requestWindowFeature(featrueId),它的功能是启用窗体的扩展特性。参数是Window类中定义的常量。
一、枚举常量
1.DEFAULT_FEATURES:系统默认状态,一般不需要指定
2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定
3.FEATURE_CUSTOM_TITLE:自定义标题。当需要自定义标题时必须指定。如:标题是一个按钮时
4.FEATURE_INDETERMINATE_PROGRESS:不确定的进度
5.FEATURE_LEFT_ICON:标题栏左侧的图标
6.FEATURE_NO_TITLE:没标题
7.FEATURE_OPTIONS_PANEL:启用“选项面板”功能,默认已启用。
8.FEATURE_PROGRESS:进度指示器功能
9.FEATURE_RIGHT_ICON:标题栏右侧的图标

对于默认启用的和前面有介绍的就略去不提了。我们说比较常用的FEATURE_INDETERMINATE_PROGRESS和FEATURE_NO_TITLE。

FEATURE_INDETERMINATE_PROGRESS:表示一个进程正在运行
progress.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ProgressBar android:id="@+id/progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"     
            android:layout_gravity="center_vertical"
            style="?android:attr/progressBarStyleSmallTitle">
    </ProgressBar>
</LinearLayout>

Java代码
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.main);

        getWindow().setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, R.layout.progress);
        setProgressBarIndeterminateVisibility(true); //适当时候set false来隐藏

        //...
}

标题进度条显示

FEATURE_NO_TITLE 就是不显示标题栏,某些时候全屏需要,但全屏不等于不显示标题栏,我尝试显示标题栏的同时全屏来去掉系统的状态栏:
Java代码
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

        setContentView(R.layout.main);

        //自定义标题栏
        mWindow = getWindow();
        mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar);

        /* full screen */
        mWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // ...
}
所以真正实现全屏的是后面的那句话!

效果图

***********
本文部分内容摘录于《Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)》http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html

自定义Activity标题栏(Title bar)和窗体显示状态操作(requestWindowFeature()的应用)

 1. 标题栏显示图标 public void onCreate(Bundle savedInstanceState) {         super.onCreate(saved...
  • u012075739
  • u012075739
  • 2014年03月30日 21:06
  • 373

android studio中requestWindowFeature(Window.FEATURE_NO_TITLE)隐藏标题栏失效的解决方案

解决方法来自http://blog.csdn.net/liuzhidong123/article/details/7818531博客的评论中,该博客介绍了多种隐藏标题栏的方法 解决方法:创建的ac...
  • u013527937
  • u013527937
  • 2016年07月16日 08:55
  • 2424

android studio 中去除actionbar 标题栏的方法。requestWindowFeature(Window.FEATURE_NO_TITLE)无效

解决方法:创建的activity默认继承了AppComxxxxxActivity,把这个改成Activity就行了如果按照默认的继承 AppCompatActivity,我试过两种方法:方法一:可以在...
  • sinat_35541927
  • sinat_35541927
  • 2016年08月25日 16:55
  • 656

Android 自定义标题栏Title Bar

在Android自定义标题栏,步骤很简单: 1.  在onCreate方法中声明如下代码: requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); ...
  • shineflowers
  • shineflowers
  • 2015年12月11日 15:39
  • 3939

Activity标题(title)的显示和隐藏

开发android应用程序,我们总会遇到Activity的title把我们要显示的内容遮挡住了。我们一心想把它给去掉,这样我们的应用界面就会变得更加简洁了。下面有两种方法可以去掉: (方法一):通过一...
  • yuqiangabcd
  • yuqiangabcd
  • 2015年06月04日 10:46
  • 5616

关于PreferenceActivity的使用和一些问题的解决(自定义Title和取值)

android的Setting往往用PreferenceActivity来写的 我们在建立layout文件:
  • baidu_nod
  • baidu_nod
  • 2014年07月09日 17:28
  • 2053

Win10开发:玩转应用窗体和应用标题栏TitleBar

Windows10 API允许开发者自定义应用标题栏。但是什么是应用标题栏?比如Groove音乐的应用标题栏就是下面这样:     什么,你说看不清楚。因为它是白色的,是微软设计的,这锅我不背。 你...
  • zmq570235977
  • zmq570235977
  • 2015年09月05日 17:05
  • 1406

[Android] 自定义顶部标题栏

思路及实现步骤1.定义标题栏布局 2.自定义TitleActivity控制标题栏按钮监听 3.在TitleActivity中实现标题栏...
  • yuxin1100
  • yuxin1100
  • 2016年06月09日 22:30
  • 3986

Activity标题栏添加返回按钮

有时候我们需要在Actionbar(标题栏)左侧添加返回按钮,怎么才能简单又美观的添加呢?很简单,只需要一行代码就可以了。 比如我们想在Activity1中添加返回按钮,返回Activity2。可以...
  • Key_MQL
  • Key_MQL
  • 2017年05月12日 20:51
  • 673

Qt Quick 5.2 开发笔记3-------qml界面之自定义TitleBar

搞完了c++和QML的交互问题,接下去,终于可以放心开始做界面 先唱一首歌, 美工产品我们去哪里呀 有我在就天不怕地不怕 美工美工我是你的蓝图 一直陪你搞不清楚 产品产品我们去哪里呀 你就是我的天大和...
  • hellowithsmile
  • hellowithsmile
  • 2014年03月07日 22:57
  • 3586
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义Activity标题栏(Title bar)和窗体显示状态操作(requestWindowFeature()的应用)
举报原因:
原因补充:

(最多只允许输入30个字)