แบบอักษรคำใบ้รหัสผ่านใน Android


255

เมื่อ EditText อยู่ในโหมดรหัสผ่านดูเหมือนว่าคำใบ้จะแสดงเป็นแบบอักษรอื่น (courrier?) ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร ฉันต้องการคำใบ้ให้ปรากฏในแบบอักษรเดียวกันว่าเมื่อ EditText ไม่ได้อยู่ในโหมดรหัสผ่าน

XML ปัจจุบันของฉัน:

<EditText 
android:hint="@string/edt_password_hint"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:password="true"
android:singleLine="true" />

1
โปรดทราบว่าอุปกรณ์บางอย่างอาจไม่ทำงานในลักษณะนี้ "HTC One X @ 4.1.1" ทำ (monospace) "Samsung GT-7510 @ 4.0.4" ไม่ได้ (แบบอักษรเดียวกัน)
Loda

1
พฤติกรรมเดียวกันบน LeWa OS 4.2.2 API ไม่สอดคล้องกันเกินไป ..
ruX

ยังคงมีอยู่ในอมยิ้มด้วย
Mightian

คุณสามารถตรวจสอบคำตอบของฉันที่นี่หวังว่ามันจะทำงาน
Dmila Ram

คำตอบ:


394

การเปลี่ยนแบบอักษรใน xml ไม่ทำงานกับข้อความคำใบ้สำหรับฉันเช่นกัน ฉันพบวิธีแก้ไขปัญหาที่ต่างกันสองวิธีวิธีที่สองนั้นมีพฤติกรรมที่ดีกว่าสำหรับฉัน:

1) ลบออกandroid:inputType="textPassword"จากไฟล์ xml ของคุณและตั้งค่าเป็น java:

EditText password = (EditText) findViewById(R.id.password_text);
password.setTransformationMethod(new PasswordTransformationMethod());

ด้วยวิธีการนี้แบบอักษรคำใบ้ดูดี แต่เมื่อคุณพิมพ์ในฟิลด์แก้ไขนั้นคุณจะไม่เห็นอักขระแต่ละตัวเป็นข้อความธรรมดาก่อนที่มันจะกลายเป็นจุดรหัสผ่าน นอกจากนี้เมื่อทำการป้อนข้อมูลแบบเต็มหน้าจอจุดจะไม่ปรากฏ แต่รหัสผ่านเป็นข้อความที่ชัดเจน

2) ทิ้งandroid:inputType="textPassword"ไว้ใน xml ของคุณ ใน Java ยังตั้งค่าแบบอักษรและรหัสผ่านวิธี:

EditText password = (EditText) findViewById(R.id.register_password_text);
password.setTypeface(Typeface.DEFAULT);
password.setTransformationMethod(new PasswordTransformationMethod());

วิธีการนี้ให้แบบอักษรคำใบ้ที่ฉันต้องการและให้พฤติกรรมที่ฉันต้องการด้วยจุดรหัสผ่าน

หวังว่าจะช่วย!


3
เยี่ยมมากนี่เป็นพฤติกรรมแปลก ๆ คุณจะไม่คาดหวังจากการผิดนัด!
Sander Versluys

15
คือpassword.setTransformationMethod(new PasswordTransformationMethod());จำเป็น? ดูเหมือนว่าจะทำงานได้ดีสำหรับฉันโดยไม่ต้อง
loeschg

1
ฉันไม่จำเป็นต้องใช้setTransformationMethod()ทั้ง อย่างไรก็ตามมีผลข้างเคียงบางส่วนของวิธีการนี้ที่ทำให้ไม่พึงประสงค์เพราะส่งผลให้เกิดพฤติกรรมที่ไม่ได้มาตรฐานเมื่อเทียบกับtextPasswordพฤติกรรมเริ่มต้น สำหรับวิธีแก้ปัญหาที่สมบูรณ์ยิ่งขึ้นให้ดูที่คลาสผู้ช่วยที่: stackoverflow.com/a/17582092/231078
Joe

10
ยังดีกว่าลองดูวิธีแก้ปัญหาที่ยอดเยี่ยมในคำตอบในหน้านี้: stackoverflow.com/a/18073897
Marcin Koziński

