Phông chữ gợi ý mật khẩu trong Android


255

Khi một EditText ở chế độ mật khẩu, có vẻ như gợi ý được hiển thị bằng một phông chữ khác (Majrier?). Làm thế nào tôi có thể tránh điều này? Tôi muốn gợi ý xuất hiện trong cùng một phông chữ mà khi EditText không ở chế độ mật khẩu.

Xml hiện tại của tôi:

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

1
Lưu ý rằng không phải tất cả các thiết bị hoạt động theo cách này. "HTC One X @ 4.1.1" hiện (đơn cách). "Samsung GT-7510 @ 4.0.4" thì không. (cùng phông chữ)
Loda

1
Hành vi tương tự trên LeWa OS 4.2.2. API quá không nhất quán ..
ruX

vẫn còn tồn tại trong kẹo que
Mightian

bạn có thể kiểm tra câu trả lời của tôi ở đây hy vọng nó hoạt động.
Dmila Ram

Câu trả lời:


394

Thay đổi kiểu chữ trong xml cũng không hoạt động trên văn bản gợi ý cho tôi. Tôi tìm thấy hai giải pháp khác nhau, giải pháp thứ hai có hành vi tốt hơn đối với tôi:

1) Xóa android:inputType="textPassword"khỏi tệp xml của bạn và thay vào đó, đặt nó trong java:

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

Với cách tiếp cận này, phông chữ gợi ý có vẻ tốt nhưng khi bạn nhập vào trường chỉnh sửa đó, bạn không nhìn thấy từng ký tự trong văn bản đơn giản trước khi nó biến thành dấu chấm mật khẩu. Ngoài ra khi thực hiện nhập liệu ở chế độ toàn màn hình, các dấu chấm sẽ không xuất hiện, nhưng mật khẩu ở dạng văn bản rõ ràng.

2) Để lại android:inputType="textPassword"trong xml của bạn. Trong Java, CSONG đặt kiểu chữ và passwordMethod:

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

Cách tiếp cận này đã cho tôi phông chữ gợi ý tôi muốn VÀ cho tôi hành vi tôi muốn với dấu chấm mật khẩu.

Mong rằng sẽ giúp!


3
Tuyệt vời, đây là một số hành vi kỳ lạ, bạn sẽ không mong đợi từ mặc định!
Sander Versluys

15
password.setTransformationMethod(new PasswordTransformationMethod());cần thiết? Có vẻ làm việc tốt cho tôi mà không có.
loeschg

1
Tôi cũng không cần sử dụng setTransformationMethod(). Tuy nhiên, có một số tác dụng phụ của phương pháp này khiến nó không được mong muốn vì nó dẫn đến một hành vi không chuẩn so với textPasswordhành vi mặc định . Để có giải pháp hoàn chỉnh hơn, hãy xem lớp người trợ giúp tại: stackoverflow.com/a/17582092/2 31078
Joe

10
Tốt hơn nữa, hãy xem giải pháp đơn giản tuyệt vời này trong câu trả lời ngay trên trang này: stackoverflow.com/a/18073897
Marcin Koziński

16
Xin lưu ý rằng sử dụng giải pháp đầu tiên là một ý tưởng tồi - người dùng đã bật tính năng tự động đề xuất sẽ bắt đầu thấy mật khẩu của họ trong các ứng dụng khác, được đề xuất cho họ, vì EditText không được khai báo làinputType="textPassword"
Elad Nava

193

Tôi tìm thấy mẹo hữu ích này từ Hướng dẫn đối thoại

Mẹo: Theo mặc định, khi bạn đặt thành phần EditText để sử dụng loại đầu vào "textPassword", họ phông chữ được đặt thành đơn cách, do đó bạn nên thay đổi họ phông chữ thành "sans-serif" để cả hai trường văn bản đều sử dụng phông chữ phù hợp Phong cách.


Ví dụ

android:fontFamily="sans-serif"

21
Đây phải là câu trả lời được chấp nhận. Nó đơn giản hơn và đó là từ các tài liệu.
Marcin Koziński

29
Thật tốt, ngoại trừ việc nó chỉ hoạt động ở cấp độ 16 trở lên
Ben Clayton

