1. 程式人生 > >Android Settings新增選項

Android Settings新增選項

在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;
        }

過程基本上是如此,由於筆者手上的程式碼不是原生系統的原始碼,不能把多一些的原始碼貼上,其中可能與原生程式碼有些出入,但大同小異,大都數地方還是相同的。