16
โปรดทราบว่าการใช้โซลูชันแรกเป็นความคิดที่ไม่ดีผู้ใช้ที่เปิดใช้งานการแนะนำอัตโนมัติจะเริ่มเห็นรหัสผ่านในแอปอื่นแนะนำให้พวกเขาเพราะ EditText ไม่ได้ประกาศเป็นinputType="textPassword"
Elad Nava

193

ฉันพบเคล็ดลับที่มีประโยชน์นี้จากคู่มือการสนทนา

เคล็ดลับ: โดยค่าเริ่มต้นเมื่อคุณตั้งค่าองค์ประกอบ EditText ให้ใช้ประเภทอินพุต "textPassword" ตระกูลแบบอักษรจะถูกตั้งค่าเป็น monospace ดังนั้นคุณควรเปลี่ยนตระกูลแบบอักษรเป็น "sans-serif" เพื่อให้ฟิลด์ข้อความทั้งสองใช้แบบอักษรที่ตรงกัน สไตล์


ตัวอย่างเช่น

android:fontFamily="sans-serif"

21
นี่ควรเป็นคำตอบที่ยอมรับได้ ง่ายกว่าและมาจากเอกสาร
Marcin Koziński

29
เป็นเรื่องที่ดียกเว้นว่าจะใช้งานได้กับ API ระดับ 16 ขึ้นไปเท่านั้น
Ben Clayton

6
โปรดทราบว่าแม้ว่าจะใช้งานได้กับ API ระดับ 16 ขึ้นไป แต่แอตทริบิวต์ xml จะไม่ทำให้เกิดปัญหากับอุปกรณ์รุ่นเก่า แต่จะถูกละเว้น
Adam Johns

จะไม่ทำงานหากคุณคลิกแสดง / ซ่อนรหัสผ่านหลายครั้ง
Ali Habbash

32

นี่คือสิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้ ด้วยเหตุผลบางอย่างฉันไม่ต้องตั้งค่าวิธีการแปลงดังนั้นนี่อาจเป็นทางออกที่ดีกว่า:

ใน xml ของฉัน:

<EditText
    android:id="@+id/password_edit_field"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="Password"
    android:inputType="textPassword" />

ในของฉันActivity:

EditText password = (EditText) findViewById( R.id.password_edit_field );
password.setTypeface( Typeface.DEFAULT );

ฉันเพิ่งลองใช้ textPassword ใน XML และในขณะที่คุณทำในไฟล์. java และมันใช้ได้ดี สำหรับฉันดูเหมือนจะไม่ต้องการการเปลี่ยนแปลงเลย
Joe Plante

2
คำเตือน: โทร setTypeface () หลังจากที่คุณเปลี่ยน InputType ตามรหัส setTransformation วิธีการไม่จำเป็นถ้า InputType รวม xx_VARIATION_PASSWORD;
Loda

21

วิธี setTransformationMethod แบ่ง Android: imeOption สำหรับฉันและอนุญาตให้พิมพ์คืนค่าขนส่งลงในฟิลด์รหัสผ่าน ฉันกำลังทำสิ่งนี้แทน:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);

และฉันไม่ได้ตั้งค่า android: รหัสผ่าน = "true" ใน XML


อืมสิ่งนี้ใช้ได้กับฉันใน 6.0.1 เช่นกันคำตอบที่เลือกไม่ได้
Nactus

5

คำตอบ manisha ที่ให้ไว้ใช้งานได้ แต่จะปล่อยให้ฟิลด์รหัสผ่านอยู่ในสถานะไม่เป็นมาตรฐานเมื่อเทียบกับค่าเริ่มต้น นั่นคือฟอนต์เริ่มต้นจะใช้กับฟิลด์รหัสผ่านรวมถึงการแทนที่จุดและตัวอักษรตัวอย่างที่ปรากฏขึ้นก่อนที่จะถูกแทนที่ด้วยจุด (เช่นเดียวกับเมื่อเป็นฟิลด์ "รหัสผ่านที่มองเห็นได้")

