Android Settings新增選項
阿新 • • 發佈:2019-01-05
在Android中,設定Settings一直都是header+fragment的形式出現。例如設定裡面的“時間和日期”項,在settings_hesder.xml中其佈局大概是這樣:
<!-- Date & Time --> <header android:id="@+id/date_time_settings" android:fragment="com.android.settings.DateTimeSettings" android:icon="@drawable/ic_settings_date_time" android:title="@string/date_and_time"> <extra android:name="setting_component_key" android:value="date_time" /> <intent android:targetPackage="com.android.settings" android:targetClass="com.android.settings.Settings$DateTimeSettingsActivity"/> </header>
這是典型的一個設定中的選項,DateTimeSettings.java 繼承了Fragment。
所以要新增一個選項,模仿即可。
本例中以新增一個“老人模式”選項為例,為連線到一個APP中,即點選此選項將跳轉到相對應的APP。只需這個應用的包名和類名,我們就可以把它嵌入到設定Settings中。
1、首先在settings_hesder.xml中新增選項
<header android:id="@+id/aged_mode_setting_new" android:icon="@drawable/ic_settings_aged_mode" android:title="@string/aged_mode_setting_title" > <intent android:action="com.hll.haolauncher"/> </header>
其中,com.hll.haolauncher是目標應用的包名。
2、在SettingsActivity.java中新增該選項顯示
<pre name="code" class="java">// Show only these settings for restricted users private int[] SETTINGS_FOR_RESTRICTED = { R.id.wireless_section, R.id.wifi_settings, ...... R.id.aged_mode_setting_new };
3、找到updateHeaderList方法,更新Settings選項的狀態,程式碼大概如下:
private void updateHeaderList(List<Header> target) {
PDebug.Start("updateHeaderList");
int i = 0;
mHeaderIndexMap.clear();
while (i < target.size()) {
Header header = target.get(i);
int id = (int) header.id;
if (id == R.id.bluetooth_settings) {
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
target.remove(i);
}
} else if (id == R.id.battery_settings) {
if (!mBatteryPresent) {
target.remove(i);
}
}
else if(id==R.id.aged_mode_setting) {
if (enable){
target.remove(header);
}
}
PDebug.End("updateHeaderList");
}
一些選項的顯示或隱藏將被寫到這裡面。
4、設定Settings中的點選事件被寫在onHeaderClick方法中,如下:
if (header.id ==R.id.aged_mode_setting_new)
{
Intent mIntent = new Intent();
mIntent.setClassName("com.hll.haolauncher","com.hll.elauncher.StartActivity");
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(mIntent);
return;
}
過程基本上是如此,由於筆者手上的程式碼不是原生系統的原始碼,不能把多一些的原始碼貼上,其中可能與原生程式碼有些出入,但大同小異,大都數地方還是相同的。