カスタムActivityタイトルバー(Title bar)とフォーム表示状態操作(requestWindowFeature()の適用)

12227 ワード

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);
//適宜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()のアプリケーション)」に抜粋されています.
例は次のとおりです.
package com.easyway.titlebar.androids;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.TextView;

public class CustomTitleBarActivity 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);
      // 
      Window mWindow = getWindow();
      mWindow.setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar);
      final TextView mBatteryText = (TextView)findViewById(R.id.battery_percent);

      BroadcastReceiver 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("Android :"+String.valueOf((int)(level*100/scale))+"%");
           }
           
      };

    }
}
 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_percent"
                android:textColor="#00f"
                android:layout_width="wrap_content"
                android:text="55%"
                android:layout_height="wrap_content"/>
</LinearLayout>
 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.easyway.titlebar.androids"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:theme="@style/activityTitlebar"
            android:name=".CustomTitleBarActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>