ในการแก้ไขปัญหานี้และทำให้เป็น 1) ดูและดำเนินการเหมือนกับtextPasswordชนิดอินพุตเริ่มต้นแต่ยัง 2) อนุญาตให้ข้อความคำใบ้ปรากฏในแบบอักษรเริ่มต้น (ไม่ใช่แบบอวกาศ) คุณต้องมีTextWatcherฟิลด์ที่สามารถสลับ แบบอักษรไปมาระหว่างTypeface.DEFAULTและTypeface.MONOSPACEขึ้นอยู่กับว่าว่างเปล่าหรือไม่ ฉันสร้างคลาสผู้ช่วยเหลือที่สามารถใช้เพื่อให้บรรลุสิ่งนั้น:

import android.graphics.Typeface;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;

/**
 * This class watches the text input in a password field in order to toggle the field's font so that the hint text
 * appears in a normal font and the password appears as monospace.
 *
 * <p />
 * Works around an issue with the Hint typeface.
 *
 * @author jhansche
 * @see <a
 * href="http://stackoverflow.com/questions/3406534/password-hint-font-in-android">http://stackoverflow.com/questions/3406534/password-hint-font-in-android</a>
 */
public class PasswordFontfaceWatcher implements TextWatcher {
    private static final int TEXT_VARIATION_PASSWORD =
            (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
    private TextView mView;

    /**
     * Register a new watcher for this {@code TextView} to alter the fontface based on the field's contents.
     *
     * <p />
     * This is only necessary for a textPassword field that has a non-empty hint text. A view not meeting these
     * conditions will incur no side effects.
     *
     * @param view
     */
    public static void register(TextView view) {
        final CharSequence hint = view.getHint();
        final int inputType = view.getInputType();
        final boolean isPassword = ((inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION))
                == TEXT_VARIATION_PASSWORD);

        if (isPassword && hint != null && !"".equals(hint)) {
            PasswordFontfaceWatcher obj = new PasswordFontfaceWatcher(view);
            view.addTextChangedListener(obj);

            if (view.length() > 0) {
                obj.setMonospaceFont();
            } else {
                obj.setDefaultFont();
            }
        }
    }

    public PasswordFontfaceWatcher(TextView view) {
        mView = view;
    }

    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
        // Not needed
    }

    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
        if (s.length() == 0 && after > 0) {
            // Input field went from empty to non-empty
            setMonospaceFont();
        }
    }

    public void afterTextChanged(final Editable s) {
        if (s.length() == 0) {
            // Input field went from non-empty to empty
            setDefaultFont();
        }
    }

    public void setDefaultFont() {
        mView.setTypeface(Typeface.DEFAULT);
    }

    public void setMonospaceFont() {
        mView.setTypeface(Typeface.MONOSPACE);
    }
}

จากนั้นเพื่อใช้ประโยชน์จากสิ่งที่คุณต้องทำคือเรียกใช้register(View)เมธอดสแตติก ทุกอย่างอื่นเป็นไปโดยอัตโนมัติ (รวมถึงการข้ามวิธีแก้ปัญหาหากมุมมองไม่ต้องการ!):

    final EditText txtPassword = (EditText) view.findViewById(R.id.txt_password);
    PasswordFontfaceWatcher.register(txtPassword);

1
ทำได้ดีมาก การเปลี่ยนแปลงเพียงเล็กน้อย: หากคุณตั้งค่าฟอนต์บนEditText(เช่นการสร้างข้อความคำใบ้ Roboto Light) การตั้งค่าในTypeface.DEFAULTภายหลังจะแทนที่สิ่งนี้ ฉันเรียกfield.getTypeface()ด้านหน้าและใช้แบบอักษรนั้นทุกครั้งที่ฉันต้องการรีเซ็ตเป็นแบบอักษร "default" ในภายหลัง
Christopher Orr

field.getTypeface()ดูเหมือนว่าการโทรจะไม่น่าเชื่อถือ 100% (บ่อยครั้งที่คุณเพิ่งได้รับฟอนต์ monospace) แต่การสร้าง Typeface ผ่านTypeface.create()แล้วการตั้งค่าที่ดูเหมือนว่าจะทำงานได้ดี
Christopher Orr

5

