Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用EditTextPreference作为屏蔽密码文本字段?_Android_Textview_Android Preferences - Fatal编程技术网

Android 如何使用EditTextPreference作为屏蔽密码文本字段?

Android 如何使用EditTextPreference作为屏蔽密码文本字段?,android,textview,android-preferences,Android,Textview,Android Preferences,我有一个非常简单的问题: 我有一个EditTextPreference对话框,我想用它来获取用户的密码,我希望它被屏蔽 我如何才能做到这一点?下面是一个使用xml的简短示例: <EditTextPreference android:key="@string/key" android:title="@string/title" android:summary="@string/summary" android:inputType="textPasswor

我有一个非常简单的问题:
我有一个
EditTextPreference
对话框,我想用它来获取用户的密码,我希望它被屏蔽


我如何才能做到这一点?

下面是一个使用xml的简短示例:

<EditTextPreference
    android:key="@string/key"
    android:title="@string/title"
    android:summary="@string/summary"   
    android:inputType="textPassword" />

或者您可以使用
numberPassword
而不是
textPassword

android:inputType=“numberPassword”
对我不起作用。Eclipse告诉我,这个属性不允许使用字符串值。 所以我用了以下方法:

<EditTextPreference
    android:key="@string/key"
    android:title="@string/title"
    android:summary="@string/summary"   
    android:inputType="number"
    android:password="true" />


这为我提供了一个EditTextPreference,带有点文本显示和数字键盘用于输入。

如果您希望在设备旋转后密码掩码也保持不变,则可以添加以下
imeOption

在编辑文本布局中

android:imeOptions=“flagNoExtractUi”

或以编程方式

yourEditText.setImeOptions(EditorInfo.IME\u标志\u否\u提取\u用户界面);

对于
androidx
库,您应该以编程方式执行此操作。例如,您可以按如下方式执行此操作,也可以选择根据密码长度使用星号设置摘要:

[...]
import android.os.Bundle;
import android.text.InputType;
import android.widget.EditText;

import androidx.annotation.NonNull;

import androidx.preference.EditTextPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;

