WindowFeature及Activity内置Theme

1. 自定义标题栏

1.1 常规自定义标题栏

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

 

自定义Activity的标题栏(Titlebar)

 

http://www.189works.com/article-51509-1.html

 

 

本文仅用到了Window.FEATURE_CUSTOM_TITLE, 

Window还有其他一些feature,比如FEATURE_CONTEXT_MENU,FEATURE_NO_TITLE,FEATURE_LEFT_ICON等。

 

下面是一个来自wfd的完整的例子

wfd中的首页布局文件

 

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical" android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
  
    <ListView android:id="@android:id/list" android:layout_width="fill_parent"  
        android:layout_height="wrap_content" android:drawSelectorOnTop="false">  
  
    </ListView>  
    <TextView android:id="@id/android:empty" android:layout_width="fill_parent"  
        android:layout_height="wrap_content" android:text="还没有会议刷新看看"  
        android:gravity="center_horizontal" />  
  
    <LinearLayout android:layout_width="fill_parent"  
        android:layout_height="90dp" android:gravity="center_horizontal"  
        android:orientation="vertical" android:layout_alignParentBottom="true">  
        <Button android:text="发起会议" android:id="@+id/launch"  
            android:layout_width="200dp" android:layout_height="wrap_content"></Button>  
  
        <LinearLayout android:layout_width="fill_parent"  
            android:layout_height="wrap_content" android:gravity="center">  
            <CheckBox android:id="@+id/use_password" android:text="" android:layout_width="wrap_content"  
                android:layout_height="wrap_content"></CheckBox>  
            <TextView android:layout_width="wrap_content"  
                android:layout_height="wrap_content" android:text="启用密码"></TextView>  
        </LinearLayout>  
    </LinearLayout>  
  
    <LinearLayout android:id="@+id/home_refresh_bar"  
        android:layout_width="wrap_content" android:layout_height="wrap_content"  
        android:visibility="invisible" android:layout_centerInParent="true"  
        android:gravity="center">  
        <ProgressBar android:layout_width="wrap_content"  
            android:layout_height="wrap_content"></ProgressBar>  
        <TextView android:layout_width="wrap_content"  
            android:layout_height="wrap_content" android:text="正在寻找会议室"  
            android:paddingLeft="3dp"></TextView>  
    </LinearLayout>  
      
    <LinearLayout android:id="@+id/home_join_bar"  
        android:layout_width="wrap_content" android:layout_height="wrap_content"  
        android:visibility="invisible" android:layout_centerInParent="true"  
        android:gravity="center">  
        <ProgressBar android:layout_width="wrap_content"  
            android:layout_height="wrap_content"></ProgressBar>  
        <TextView android:layout_width="wrap_content"  
            android:layout_height="wrap_content" android:text="正在加入会议室"  
            android:paddingLeft="3dp"></TextView>  
    </LinearLayout>  
</RelativeLayout>  

自定义title的布局

<?xml version="1.0" encoding="utf-8"?>  
  
<!-- 首页title布局 -->  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical" android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
  
    <LinearLayout android:layout_height="fill_parent"  
        android:layout_width="fill_parent" android:orientation="horizontal"  
        android:gravity="center_vertical" android:padding="3dp">  
        <ImageView android:id="@+id/home_app_icon"  
            android:layout_width="wrap_content" android:layout_height="wrap_content"  
            android:src="@drawable/icon" android:paddingRight="5dip"></ImageView>  
  
        <TextView android:id="@+id/home_app_name"  
            android:layout_width="wrap_content" android:layout_height="wrap_content"  
            android:text="@string/app_name"></TextView>  
  
        <LinearLayout android:layout_width="0dip"  
            android:layout_height="wrap_content" android:layout_weight="1"  
            android:gravity="right" android:layout_gravity="center_vertical">  
            <ImageView android:id="@+id/home_refresh"  
                android:layout_width="wrap_content" android:layout_height="wrap_content"  
                android:src="@drawable/search_32" android:paddingRight="15dp"></ImageView>  
            <ImageView android:id="@+id/home_options"  
                android:layout_width="wrap_content" android:layout_height="wrap_content"  
                android:src="@drawable/gear_32"></ImageView>  
        </LinearLayout>  
    </LinearLayout>  
  
    <TextView android:background="@drawable/divider"  
        android:layout_height="1dip" android:layout_width="fill_parent"></TextView>  
</LinearLayout>  

  java代码

 

 

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  
    setContentView(R.layout.home);  
    // 设置自定义的title  
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,  
            R.layout.home_custom_title);  
  
    // 添加一个footview  
    // getListView().addFooterView(  
    // LayoutInflater.from(this).inflate(R.layout.home_foot, null));  
  
    mAdapter = new MeetingRoomAdapter();  
    doAddTestData();  
    setListAdapter(mAdapter);  
  
    mRefresh = (ImageView) findViewById(R.id.home_refresh);  
    mOptions = (ImageView) findViewById(R.id.home_options);  
    mRefreshBar = (LinearLayout) findViewById(R.id.home_refresh_bar);  
    mJoinBar = (LinearLayout) findViewById(R.id.home_join_bar);  
  
    mLaunch = (Button) findViewById(R.id.launch);  
    mUsePwd = (CheckBox) findViewById(R.id.use_password);  
  
    mUsePwd.setOnCheckedChangeListener(this);  
    mRefresh.setOnClickListener(this);  
    mOptions.setOnClickListener(this);  
    mLaunch.setOnClickListener(this);  

