您的位置:首页 > 其它

在 设置/显示 中增加是否一直显示状态栏的选项

2012-12-19 21:04 661 查看
源码:2.3.4

知识点:禁止所有应用使用全屏功能。这个改动很简单,只需要在frameworks\base\core\java\android\view\Window.java 这个类中的 public void setFlags(int flags, int mask) 函数,判断一下 flags 和 mask是不是都是 WindowManager.LayoutParams.FLAG_FULLSCREEN,如果是,则直接退出。

然后正式开始:

一。在 设置/选项中增加一个 CheckBoxPreference,选中的时候状态栏一直存在,不选中的时候正常状态(全屏程序时,会自动隐藏)

过程:

1。packages\apps\Settings\res\xml\display_settings.xml 中增加如下:

[html] view
plaincopy

<CheckBoxPreference

android:key="statusbar_show_setting"

android:title="Always show StatusBar"/>

2。packages\apps\Settings\src\com\android\settings\DisplaySettings.java 中增加如下:

声明一个变量:

// 被充一下,重新做的时候发现忘记写这个了,还要声明一个常量字符串

KEY_STATUSBAR_SHOW = = "statusbar_show_setting"

[java] view
plaincopy

private CheckBoxPreference mStatusBarShow;

在onCreate中初始化变量:

[java] view
plaincopy

mStatusBarShow = (CheckBoxPreference) findPreference(KEY_STATUSBAR_SHOW);

mStatusBarShow.setPersistent(false);

mStatusBarShow.setOnPreferenceClickListener(new CheckBoxPreference.OnPreferenceClickListener(){

@Override

public boolean onPreferenceClick(Preference preference) {

if (mStatusBarShow.isChecked()) {

Settings.System.putInt(getContentResolver(), Settings.System.STATUSBAR_SHOW,1);

}

else {

Settings.System.putInt(getContentResolver(), Settings.System.STATUSBAR_SHOW,0);

}

return false;

}

});

注意这里使用了Settings.System.STATUSBAR_SHOW,这个系统属性是我自已加的,在后面会讲到怎么增加。

在onResume()中增加初始化选中状态的代码(我这里在onResume中调用了另一个函数,所以我写在另一个函数里,但意思一样,就是显示前判断一下是否为选中)

[java] view
plaincopy

mStatusBarShow.setChecked(Settings.System.getInt(

getContentResolver(),

Settings.System.STATUSBAR_SHOW, 0) != 0);

三。在frameworks\base\core\java\android\view\Window.java 中增加判断是否可以全屏的代码,这个类中的函数修改如下:

[java] view
plaincopy

public void setFlags(int flags, int mask) {

if (Settings.System.getInt(mContext.getContentResolver(), Settings.System.STATUSBAR_SHOW,1) == 1) {

if (flags == mask && flags == WindowManager.LayoutParams.FLAG_FULLSCREEN) {

return;

}

}

final WindowManager.LayoutParams attrs = getAttributes();

attrs.flags = (attrs.flags&~mask) | (flags&mask);

mForcedWindowFlags |= mask;

if (mCallback != null) {

mCallback.onWindowAttributesChanged(attrs);

}

}

做到这里,设置/显示这部份的内容就完成了,不过由于我使用了自已增加的一个系统属性来记录是否总是显示状态栏,所以下面写怎么实现这个功能。

一。在frameworks\base\packages\SettingsProvider\res\values\defaults.xml 中增加自定义系统属性的初始值

[html] view
plaincopy

<integer name="def_statusbar_show_setting">1</integer>

二。在frameworks\base\core\java\android\provider\Settings.java 中增加自定义的系统变量

我是在1580多行写入这个:

[javascript] view
plaincopy

public static final String STATUSBAR_SHOW = "statusbar_show_setting";

然后在1772行这个数组中加入这个成员:(要注意,好像有个同名的数组在下面,它是删除的,不要写到那里面去)

[java] view
plaincopy

public static final String[] SETTINGS_TO_BACKUP = {

STATUSBAR_SHOW,

三。在frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java 中,初始化数据库的时候,加入我们自定义的系统变量。

[java] view
plaincopy

private void loadSystemSettings(SQLiteDatabase db) {

SQLiteStatement stmt = null;

try {

stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"

+ " VALUES(?,?);");

// cj

loadIntegerSetting(stmt, Settings.System.STATUSBAR_SHOW,

R.integer.def_statusbar_show_setting);

好了,全部完成。主要是三方面,一个在设置中增加一个选择框,二是在window中增加一个判断是否可以全屏的步骤,三是增加自定义的系统属性。(为了保存设置,下次启动时读取)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