import static androidx.preference.EditTextPreference.*;

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);

        final EditTextPreference preference = findPreference("password");

        if (preference != null) {
            preference.setSummaryProvider(new SummaryProvider() {
                @Override
                public CharSequence provideSummary(Preference preference) {

                    String getPassword = PreferenceManager.getDefaultSharedPreferences(getContext()).getString("password", "not set");

                    //we assume getPassword is not null
                    assert getPassword != null;

                    //return "not set" else return password with asterisks
                    if (getPassword.equals("not set")) {
                        return getPassword;
                    } else {
                        return (setAsterisks(getPassword.length()));
                    }
                }
            });

            //set input type as password and set summary with asterisks the new password
            preference.setOnBindEditTextListener(
                    new OnBindEditTextListener() {
                        @Override
                        public void onBindEditText(@NonNull final EditText editText) {
                            editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                            preference.setSummaryProvider(new SummaryProvider() {
                                @Override
                                public CharSequence provideSummary(Preference preference) {
                                    return setAsterisks(editText.getText().toString().length());
                                }
                            });
                        }
                    });
        }
    }

    //return the password in asterisks
    private String setAsterisks(int length) {
        StringBuilder sb = new StringBuilder();
        for (int s = 0; s < length; s++) {
            sb.append("*");
        }
        return sb.toString();
    }
}
[…]
导入android.os.Bundle;
导入android.text.InputType;
导入android.widget.EditText;
导入androidx.annotation.NonNull;
导入androidx.preference.EditTextPreference;
导入androidx.preference.preference;
导入androidx.preference.PreferenceFragmentCompat;
导入androidx.preference.PreferenceManager;
导入静态androidx.preference.EditTextPreference.*;
公共类MySettingsFragment扩展了PreferenceFragmentCompat{
@凌驾
public void onCreatePreferences(Bundle savedInstanceState,String rootKey){
setPreferencesFromResource(R.xml.preferences,rootKey);
最终编辑文本首选项=FindReference(“密码”);
if(首选项!=null){
preference.setSummaryProvider(新的SummaryProvider(){
@凌驾
公共字符序列提供摘要(首选项){
String getPassword=PreferenceManager.GetDefaultSharedReferences(getContext()).getString(“密码”,“未设置”);
//我们假设getPassword不为null
断言getPassword!=null;
//返回“未设置”,否则返回带星号的密码
if(getPassword.equals(“未设置”)){
返回getPassword;
}否则{
返回(setAsterisks(getPassword.length());
}
}
});
//将输入类型设置为密码,并将带有星号的摘要设置为新密码
preference.setOnBindEditTextListener(
新的OnBindEditTextListener(){
@凌驾
public void onBindEditText(@NonNull final EditText EditText){
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
preference.setSummaryProvider(新的SummaryProvider(){
@凌驾
公共字符序列提供摘要(首选项){
返回setAsterisks(editText.getText().toString().length());
}
});
}
});
}
}
//以星号返回密码
专用字符串设置星号(整数长度){
StringBuilder sb=新的StringBuilder();
对于(int s=0;s
在xml中,您应该有如下内容:

<EditTextPreference
    android:dialogMessage="Enter your password"
    android:dialogTitle="Password"
    android:key="password"
    android:title="Password" />


有关更多信息,请查看您可以使用下面的代码执行此操作。然而,我仍然没有弄明白如何做密码切换的事情。仅仅定义app:endIconMode=“password\u toggle”是行不通的,有人能帮上忙吗

答案是:“EditTextPreference”字段“db_pwd”定义如下:

android:inputType="textPassword"
最新Kotlin版本代码:

class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    setPreferencesFromResource(com.unified.helloworld.R.xml.my_preferences, rootKey)
    val pwdPref =
        findPreference<EditTextPreference>("db_pwd")
    if (pwdPref != null) {
        pwdPref.summaryProvider = SummaryProvider<Preference?> {
            val getPassword: String =
                PreferenceManager.getDefaultSharedPreferences(context)
                    .getString("db_pwd", "Not set")!!

            // Return "Not set" else return password with asterisks
            if (getPassword == "Not set") {
                getPassword } else { setAsterisks(getPassword.length) }
        }

        // Set type as password and set summary with asterisks
        pwdPref.setOnBindEditTextListener(
            OnBindEditTextListener { editText ->
                editText.inputType =
                    InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
                pwdPref.summaryProvider = SummaryProvider<Preference> { setAsterisks(editText.text.toString().length) }
            })
    }
}

// Return the password in asterisks
private fun setAsterisks(length: Int): String {
    val sb = java.lang.StringBuilder()
    for (s in 0 until length) {
        sb.append("*") }
    return sb.toString() }
}
类设置片段:PreferenceFragmentCompat(){
重写FunonCreatePreferences(savedInstanceState:Bundle?,rootKey:String?){
setPreferencesFromResource(com.unified.helloworld.R.xml.my_preferences,rootKey)
val pwdPref=
FindReference(“db_pwd”)
如果(pwdPref!=null){
pwdPref.summaryProvider=summaryProvider{
val getPassword:字符串=
PreferenceManager.GetDefaultSharedReferences(上下文)
.getString(“db_pwd”,“未设置”)!!
//返回“未设置”,否则返回带星号的密码
如果(getPassword==“未设置”){
getPassword}else{setAsterisks(getPassword.length)}
}
//将类型设置为密码,并用星号设置摘要
pwdPref.setOnBindEditTextListener(
OnBindEditTextListener{editText->
editText.inputType=
InputType.TYPE\u CLASS\u TEXT或InputType.TYPE\u TEXT\u变体\u密码
pwdPref.summaryProvider=summaryProvider{setAsterisks(editText.text.toString().length)}
})
}
}
//以星号返回密码
私人娱乐设置星号(长度:Int):字符串{
val sb=java.lang.StringBuilder()
用于(0中的s,直到长度){
sb.追加(“*”}
将某人返回到字符串()}
}

太棒了!我知道它应该是简单的,但我没想到它会这么简单…我需要一个类似的选项,但不是一个单一的编辑文本,我需要在我的对话框首选3编辑文本。一个用于旧密码、新密码和确认密码。你能给我一个怎样做的例子吗。android示例apidemo在对话框中只有一个编辑文本首选项。我不知道是谁在同一个对话框中把这个改成适合3的。你知道吗