原生android的settings模块的样子(我的Settings截图有些改动)
接下来讨论如何在settings中添加一个类似于wlan/ethernet的模块
- 布局文件位置(默认位置在packages/apps/Settings/res/xml/dashboard_categories.xml)
<dashboard-categories
19 xmlns:android="http://schemas.android.com/apk/res/android">
20
21 <!-- WIRELESS and NETWORKS -->
22 <dashboard-category
23 android:id="@+id/wireless_section"
24 android:title="@string/header_category_wireless_networks" >
25
26 <!-- Wifi -->
27 <dashboard-tile
28 android:id="@+id/wifi_settings"
29 android:title="@string/wifi_settings_title"
30 android:fragment="com.android.settings.wifi.WifiSettings"
31 android:icon="@drawable/ic_settings_wireless"
32 />
33
34 <!-- Bluetooth -->
35 <dashboard-tile
36 android:id="@+id/bluetooth_settings"
37 android:title="@string/bluetooth_settings_title"
38 android:fragment="com.android.settings.bluetooth.BluetoothSettings"
39 android:icon="@drawable/ic_settings_bluetooth2"
40 />
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
settings布局有一套自己的行为方式,使用dashboard-tile,其中默认点击跳转依赖于其中的android:fragmentandroid:fragment="com.android.settings.bluetooth.BluetoothSettings"
当然除了fragment还有另一种实现,类似与启动activity
<!-- Operator hook -->
81 <dashboard-tile
82 android:id="@+id/operator_settings"
83 android:fragment="com.android.settings.WirelessSettings" >
84 <intent android:action="com.android.settings.OPERATOR_APPLICATION_SETTING" />
85 </dashboard-tile>
- 1
- 2
- 3
- 4
- 5
- 6
- 以上实现了布局的第一步,此时可以看到你添加的模块了,接下来配置整体,使整个流程跑通,接下来注意有两个java文件(packages/apps/Settings/src/com/android/settings)SettingsActivity.java/Settings.java
Settings.java
public static class EthernetSettingsActivity extends SettingsActivity { /* empty */ }
- 1
配置你要用的Activity文件;
SettingsActivity.java
private static final String[] ENTRY_FRAGMENTS = {
298 WirelessSettings.class.getName(),
299 WifiSettings.class.getName(),
300 AdvancedWifiSettings.class.getName(),
301 SavedAccessPointsWifiSettings.class.getName(),
302 BluetoothSettings.class.getName(),
303 /**
304 * Date: 29 June 2016
305 * Expand settings with Ethernet settings.
306 */
307 EthernetSettings.class.getName(),
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
private int[] SETTINGS_FOR_RESTRICTED = {
226 R.id.wireless_section,
227 R.id.wifi_settings,
228 R.id.bluetooth_settings,
229 /**
230 * Date: 29 June 2016
231 * Expand settings with Ethernet settings.
232 */
233 R.id.ethernet_settings,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
以上分别为绑定fragment和id,完善此处,理论上可以invoke起你定义的fragment了
- 接下来就是自定义你的frament,Settings中的第二层(fragment层)布局一般也是存在于res/xml中,它使用Preference布局,应用开发很少用到,到Settings里面很多,为了可以保存相应的信息
17 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
18 android:title="@string/security_settings_title">
19
20 <PreferenceCategory
21 android:key="security_category"
22 android:title="@string/lock_settings_title">
23
24 <PreferenceScreen
25 android:key="unlock_set_or_change"
26 android:title="@string/unlock_set_unlock_launch_picker_title"
27 android:summary="@string/unlock_set_unlock_mode_none"
28 android:persistent="false"/>
29
30 <PreferenceScreen
31 android:key="owner_info_settings"
32 android:fragment="com.android.settings.OwnerInfoSettings"
33 android:title="@string/owner_info_settings_title"
34 android:summary="@string/owner_info_settings_summary"/>
35
36 </PreferenceCategory>
37
38 </PreferenceScreen>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
类似于这种,至于这中控件的使用方式,你可以google/baidu一下,基本语法很简单,通过此种方式,你就可以建立出自己想要的Settings模块
- ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append( numbering); for (i = 1; i