6
Lưu ý rằng mặc dù nó chỉ hoạt động trên API cấp 16 trở lên, các thuộc tính xml không gây ra sự cố trên các thiết bị cũ hơn, chúng chỉ bị bỏ qua.
Adam Johns

Nó sẽ không hoạt động nếu bạn nhấp vào hiển thị / ẩn mật khẩu nhiều lần
Ali Habbash

32

Đây là những gì tôi đã làm để khắc phục vấn đề này. Vì một số lý do, tôi đã không phải thiết lập phương thức chuyển đổi để đây có thể là một giải pháp tốt hơn:

Trong xml của tôi:

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

Trong tôi Activity:

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

Tôi vừa thử nó với textPassword trong XML và như bạn đang làm trong tệp .java và nó hoạt động rất tốt. Đối với tôi, nó dường như không cần sự biến đổi
Joe Plante

2
Nhắc nhở: Gọi setTypeface () SAU KHI bạn thay đổi InputType theo mã. setTransaturesMethod không cần thiết nếu InputType bao gồm xx_VARIATION_PASSWORD;
Loda

21

Cách tiếp cận setTransaturesMethod phá vỡ android: imeOption đối với tôi và cho phép trả về vận chuyển được nhập vào trường mật khẩu. Thay vào đó tôi đang làm điều này:

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

Và tôi không thiết lập android: password = "true" trong XML.


yap, điều này cũng có hiệu quả với tôi trong 6.0.1, câu trả lời được chọn là không
Nactus

5

Câu trả lời manisha cung cấp không hoạt động, nhưng nó để trường mật khẩu ở trạng thái không chuẩn so với mặc định. Nghĩa là, phông chữ mặc định sau đó cũng áp dụng cho trường mật khẩu, bao gồm cả thay thế dấu chấm và ký tự xem trước xuất hiện trước khi được thay thế bằng dấu chấm (cũng như khi đó là trường "mật khẩu hiển thị").

Để sửa lỗi này và làm cho nó 1) trông và hoạt động chính xác như textPasswordkiểu nhập mặc định , nhưng cũng 2) cho phép văn bản gợi ý xuất hiện ở phông chữ mặc định (không phải là không gian đơn), bạn cần phải có một TextWatchertrường trên có thể chuyển đổi fontface đúng cách qua lại giữa Typeface.DEFAULTTypeface.MONOSPACEdựa trên việc nó có trống hay không. Tôi đã tạo một lớp trợ giúp có thể được sử dụng để thực hiện điều đó:

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);
    }
}

Sau đó, để sử dụng nó, tất cả những gì bạn cần làm là gọi register(View)phương thức tĩnh. Mọi thứ khác đều tự động (bao gồm bỏ qua cách giải quyết nếu chế độ xem không yêu cầu!):

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

1
Công việc tốt đẹp. Một thay đổi nhỏ: nếu bạn đặt phông chữ trên EditText(ví dụ: tạo văn bản gợi ý Roboto Light), thì cài đặt Typeface.DEFAULTsau sẽ ghi đè lên phông chữ này. Tôi gọi field.getTypeface()lên phía trước và sử dụng kiểu chữ đó bất cứ khi nào tôi cần đặt lại về phông chữ "mặc định" sau.
Christopher Orr

Chà, gọi điện field.getTypeface()dường như không đáng tin cậy 100% (vì thông thường bạn sẽ chỉ lấy lại phông chữ đơn cách), nhưng tạo ra một Kiểu chữ thông qua Typeface.create()và sau đó cài đặt có vẻ hoạt động tốt.
Christopher Orr

5

Có nhiều cách để giải quyết vấn đề này nhưng mỗi cách đều có ưu và nhược điểm. Đây là thử nghiệm của tôi

Tôi chỉ gặp vấn đề về phông chữ này trong một số thiết bị (danh sách ở cuối câu trả lời của tôi) khi bật mật khẩu đầu vào bằng

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

Nếu tôi sử dụng android:inputType="textPassword", vấn đề này đã không xảy ra

Một cái gì đó tôi đã thử

1) Sử dụng setTransformationMethodthay thếinputType

edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
  • Phông chữ sẽ hoạt động tốt
  • Bàn phím hiển thị không tốt lắm (nó chỉ hiển thị văn bản, không hiển thị số trên đầu văn bản)

