android12 在设置里面新增一个选项 名为无标题

实现目标:在设置里面新增一个选项无标题,在里面实现点击事件,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>

在设置界面新增一个简单的选项完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值