มีหลายวิธีในการแก้ปัญหานี้ แต่แต่ละวิธีมีข้อดีข้อเสีย นี่คือการทดสอบของฉัน

ฉันประสบปัญหาแบบอักษรนี้ในอุปกรณ์บางตัวเท่านั้น (รายการท้ายคำตอบของฉัน) เมื่อเปิดใช้งานรหัสผ่านการป้อนข้อมูลด้วย

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

ถ้าฉันใช้android:inputType="textPassword"ปัญหานี้จะไม่เกิดขึ้น

บางสิ่งที่ฉันได้ลอง

1) ใช้setTransformationMethodแทนinputType

edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
  • แบบอักษรจะทำงานได้ดี
  • คีย์บอร์ดแสดงผลไม่ค่อยดี (มันแสดงเฉพาะข้อความไม่แสดงตัวเลขที่ด้านบนของข้อความ)

2) การใช้งาน Typeface.DEFAULT

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);
  • แป้นพิมพ์จอแสดงผลได้ดี ,
  • ตัวอักษรอาจทำงานไม่ดี ตัวอย่างsans-serif-lightเป็นแบบอักษรเริ่มต้นสำหรับทั้งหมดViewในแอปพลิเคชันของฉัน => หลังจากsetTypeface(Typeface.DEFAULT)นั้นEditTextแบบอักษรยังคงดูแตกต่างในอุปกรณ์บางอย่าง

3) การใช้งาน android:fontFamily="sans-serif"

  • สำหรับอุปกรณ์บางอย่างก็จะผิดพลาดตรวจสอบคำตอบของฉันที่นี่https://stackoverflow.com/a/52421199/5381331 และตัวอักษรยังคงดูแตกต่าง

โซลูชันของฉัน

แคชแบบอักษรก่อนsetInputTypeจากนั้นนำมาใช้ซ้ำ

Typeface cache = edtPassword.getTypeface();
edtPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
edtPassword.setTypeface(cache);

การทดสอบ
อุปกรณ์บางตัวประสบปัญหาแบบอักษร

  • Xiaomi A2 (8.0.1)
  • Pixel XL (8.1.0)
  • Sony Xperia Z5 Au (SOV32) (6.0)
  • Arrow NX (F-04G) (6.0.1)
  • เคียวเซร่า (S2) (7.0)

อุปกรณ์บางตัวไม่ประสบปัญหาแบบอักษร

  • ซัมซุง S4 (SC-04E) (5.0.1)
  • Samsung Galaxy Node 5 (5.1.1)
  • ซัมซุง S7 ขอบ (SM-G935F) (7.0)

อุปกรณ์ (ชื่อและระบบปฏิบัติการ) คืออะไร?
CoolMind

1
@CoolMind ขอขอบคุณสำหรับคำแนะนำของคุณฉันได้อัปเดตปัญหาตัวอักษรของอุปกรณ์และอุปกรณ์ที่ไม่ต้องเผชิญกับปัญหาของตัวอักษรบนอุปกรณ์ปัจจุบันของฉัน
Phan Van Linh

ขอบคุณสำหรับการทดสอบครั้งใหญ่! ฉันมาที่เธอจากstackoverflow.com/a/52178340/2914140 ใน Samsung S4 ฉันใช้setTransformationMethodวิธีการ (ไม่มีปัญหา)
CoolMind

ตามที่ฉันพูดถึงในคำตอบของฉันsetTransformationMethodจะทำงาน แต่แป้นพิมพ์จะไม่แสดงผลได้ดี อย่างไรก็ตามถ้าคุณโอเคกับมันมันก็ยังคงโอเคเพราะมันเป็นปัญหาเล็ก ๆ น้อย ๆ
ฟาน Van Linh

4

คำตอบอื่น ๆ เป็นทางออกที่เหมาะสมสำหรับกรณีส่วนใหญ่

อย่างไรก็ตามหากคุณใช้EditTextคลาสย่อยที่กำหนดเองเพื่อพูดใช้ฟอนต์ที่กำหนดเองเป็นค่าเริ่มต้นจะมีปัญหาเล็กน้อย ถ้าคุณตั้งค่าตัวอักษรที่กำหนดเองในสร้างของ subclass inputType="textPassword"ของคุณก็จะยังคงถูกเขียนทับโดยระบบถ้าคุณตั้งค่า

