2

inputType="textPassword"我在我的活动的 XML 中放置了一个 EditText

<EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Enter Password"
        android:inputType="textPassword"
        android:padding="16dp"
        android:id="@+id/passwordInput"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

到现在为止没有任何问题,我看到了真实密码字符的圆圈:

在此处输入图像描述

有趣的部分就在这里。现在,如果我setSingleLine()在 Activity 中调用 EditText:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        passwordInput.setSingleLine()
    }
}

会看到密码字符惊人地可见!

在此处输入图像描述

android:singleLine="true"另一个有趣的事情是,如果我将EditText 的 XML放入,这个问题就不会发生。

注意:我知道setSingleLine在密码字段上设置是没有用的,但我很好奇为什么调用这个函数会有这样的副作用。

4

3 回答 3

1

我认为这是因为当您调用时setSingleLine, textview 会将其转换方法从 更改PasswordTransformationMethodSingleLineTransformationMethod。当时只接受一种转换方法EditText(它是 的子级TextView

你可以在这里查看源代码: setSingleLine() https ://android.googlesource.com/platform/frameworks/base/+/jb-mr0-release/core/java/android/widget/TextView.java#6727

跟进代码填充调用函数setTransformationMethod

https://android.googlesource.com/platform/frameworks/base/+/jb-mr0-release/core/java/android/widget/TextView.java#1461

于 2019-12-13T02:27:35.180 回答
0
  • 如果您想隐藏密码,您将:

    yourTextView.setTransformationMethod(new PasswordTransformationMethod());

  • 如果您想显示密码,您将:

    yourTextView.setTransformationMethod(new DoNothingTransformation()),或 setTransformationMethod(null)

  • 方法 setTransformationMethod 是显示/隐藏文本 在此处输入图像描述

  • 现在,您可以查看 TextView 类的代码,因为 EditText 是从 TextView 扩展而来的。你会在函数setSingleLine()中看到,它调用了函数applySingleLine(singleLine, true, true),这个函数会再次设置setTransformationMethod(SingleLineTransformationMethod.getInstance()); 这是更改您的转换(显示/隐藏 EditText 的文本):

    private void applySingleLine(boolean singleLine, boolean applyTransformation,
        boolean changeMaxLines) {
    mSingleLine = singleLine;
    if (singleLine) {
        setLines(1);
        setHorizontallyScrolling(true);
        // change Transformation
        if (applyTransformation) {
            setTransformationMethod(SingleLineTransformationMethod.getInstance());
        }
    } else {
        if (changeMaxLines) {
            setMaxLines(Integer.MAX_VALUE);
        }
        setHorizontallyScrolling(false);
        if (applyTransformation) {
            setTransformationMethod(null);
        }
    }
    

    }

于 2019-12-12T09:26:38.540 回答
0

尝试在 XML 中设置它:

android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true"

我无法告诉您为什么以编程方式设置它会导致这种奇怪的行为,因为我通常在内部XML执行此操作,而我在代码中执行此操作只是为了操作Views.

于 2019-12-12T09:11:17.987 回答