2) Sử dụng Typeface.DEFAULT

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);
  • Bàn phím hiển thị tốt ,
  • Phông chữ có thể hoạt động không tốt . Ví dụ sans-serif-lightlà một phông chữ mặc định cho tất cả Viewtrong ứng dụng của tôi => sau đó setTypeface(Typeface.DEFAULT), EditTextphông chữ vẫn trông khác nhau trong một số thiết bị

3) Sử dụng android:fontFamily="sans-serif"

GIẢI PHÁP CỦA TÔI

lưu trữ kiểu chữ trước khi setInputTypesử dụng lại

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

Kiểm tra
một số vấn đề về phông chữ của thiết bị

  • Xiaomi A2 (8.0.1)
  • Pixel XL (8.1.0)
  • Sony Xperia Z5 Au (SOV32) (6.0)
  • Mũi tên NX (F-04G) (6.0.1)
  • Kyocera (S2) (7.0)

Một số thiết bị không phải đối mặt với vấn đề phông chữ

  • Samsung S4 (SC-04E) (5.0.1)
  • Samsung Galaxy Node 5 (5.1.1)
  • Samsung S7 Edge (SM-G935F) (7.0)

Thiết bị (tên và hệ điều hành) là gì?
CoolMind

1
@CoolMind cảm ơn bạn đã gợi ý, tôi đã cập nhật sự cố về phông chữ của thiết bị và thiết bị không gặp sự cố về phông chữ trên thiết bị hiện tại của tôi
Phan Văn Linh

Cảm ơn bạn đã thử nghiệm lớn! Tôi đến với cô ấy từ stackoverflow.com/a/52178340/2914140 . Trên Samsung S4 tôi đã sử dụng setTransformationMethodphương pháp (nơi không gặp phải vấn đề).
CoolMind

Như tôi đã đề cập trong câu trả lời của mình, setTransformationMethodsẽ hoạt động nhưng bàn phím sẽ không hiển thị tốt. Tuy nhiên, nếu bạn oke với nó, nó vẫn oke vì đó chỉ là một vấn đề nhỏ
Phan Văn Linh

4

Các câu trả lời khác là giải pháp phù hợp cho hầu hết các trường hợp.

Tuy nhiên, nếu bạn đang sử dụng một EditTextlớp con tùy chỉnh để, giả sử, áp dụng một phông chữ tùy chỉnh theo mặc định, có một vấn đề tinh tế. Nếu bạn đặt phông chữ tùy chỉnh trong hàm tạo của lớp con, nó sẽ vẫn bị hệ thống ghi đè nếu bạn đặt inputType="textPassword".

Trong trường hợp này, di chuyển kiểu dáng của bạn đến onAttachedToWindowsau super.onAttachedToWindowcuộc gọi của bạn .

Ví dụ thực hiện:

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

Tôi biết đây có thể là cái cũ hơn nhưng tôi đã tìm hiểu một vài thứ liên quan đến vấn đề này khi tôi sử dụng InputTypeapp:passwordToggleEnabled="true"cùng nhau.

Vì vậy, viết điều này, vì nó có thể giúp ai đó ở đây.

Tôi muốn sử dụng một phông chữ tùy chỉnh cho trường mật khẩu cùng với app:passwordToggleEnabledtùy chọn cho trường nhập mật khẩu của tôi. Nhưng trong thư viện hỗ trợ 27.1.1 (trong khi viết này), nó đã bị sập.

Vì vậy, mã như dưới đây,

<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>

Mã trên không inputTypeđược xác định trong XML

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

Và trong Java, setTransformationMethodsẽ giúp tôi có được các thuộc tính của textPasswordkiểu đầu vào và tôi cũng hài lòng kiểu phông chữ tùy chỉnh của mình.

Nhưng sự cố được đề cập dưới đây đã xảy ra ở tất cả các cấp API với thư viện hỗ trợ 27.1.1.

java.lang.NullPulumException: Cố gắng gọi phương thức ảo 'void android.support.design.widget.CheckableImageButton.setChecked (boolean)' trên tham chiếu đối tượng null

Điều này đã sụp đổ do lớp onRestoreInstanceStatebên trong TextInputLayout.

Các bước tái tạo: Chuyển đổi khả năng hiển thị mật khẩu và thu nhỏ ứng dụng và mở từ các ứng dụng gần đây. Uh, ho Sụp đổ!

