当前位置:主页 > 查看内容

Android O添加Settings设置项的方法

发布时间:2021-08-10 00:00| 位朋友查看

简介:前言 我们在进行日常的开发中经常会涉及到对系统应用Settings的修改这里讲一下如何在设置主菜单界面添加一个自定义设置项。 Settings主界面 我们等下要在这个页面再添加一个自定义设置项。 代码修改步骤 在/src/com/android/settings/Settings.java添加入口A……

前言

我们在进行日常的开发中,经常会涉及到对系统应用Settings的修改,这里讲一下如何在设置主菜单界面添加一个自定义设置项。

Settings主界面

Settings主界面
我们等下要在这个页面再添加一个自定义设置项。

代码修改步骤

  1. 在/src/com/android/settings/Settings.java添加入口Activity:
// /src/com/android/settings/Settings.java
public class Settings extends SettingsActivity {
	// 这个便是我们要添加的设置项
    public static class MySettingsActivity extends SettingsActivity {}
    public static class AssistGestureSettingsActivity extends SettingsActivity { /* empty */}
    public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
    public static class SimSettingsActivity extends SettingsActivity { /* empty */ }
    ...
}
  1. 在/src/com/android/settings/SettingsActivity.java#doUpdateTilesList修改控制菜单项的显示
// /src/com/android/settings/SettingsActivity.java
// 两个地方调用:主菜单界面onResume 和 ACTION_BATTERY_CHANGED广播中EXTRA_PRESENT变化
private void doUpdateTilesList() {
        PackageManager pm = getPackageManager();
        final UserManager um = UserManager.get(this);
        final boolean isAdmin = um.isAdminUser();
        boolean somethingChanged = false;
        String packageName = getPackageName();

		// 这个true就是表示此菜单项显示与否
        somethingChanged = setTileEnabled(new ComponentName(packageName, MySettingsActivity.class.getName()), true, isAdmin)
            || somethingChanged;
            
        if (somethingChanged) {
        	// 用于更新整个设置列表
            updateCategories();
        }
}

// 这个是博主控制显示与否的条件
public boolean setTileEnabled(ComponentName component, boolean enabled) {
        PackageManager pm = getPackageManager();
        int state = pm.getComponentEnabledSetting(component);
        boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
        if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
            if (enabled) {
                sTileBlacklist.remove(component);
            } else {
                sTileBlacklist.add(component);
            }
            pm.setComponentEnabledSetting(component, enabled
                            ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                            : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);
            return true;
        }
        return false;
    }
  1. 写好MyFragment.java 继承 DashboardFragment ,指定xml,xml里android:fragment使用这个MyFragment。注意点:
  • 我们的逻辑都是在MyFragment里面处理的。根据前面的MySettingsActivity可以看到,它只是一个空壳子。
  • 如果MyFragment.java 不继承 DashboardFragment,可能会出现问题,由于时间久远,博主已经忘了怎么修改了,我们还是尽量继承DashboardFragment
  1. 在/src/com/android/settings/core/gateway/SettingsGateway.java修改
    ENTRY_FRAGMENTS和SETTINGS_FOR_RESTRICTED
    添加类名com.android.settings.mysettings.MyFragment.class.getName()和Settings.MySettingsActivity.class.getName()
/src/com/android/settings/core/gateway/SettingsGateway.java
public class SettingsGateway {
    public static final String[] ENTRY_FRAGMENTS = {
        	...
            HoneywellSettings.class.getName(),
            MyFragment.class.getName(),
    };

    public static final String[] SETTINGS_FOR_RESTRICTED = {
        	...
            MySettingsActivity.class.getName(),
    };
}

  1. 在AndroidManifest.xml指定Activity和Fragment的对应关系。现在我们的Activity和Fragment都已经准备好了,该把它们关联起来了。
<activity android:name=".Settings$MySettingsActivity">
			// 菜单项排序
            <intent-filter android:priority="2">
                <action android:name="com.android.settings.action.SETTINGS"/>
            </intent-filter>
            // 菜单项下面的说明字体
            <meta-data android:name="com.android.settings.summary"
            		   android:value="这是我的设置菜单"/>
            // 表示这是一个主界面activity
            <meta-data android:name="com.android.settings.category"
                android:value="com.android.settings.category.ia.homepage"/>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.mysettings.MyFragment"/>
</activity>
  1. 最后一步,在MyFragment里书写你的逻辑代码。这里博主给出自己的:
// /src/com/android/settings/mysettings/MyFragment.java
public class MyFragment extends DashboardFragment {

    @Override
    protected int getPreferenceScreenResId() {
        return R.xml.mysettings;
    }

    @Override
    protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
        return buildPreferenceControllers(context, getLifecycle());
    }

    private static List<AbstractPreferenceController> buildPreferenceControllers(
            Context context, Lifecycle lifecycle) {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        return controllers;
    }
	final SwitchPreference pref = (SwitchPreference)getPreferenceScreen().findPreference(key);
}

结语

以上就是在设置主界面里添加新菜单项的所有内容了,大家可以参照着写一下,因为这是基于Android O版本的Settings,在Android Q上可能有所修改。

;原文链接:https://blog.csdn.net/qq_40772749/article/details/115869115
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