实现目标:给设置里面的按钮加入密码,只有输入密码才能才能跳转,列如给关于平板电脑按钮增加密码选择,点击关于平板电脑后需要输入密码才能看到里面的内容,我是自己在设置里面新增了一个选项 无标题。
1、在packages/apps/Settings/res/xml/top_level_settings.xml中新增如下:
<com.android.settings.widget.HomepagePreference
android:fragment="com.android.settings.myceshi.MySettingsCeshi"
android:icon="@drawable/ic_help"
android:key="top_level_my_setting"
android:order="40"
android:title="无标题"
android:summary="无标题"/>
2、在packages/apps/Settings/src/com/android/settings下新建一个文件夹名为myceshi,这个myceshi文件夹下创建一个MySettingsCeshi.java类
package com.android.settings.myceshi;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.os.Handler;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
import android.widget.Toast;
import android.app.Dialog;
@SearchIndexable
public class MySettingsCeshi extends DashboardFragment implements Preference.OnPreferenceClickListener,Preference.OnPreferenceChangeListener{
private static final String TAG = "mysettingsceshi";
private Toast mDevHitToast;
private SwitchPreference mShow;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mDevHitToast = null;
mShow = (SwitchPreference) findPreference("myFunction2");
mShow.setOnPreferenceChangeListener(this);
Preference mPreference = findPreference("myFunction1");
mPreference.setOnPreferenceClickListener(this);
}
@Override
public boolean onPreferenceClick(Preference preference) {
Log.e("onPreferenceClick","走了点击时间2");
Toast.makeText(getActivity(), "Preference Clicked", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean show = (boolean)newValue;
if(show==true){
Toast.makeText(getActivity(), "已打开", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getActivity(), "已关闭", Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.my_settings_ceshi;
}
@Override
public int getMetricsCategory() {
return 5;
}
/**
* For Search.
*/
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.my_settings_ceshi);
}
3、在packages/apps/Settings/res/xml下创建给MySettingsCeshi.java用的界面,代码如下
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="展示内容">
<Preference
android:key="myFunction1"
android:order="44"
android:title="功能其一"
android:summary="功能其一"/>
<SwitchPreference
android:key="myFunction2"
android:order="45"
android:title="功能其二"
android:summary="功能其二"/>
<com.android.settings.myceshi.PrivateDialogPreference
android:key="myFunction3"
android:order="46"
android:title="功能其三"
android:summary="功能其三"
android:dialogLayout="@layout/my_dialog"/>
<com.android.settings.myceshi.PrivateDialogPreference2
android:key="myFunction4"
android:order="47"
android:title="功能其四"
android:summary="功能其四"
android:dialogLayout="@layout/my_dialog2"/>
<com.android.settings.myceshi.PrivateDialogPreference3
android:key="myFunction5"
android:order="48"
android:title="网络黑名单"
android:summary="以太网络控制"
android:dialogLayout="@layout/my_dialog3"/>
<com.android.settings.myceshi.PrivateDialogPreference4
android:key="myFunction6"
android:order="49"
android:title="软件黑名单"
android:summary="软件安装控制"
android:dialogLayout="@layout/my_dialog4"/>
</PreferenceScreen>
4、在SettingsActivity.java中实现密码判断,现在密码是写死的,首先加入依赖
import android.app.AlertDialog;
import android.widget.EditText;
import android.content.DialogInterface;
import android.view.WindowManager;
import android.widget.Toast;
4-1、实现弹窗方法
private static AlertDialog.Builder builder;
private static AlertDialog alert;
//弹窗执行方法
public void tanchuang(String initialFragmentName, Intent intent){
// 创建弹窗
builder = new AlertDialog.Builder(this);
final EditText input = new EditText(this);
builder.setMessage("请输入密码")
.setTitle("危险")
.setView(input)
//设置点击外部是否关闭弹窗
.setCancelable(true)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 用户选择重启,不做任何操作,允许关闭继续
// mContext.sendBroadcast(rebootIntent);
String inputString = input.getText().toString();
if(inputString.equals("123456")){
setTitleFromIntent(intent);
Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
switchToFragment(initialFragmentName, initialArguments, true,mInitialTitleResId, mInitialTitle);
}else{
Toast.makeText(SettingsActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
mInitialTitleResId = R.string.dashboard_title;
switchToFragment(TopLevelSettings.class.getName(), null /* args */, false,
mInitialTitleResId, mInitialTitle);
}
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// 取消关闭,需要通过反射机制取消关闭
try {
// 反射方法参数为空,无返回值
// Method cancelMethod = intent.getClass().getDeclaredMethod("cancel");
// cancelMethod.setAccessible(true);
// cancelMethod.invoke(intent);
// istanchuang = false;
mInitialTitleResId = R.string.dashboard_title;
switchToFragment(TopLevelSettings.class.getName(), null /* args */, false,
mInitialTitleResId, mInitialTitle);
} catch (Exception e) {
e.printStackTrace();
}
}
});
alert = builder.create();
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alert.show();
}
4-2、最后需要在launchSettingFragment()方法内调用,其次还需要判断是否点击到我需要设置密码选项,代码如下:
if(initialFragmentName.equals("com.android.settings.myceshi.MySettingsCeshi")){
tanchuang(initialFragmentName,intent);
}else{
setTitleFromIntent(intent);
Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
switchToFragment(initialFragmentName, initialArguments, true,
mInitialTitleResId, mInitialTitle);
}
大致流程就是这样了