实现目标:在设置里面新增一个选项无标题,在里面实现点击事件,swtch事件,单选事件,多选事件
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/res/drawable下创建图标 ,创建一个名为ic_help.xml文件,里面代码如下
<!--
Copyright (C) 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:pathData="M2,12C2,6.48 6.48,2 12,2C17.52,2 22,6.48 22,12C22,17.52 17.52,22 12,22C6.48,22 2,17.52 2,12ZM13,16V18H11V16H13ZM12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20ZM8,10C8,7.79 9.79,6 12,6C14.21,6 16,7.79 16,10C16,11.283 15.21,11.973 14.441,12.646C13.711,13.283 13,13.905 13,15H11C11,13.179 11.942,12.457 12.77,11.822C13.42,11.324 14,10.879 14,10C14,8.9 13.1,8 12,8C10.9,8 10,8.9 10,10H8Z"
android:fillType="evenOdd"
android:fillColor="?android:attr/colorPrimary"/>
</vector>
3、在packages/apps/Settings/src/com/android/settings下创建一个名为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);
}
4、在packages/apps/Settings/res/xml下创建给MySettingsCeshi.java类用的布局文件,命名为my_settings_ceshi.xml
<?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"/>
</PreferenceScreen>
5、在packages/apps/Settings/src/com/android/settings/myceshi下创建PrivateDialogPreference.java类给功能其三(单选布局)使用
package com.android.settings.myceshi;
import android.app.settings.SettingsEnums;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivitySettingsManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.utils.AnnotationSpan;
import com.android.settingslib.CustomDialogPreferenceCompat;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.google.common.net.InternetDomainName;
import java.util.HashMap;
import java.util.Map;
import android.widget.Toast;
public class PrivateDialogPreference extends CustomDialogPreferenceCompat implements RadioGroup.OnCheckedChangeListener,View.OnClickListener{
private EditText mEditText;
private RadioGroup mRadioGroup;
private Button Button1,Button2;
public PrivateDialogPreference(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化设置
}
@Override
protected void onBindDialogView(View view) {
mEditText = view.findViewById(R.id.private_dns_mode_provider_hostname);
mRadioGroup = view.findViewById(R.id.private_dns_radio_group);
mRadioGroup.setOnCheckedChangeListener(this);
final RadioButton offRadioButton = view.findViewById(R.id.private_dns_mode_off);
offRadioButton.setText("单选按钮一");
final RadioButton opportunisticRadioButton = view.findViewById(R.id.private_dns_mode_opportunistic);
opportunisticRadioButton.setText("单选按钮二");
final RadioButton providerRadioButton = view.findViewById(R.id.private_dns_mode_provider);
providerRadioButton.setText("单选按钮三");
final TextView helpTextView = view.findViewById(R.id.private_dns_help_info);
helpTextView.setMovementMethod(LinkMovementMethod.getInstance());
Button1 = view.findViewById(R.id.button1);
Button1.setOnClickListener(this);
Button2 = view.findViewById(R.id.button2);
Button2.setOnClickListener(this);
}
public void onClick(View v) {
int viewId = v.getId();
if (viewId == R.id.button1) {
Toast.makeText(getContext(), "点击了取消", Toast.LENGTH_SHORT).show();
// getContext().dismiss();
} else if (viewId == R.id.button2) {
Toast.makeText(getContext(), mEditText.getText().toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.private_dns_mode_off) {
Toast.makeText(getContext(), "选择了单选按钮一", Toast.LENGTH_SHORT).show();
} else if (checkedId == R.id.private_dns_mode_opportunistic) {
Toast.makeText(getContext(), "选择了单选按钮二", Toast.LENGTH_SHORT).show();
} else if (checkedId == R.id.private_dns_mode_provider) {
Toast.makeText(getContext(), "选择了单选按钮三", Toast.LENGTH_SHORT).show();
}else if (checkedId == R.id.button1) {
Toast.makeText(getContext(), "点击了取消", Toast.LENGTH_SHORT).show();
// mMode = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
}else if (checkedId == R.id.button2) {
Toast.makeText(getContext(), "点击了确认", Toast.LENGTH_SHORT).show();
// if(mEditText.getText().toString() == ""){
// Toast.makeText(getContext(), "无内容", Toast.LENGTH_SHORT).show();
// }else{
// Toast.makeText(getContext(),mEditText.getText().toString(), Toast.LENGTH_SHORT).show();
// }
}
}
}
5、在packages/apps/Settings/res/layout下创建布局文件my_dialog.xml文件给到PrivateDialogPreference.java(功能其三)
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<RadioGroup
android:id="@+id/private_dns_radio_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/developer_option_dialog_margin_start">
<include
android:id="@+id/private_dns_mode_off"
layout="@layout/preference_widget_dialog_radiobutton"/>
<include
android:id="@+id/private_dns_mode_opportunistic"
layout="@layout/preference_widget_dialog_radiobutton"/>
<include
android:id="@+id/private_dns_mode_provider"
layout="@layout/preference_widget_dialog_radiobutton"/>
<EditText
android:id="@+id/private_dns_mode_provider_hostname"
android:hint="随便输入什么内容,仅测试使用"
style="@android:style/Widget.CompoundButton.RadioButton"
android:imeOptions="actionDone"
android:inputType="textFilter|textUri"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:layout_marginEnd="8dp"
android:minHeight="@dimen/developer_option_dialog_min_height"/>
</RadioGroup>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认"/>
</LinearLayout>
<include
android:id="@+id/private_dns_help_info"
layout="@layout/preference_widget_dialog_summary"/>
</LinearLayout>
</ScrollView>
6、在packages/apps/Settings/src/com/android/settings/myceshi下创建PrivateDialogPreference2.java类给功能其四(多选布局)使用
package com.android.settings.myceshi;
import android.app.settings.SettingsEnums;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivitySettingsManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import android.text.Editable;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.utils.AnnotationSpan;
import com.android.settingslib.CustomDialogPreferenceCompat;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.google.common.net.InternetDomainName;
import java.util.HashMap;
import java.util.Map;
import android.widget.Toast;
import android.widget.CompoundButton;
public class PrivateDialogPreference2 extends CustomDialogPreferenceCompat implements CheckBox.OnCheckedChangeListener,View.OnClickListener{
private EditText mEditText;
private CheckBox offCheckBox,opportunisticCheckBox,providerCheckBox;
private Button Button1,Button2;
public PrivateDialogPreference2(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化设置
}
@Override
protected void onBindDialogView(View view) {
mEditText = view.findViewById(R.id.private_mode_provider_hostname);
offCheckBox = view.findViewById(R.id.private_mode_off);
offCheckBox.setOnCheckedChangeListener(this);
offCheckBox.setText("复选按钮一");
opportunisticCheckBox = view.findViewById(R.id.private_mode_opportunistic);
opportunisticCheckBox.setOnCheckedChangeListener(this);
opportunisticCheckBox.setText("复选按钮二");
providerCheckBox = view.findViewById(R.id.private_mode_provider);
providerCheckBox.setOnCheckedChangeListener(this);
providerCheckBox.setText("复选按钮三");
Button1 = view.findViewById(R.id.button1_check);
Button1.setOnClickListener(this);
Button2 = view.findViewById(R.id.button2_check);
Button2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int viewId = v.getId();
if (viewId == R.id.button1_check) {
Toast.makeText(getContext(), "点击了取消", Toast.LENGTH_SHORT).show();
// getContext().dismiss();
} else if (viewId == R.id.button2_check) {
Toast.makeText(getContext(), mEditText.getText().toString(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCheckedChanged(CompoundButton checkedId, boolean isChecked){
if (checkedId.getId() == R.id.private_mode_off) {
if(isChecked){
Toast.makeText(getContext(), "选择了复选框一", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(), "取消选择了复选框一", Toast.LENGTH_SHORT).show();
}
}
if (checkedId.getId() == R.id.private_mode_opportunistic) {
if(isChecked){
Toast.makeText(getContext(), "选择了复选框二", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(), "取消选择了复选框二", Toast.LENGTH_SHORT).show();
}
}
if (checkedId.getId() == R.id.private_mode_provider) {
if(isChecked){
Toast.makeText(getContext(), "选择了复选框三", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(), "取消选择了复选框三", Toast.LENGTH_SHORT).show();
}
}
}
}
7、 在packages/apps/Settings/res/layout下创建布局文件my_dialog2.xml文件给到PrivateDialogPreference2.java(功能其四)
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<LinearLayout
android:id="@+id/private_dns_radio_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/developer_option_dialog_margin_start">
<CheckBox
android:id="@+id/private_mode_off"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/developer_option_dialog_min_height"/>
<CheckBox
android:id="@+id/private_mode_opportunistic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/developer_option_dialog_min_height"/>
<CheckBox
android:id="@+id/private_mode_provider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/developer_option_dialog_min_height"/>
</LinearLayout>
<EditText
android:id="@+id/private_mode_provider_hostname"
android:hint="随便输入什么内容,仅测试使用"
style="@android:style/Widget.CompoundButton.RadioButton"
android:imeOptions="actionDone"
android:inputType="textFilter|textUri"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="3dp"
android:layout_marginEnd="8dp"
android:minHeight="@dimen/developer_option_dialog_min_height"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp">
<Button
android:id="@+id/button1_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"/>
<Button
android:id="@+id/button2_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认"/>
</LinearLayout>
<include
android:id="@+id/private_dns_help_info"
layout="@layout/preference_widget_dialog_summary"/>
</LinearLayout>
</ScrollView>
在设置界面新增一个简单的选项完成