效果

WindowFeature及Activity内置Theme

1.2 PreferenceActivity的自定义标题栏

 

PreferenceActivity 自定义title栏出错

http://www.cnblogs.com/slider/archive/2011/11/11/2245149.html

 

 

开发WFD过程中也遇到这个"PreferenceActivity 自定义title栏出错"的问题。

 

经分析,主要原因是因为PreferenceActivity 跟一般Activity不同. PreferenceActivity 的onCreate方法里面执行了setContentView, 而这个方法必须在

requestWindowFeature之后执行。 反映到我们继承自PreferenceActivity 的具体代码中就是, requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)要在super.onCreate(savedInstanceState)前执行  

代码如下

 

public class SettingsActivity extends PreferenceActivity implements  
        Preference.OnPreferenceChangeListener {  
  
    public static final String KEY_USERNAME = "username";  
  
    private EditTextPreference mUsername;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // 注意, PreferenceActivity  
        // 里面需要把这个放在super.onCreate(savedInstanceState)前面!!!  
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  
        super.onCreate(savedInstanceState);  
  
        addPreferencesFromResource(R.xml.settings);  
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,  
                R.layout.settings_custom_title);  
  
        mUsername = (EditTextPreference) findPreference(KEY_USERNAME);  
        mUsername.setSummary(getUsername());  
        mUsername.setText(getUsername());  
  
        mUsername.setOnPreferenceChangeListener(this);  
    }  
  
    @Override  
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,  
            Preference preference) {  
  
        return super.onPreferenceTreeClick(preferenceScreen, preference);  
    }  
  
    private String getUsername() {  
        String name = PrefUtil.get(this, PrefUtil.PREF_SETTINGS, KEY_USERNAME,  
                Build.MODEL);  
        return name;  
    }  
  
    @Override  
    public boolean onPreferenceChange(Preference preference, Object newValue) {  
        if (preference == mUsername) {  
            String val = (String) newValue;  
            Logger.d("val = " + val);  
            if (val != null && !val.equals("") && !val.equals(getUsername())) {  
                mUsername.setSummary(val);  
                PrefUtil.set(this, PrefUtil.PREF_SETTINGS, KEY_USERNAME,  
                        mUsername.getText());  
            }  
        }  
  
        return false;  
    }  
}  
 

2. 标题栏进度条

http://qing.weibo.com/2617185797/9bff160533000f4l.html?retcode=6102

最关键的位置就是在setContentView之前添加下面的这行代码

 

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); //设置为圆形旋转进度条

 

 或者

 

requestWindowFeature(Window.FEATURE_PROGRESS); //设置为水平进度条 注意标题栏的水平进度条最大值是10000,不用自己手动设置
 

 

 

3. Java代码中隐藏标题栏

在Activity.setCurrentView()之前调用此方法

 

private void hideTitle(){
//TODOAuto-generatedmethodstub
requestWindowFeature(Window.FEATURE_NO_TITLE);
}

 

4. Java代码中全屏

在Activity.setCurrentView()之前调用此方法

 

private void hideStatusBar(){
//TODOAuto-generatedmethodstub
// 隐藏标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 定义全屏参数
intflag=WindowManager.LayoutParams.FLAG_FULLSCREEN;
// 获得窗口对象
WindowmyWindow=this.getWindow();
// 设置 Flag标识
myWindow.setFlags(flag,flag);
}

5. manifest中全屏

 

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

 

6. manifest中隐藏标题栏

 

android:theme="@android:style/Theme.NoTitleBar"

 

7. 半透明风格的Activity

 

android:theme="@android:style/Theme.Translucent"

或者先编写一个color.xml

 

<?xmlversion="1.0"encoding="UTF-8"?>
<resources>
<colorname="transparent">#9000</color>
</resources>

再编写一个styles.xml 

 

<?xmlversion="1.0"encoding="utf-8"?>
<resources>
<stylename="Transparent">
  <itemname="android:windowBackground">@color/transparent</item>
  <itemname="android:windowIsTranslucent">true</item>
  <itemname="android:windowAnimationStyle">@+android:style/Animation.Translucent</item>
</style>
</resources>

 最后使用这个style

 

android:theme="@style/transparent"

 参考http://blog.csdn.net/yuejingjiahong/article/details/6668265

8. 对话框风格的Activity

 

android:theme="@android:style/Theme.Dialog"

9. 运行时切换全屏

 

	/**
	 * 切换全屏和非全屏
	 */
	private void switchFullScreen() {
		if (null != switchFullScreenToast) {
			switchFullScreenToast.cancel();
		}
		
		if (fullScreen) {
			getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
			switchFullScreenToast = Toast.makeText(this, R.string.exit_full_screen, Toast.LENGTH_SHORT);
			switchFullScreenToast.show();
		} else {
			getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
			switchFullScreenToast = Toast.makeText(this, R.string.enter_full_screen, Toast.LENGTH_SHORT);
			switchFullScreenToast.show();
		}
		fullScreen = !fullScreen;		
	}

  10. 使用自定义style解决自定义title栏高度太小的问题

 

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
<style name="TransparentListView" parent="@android:style/Widget.ListView">   
  <item name="android:cacheColorHint">@android:color/transparent</item>   
 </style>   
</resources> 

 然后使用这个style

 

<activity android:name=".ui.HomeActivity" android:theme="@style/CmTitleBar"></activity>
 

 

你可能感兴趣的:(Activity)