ในกรณีนี้ย้ายสไตล์ของคุณไปonAttachedToWindowหลังจากการsuper.onAttachedToWindowโทรของคุณ

ตัวอย่างการนำไปใช้:

package net.petosky.android.ui;

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.EditText;

/**
 * An EditText that applies a custom font.
 *
 * @author cory@petosky.net
 */
public class EditTextWithCustomFont extends EditText {

    private static Typeface customTypeface;

    public EditTextWithCustomFont(Context context) {
        super(context);
    }

    public EditTextWithCustomFont(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextWithCustomFont(
            Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * Load and store the custom typeface for this app.
     *
     * You should have a font file in: project-root/assets/fonts/
     */
    private static Typeface getTypeface(Context context) {
        if (customTypeface == null) {
            customTypeface = Typeface.createFromAsset(
                    context.getAssets(), "fonts/my_font.ttf");
        }
        return customTypeface;
    }

    /**
     * Set a custom font for our EditText.
     *
     * We do this in onAttachedToWindow instead of the constructor to support
     * password input types. Internally in TextView, setting the password
     * input type overwrites the specified typeface with the system default
     * monospace.
     */
    @Override protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        // Our fonts aren't present in developer tools, like live UI
        // preview in AndroidStudio.
        if (!isInEditMode()) {
            setTypeface(getTypeface(getContext()));
        }
    }
}

3

ฉันรู้ว่านี้อาจจะเป็นคนเก่า แต่ฉันได้ humped เป็นสิ่งที่เกี่ยวข้องกับปัญหานี้เมื่อฉันใช้InputTypeและapp:passwordToggleEnabled="true"ร่วมกัน

ดังนั้นเขียนสิ่งนี้เพราะมันอาจช่วยบางคนที่นี่

ฉันต้องการใช้ฟอนต์ที่กำหนดเองเป็นรหัสผ่านพร้อมกับapp:passwordToggleEnabledตัวเลือกสำหรับช่องป้อนรหัสผ่านของฉัน แต่ในห้องสมุดสนับสนุน 27.1.1 (ขณะที่เขียนนี้) มันล้มเหลว

รหัสก็เหมือนด้านล่าง

<android.support.design.widget.TextInputLayout
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/_10dp"
        android:layout_marginTop="@dimen/_32dp"
        android:hint="@string/current_password"
        android:textColorHint="@color/hint_text_color"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:passwordToggleEnabled="true"
        app:passwordToggleTint="@color/black">


        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start|left"
            android:maxLines="1"
            android:textAlignment="viewStart"
            android:textColor="@color/black"
            android:textColorHint="@color/camel"
            android:textSize="@dimen/txt_16sp"
            app:font_style="regular"
            app:drawableEnd="@drawable/ic_remove_eye" />

    </android.support.design.widget.TextInputLayout>

โค้ดด้านบนไม่ได้inputTypeกำหนดไว้ใน XML

EditText password = (EditText) findViewById(R.id.password);
password.setTransformationMethod(new PasswordTransformationMethod());

และใน Java setTransformationMethodจะช่วยให้ฉันได้รับคุณสมบัติของtextPasswordประเภทอินพุตและฉันก็มีความสุขกับรูปแบบตัวอักษรที่กำหนดเองของฉัน

แต่ข้อผิดพลาดดังกล่าวเกิดขึ้นในทุกระดับ API พร้อม 27.1.1 ไลบรารีสนับสนุน

java.lang.NullPointerException: ความพยายามในการเรียกใช้เมธอดเสมือน 'void android.support.design.widget.CheckableImageButton.setChecked (บูลีน)' ในการอ้างอิงวัตถุ null

นี่คือความล้มเหลวเนื่องจากการ เรียนonRestoreInstanceStateภายในTextInputLayout

ทบทวนขั้นตอนการทำซ้ำ:สลับการเปิดเผยรหัสผ่านและย่อขนาดแอปและเปิดจากแอพล่าสุด เอ่อโฮล่ม!

สิ่งที่ฉันต้องการคือตัวเลือกสลับรหัสผ่านเริ่มต้น (ใช้ห้องสมุดสนับสนุน) และแบบอักษรที่กำหนดเองในช่องป้อนรหัสผ่าน

หลังจากนั้นสักครู่ให้หาวิธีทำดังนี้

<android.support.design.widget.TextInputLayout
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/_10dp"
        android:layout_marginTop="@dimen/_32dp"
        android:hint="@string/current_password"
        android:textColorHint="@color/hint_text_color"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:passwordToggleEnabled="true"
        app:passwordToggleTint="@color/black">


        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start|left"
            android:maxLines="1"
            android:textAlignment="viewStart"
            android:textColor="@color/black"
            android:textColorHint="@color/camel"
            android:textSize="@dimen/txt_16sp"
            app:font_style="regular"
            app:drawableEnd="@drawable/ic_remove_eye"
            android:inputType="textPassword" />