Tất cả những gì tôi cần là tùy chọn chuyển đổi mật khẩu mặc định (sử dụng thư viện hỗ trợ) và phông chữ tùy chỉnh trong trường nhập mật khẩu.

Sau một thời gian, tìm ra bằng cách làm như dưới đây,

<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>

Trong XML, đã thêm 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

Trong mã java ở trên,

Tôi đã có được kiểu chữ tùy chỉnh từ tên người dùng EditTextvà áp dụng nó cho TextInputLayouttrường mật khẩu. Bây giờ bạn không cần phải đặt kiểu chữ rõ ràng cho mật khẩu EditTextvì nó sẽ có được thuộc TextInputLayouttính.

Ngoài ra, tôi đã loại bỏ password.setTransformationMethod(new PasswordTransformationMethod());

Bằng cách này, passwordToggleEnabledđang hoạt động, phông chữ tùy chỉnh cũng được áp dụng và tạm biệt sự cố. Hy vọng vấn đề này sẽ được khắc phục trong bản phát hành hỗ trợ sắp tới.


2

Bạn cũng có thể sử dụng một Widget tùy chỉnh. Điều đó rất đơn giản và nó không làm lộn xộn mã Activity / Fragment của bạn.

Đây là mã:

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);
  }
}

Và XML của bạn sẽ trông như thế này:

<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" />

Theo kinh nghiệm của tôi, điều này không hoạt động - bên trong TextViewdường như ghi đè lên kiểu chữ tùy chỉnh sau khi gọi hàm tạo. Cung cấp một cách giải quyết trong một câu trả lời khác.
Cory Petosky

2

sử dụng thư viện thư pháp .

sau đó nó vẫn không cập nhật các trường mật khẩu với đúng phông chữ. Vì vậy, làm điều này trong mã không trong 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

Gần đây tôi đã thêm khả năng thay đổi bật / tắt monospace thành một phần mở rộng của EditText dành riêng cho mật khẩu, nó có thể giúp một số người. Nó không sử dụng android:fontFamilynên tương thích <16.


0

Bạn cũng có thể sử dụng

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

cùng với

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

0

Tôi sử dụng giải pháp này để chuyển đổi Kiểu chữ tùy thuộc vào khả năng hiển thị gợi ý. Nó tương tự như câu trả lời của Joe, nhưng thay vào đó là mở rộng 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

Trong trường hợp bạn đang sử dụng thư viện thư pháp kết hợp với TextInputLayout và EditText, đoạn mã sau hoạt động tốt.

    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);

Điều này đã không sửa đổi kiểu chữ gợi ý của tôi
Rafael Ruiz Muñoz

0

Một trường hợp kỳ lạ có lẽ, nhưng tôi đã thử nghiệm điều này và phát hiện ra rằng:

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

thay đổi kích thước phông chữ của gợi ý thay vì chính phông chữ! Đây vẫn là một hiệu ứng không mong muốn. Thật kỳ lạ, hoạt động ngược lại:

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

Giữ kích thước phông chữ giống nhau.


0

Tôi tìm thấy một giải pháp chắc chắn cho vấn đề này

Cách tốt nhất để xin chào, tôi tìm thấy một giải pháp chắc chắn cho vấn đề này

Cách tốt nhất là tạo một chỉnh sửa tùy chỉnh và lưu giá trị của kiểu chữ dưới dạng tạm thời và sau đó áp dụng phương thức cho các thay đổi InputType, Cuối cùng, chúng tôi đặt lại giá trị của khuôn mặt loại tạm thời cho chỉnh sửa. như vậy

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

Đây là cách tạo mật khẩu đầu vào có gợi ý không được chuyển đổi thành * và kiểu chữ mặc định !!.

Trên XML:

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

Trên hoạt động:

inputPassword.setTypeface(Typeface.DEFAULT);

cảm ơn: xoài và rjrjr cho cái nhìn sâu sắc: D.


-2

giống như ở trên nhưng đảm bảo các trường không có kiểu in đậm trong xml vì chúng sẽ không bao giờ trông giống nhau ngay cả với cách sửa ở trên!


2
Đừng nói "ở trên" ... mọi thứ thay đổi theo thời gian :-)
ZaBlanc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.