    </android.support.design.widget.TextInputLayout>

ใน XML เพิ่ม android:inputType="textPassword"

TextInputLayout inputPassword = findViewById(R.id.input_password);
EditText password = findViewById(R.id.password);
EditText userName = findViewById(R.id.user_name);
// Get the typeface of user name or other edit text
Typeface typeface = userName.getTypeface();
if (typeface != null)
   inputLayout.setTypeface(typeface); // set to password text input layout

ในโค้ด java ด้านบน

ฉันได้รับแบบอักษรที่กำหนดเองจากชื่อผู้ใช้EditTextและนำไปใช้กับTextInputLayoutฟิลด์รหัสผ่าน ตอนนี้คุณไม่จำเป็นต้องตั้งค่าตัวพิมพ์อย่างชัดเจนเป็นรหัสผ่านEditTextเนื่องจากจะได้รับTextInputLayoutคุณสมบัติ

นอกจากนี้ฉันลบ password.setTransformationMethod(new PasswordTransformationMethod());

ด้วยวิธีpasswordToggleEnabledนี้ใช้งานได้แบบอักษรที่กำหนดเองจะถูกนำไปใช้และลาก่อนถึงความผิดพลาด หวังว่าปัญหานี้จะได้รับการแก้ไขในรุ่นที่จะมีการสนับสนุน


2

คุณยังสามารถใช้วิดเจ็ตที่กำหนดเอง ง่ายมากและไม่เกะกะรหัสกิจกรรม / ชิ้นส่วนของคุณ

นี่คือรหัส:

public class PasswordEditText extends EditText {

  public PasswordEditText(Context context) {
    super(context);
    init();
  }

  public PasswordEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();

  }

  public PasswordEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
  }

  private void init() {
    setTypeface(Typeface.DEFAULT);
  }
}

และ XML ของคุณจะเป็นดังนี้:

<com.sample.PasswordEditText
  android:id="@+id/password_edit_field"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:hint="Password"
  android:inputType="textPassword"
  android:password="true" />

จากประสบการณ์ของฉันสิ่งนี้ไม่ทำงาน - TextViewดูเหมือนว่าภายในจะเขียนทับแบบอักษรที่กำหนดเองหลังจากการโทรคอนสตรัคเตอร์ ให้วิธีแก้ปัญหาในคำตอบอื่น
Cory Petosky

2

ใช้ห้องสมุดการประดิษฐ์ตัวอักษร

จากนั้นจะยังคงไม่อัปเดตฟิลด์รหัสผ่านด้วยแบบอักษรที่ถูกต้อง ทำเช่นนี้ในรหัสไม่ได้อยู่ใน xml:

Typeface typeface_temp = editText.getTypeface();
editText.setInputType(inputType); /*whatever inputType you want like "TYPE_TEXT_FLAG_NO_SUGGESTIONS"*/
//font is now messed up ..set it back with the below call
editText.setTypeface(typeface_temp); 

0

ฉันเพิ่งเพิ่มความสามารถในการเปลี่ยนสลับเปิด / ปิด monospace เป็นส่วนขยายของ EditTextโดยเฉพาะสำหรับรหัสผ่านมันอาจช่วยบางคน มันไม่ได้ใช้android:fontFamilyดังนั้นจึงเข้ากันได้ <16


0

คุณยังสามารถใช้

<android.support.design.widget.TextInputLayout/>

พร้อมกับ

<android.support.v7.widget.AppCompatEditText/>

0

ฉันใช้วิธีนี้เพื่อสลับแบบอักษรขึ้นอยู่กับการมองเห็นคำใบ้ มันคล้ายกับคำตอบของโจ แต่ขยาย EditText แทน:

public class PasswordEditText extends android.support.v7.widget.AppCompatEditText {

    public PasswordEditText(Context context) {
        super(context);
    }

    public PasswordEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        if (text.length() > 0) setTypeface(Typeface.MONOSPACE);
        else setTypeface(Typeface.DEFAULT);
    }

}

0

ในกรณีที่คุณกำลังใช้ห้องสมุดการประดิษฐ์ตัวอักษรร่วมกับ TextInputLayout และ EditText รหัสต่อไปนี้ทำงานได้ดี

    EditText password = (EditText) findViewById(R.id.password);
    TextInputLayout passwordLayout = (TextInputLayout) findViewById(R.id.passwordLayout);

    Typeface typeface_temp = password.getTypeface();
    password.setInputType(InputType.TYPE_CLASS_TEXT |
            InputType.TYPE_TEXT_VARIATION_PASSWORD); 

    password.setTypeface(typeface_temp);
    passwordLayout.setTypeface(typeface_temp);

สิ่งนี้ไม่ได้แก้ไขแบบอักษรคำใบ้ของฉัน
Rafael Ruiz Muñoz

0

อาจเป็นกรณีที่แปลก แต่ฉันได้ทดลองกับสิ่งนี้และพบว่า:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setTransformationMethod(new PasswordTransformationMethod());

เปลี่ยนขนาดของแบบอักษรของคำใบ้แทนแบบอักษรเอง! นี่คือผลกระทบที่ไม่พึงประสงค์ แปลกพอการดำเนินการย้อนกลับ:

password.setTransformationMethod(new PasswordTransformationMethod());
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

คงขนาดตัวอักษรเดียวกัน


0

ฉันพบวิธีแก้ไขปัญหานี้อย่างแน่นอน

วิธีที่ดีที่สุดสำหรับสวัสดีฉันพบวิธีแก้ไขปัญหานี้อย่างแน่นอน

วิธีที่ดีที่สุดคือการสร้าง editText แบบกำหนดเองและบันทึกค่าของแบบอักษรเป็น temp จากนั้นใช้วิธีการเปลี่ยนแปลง InputType ในที่สุดเราตั้งค่าใบหน้าประเภท temp กลับมาที่ editText ชอบมาก:

public class AppCompatPasswordEditText extends AppCompatEditText {


    public AppCompatPasswordEditText(Context context) {
        super(context);
    }

    public AppCompatPasswordEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AppCompatPasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        // Our fonts aren't present in developer tools, like live UI
        // preview in AndroidStudio.
        Typeface cache = getTypeface();

        if (!isInEditMode() && cache != null) {
            setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            setTypeface(cache);
        }
    }

}

-1

วิธีนี้จะทำให้รหัสผ่านสำหรับการป้อนข้อมูลที่มีคำใบ้ที่ไม่ได้แปลงเป็น * และแบบอักษรเริ่มต้น !!

ใน XML:

android:inputType="textPassword"
android:gravity="center"
android:ellipsize="start"
android:hint="Input Password !."

ในกิจกรรม:

inputPassword.setTypeface(Typeface.DEFAULT);

ขอบคุณ: มะม่วงและ rjrjr สำหรับความเข้าใจด้าน: D


-2

เช่นด้านบน แต่ให้แน่ใจว่าเขตข้อมูลไม่มีลักษณะตัวหนาใน xml เนื่องจากจะไม่มีลักษณะเหมือนกันแม้จะมีการแก้ไขด้านบน!


2
อย่าพูดว่า "เหนือ" ... สิ่งต่าง ๆ เปลี่ยนแปลงไปตามกาลเวลา :-)
ZaBlanc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.