एंड्रॉइड में पासवर्ड संकेत फ़ॉन्ट


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
ध्यान दें कि सभी डिवाइस इस तरह से व्यवहार नहीं करते हैं। "एचटीसी वन एक्स @ 4.1.1" करता है (मोनोस्पेस)। "सैमसंग GT-7510 @ 4.0.4" नहीं है। (वही फॉन्ट)
लोड़ा

1
लेवा ओएस 4.2.2 पर समान व्यवहार। बहुत असंगत एपीआई ..
ruX

लॉलीपॉप में अभी भी मौजूद है
माइटियन

आप यहाँ मेरे जवाब की जाँच कर सकते हैं आशा है कि यह काम करता है।
दम्मिला राम

जवाबों:


394

Xml में टाइपफेस बदलने से मेरे लिए हिंट टेक्स्ट पर भी काम नहीं किया गया। मुझे दो अलग-अलग समाधान मिले, जिनमें से दूसरा मेरे लिए बेहतर व्यवहार है:

1) android:inputType="textPassword"अपनी xml फ़ाइल से निकालें और इसके बजाय, इसे जावा में सेट करें:

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

इस दृष्टिकोण के साथ, संकेत फ़ॉन्ट अच्छा लगता है, लेकिन जैसा कि आप उस संपादन फ़ील्ड में टाइप कर रहे हैं, आपको पासवर्ड डॉट में बदलने से पहले प्रत्येक वर्ण को सादे पाठ में नहीं दिखता है। फुलस्क्रीन में इनपुट बनाते समय, डॉट्स दिखाई नहीं देंगे, लेकिन स्पष्ट पाठ में पासवर्ड।

2) android:inputType="textPassword"अपने xml में छोड़ दें । जावा में, ALSO ने टाइपफेस और पासवर्डमैथोड सेट किया:

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

10
बेहतर अभी तक, इस पृष्ठ पर उत्तर में इस महान सरल समाधान को देखें: stackoverflow.com/a/18073897
Marcin Kozi Marski

16
कृपया ध्यान रखें कि पहले समाधान का उपयोग करना एक बुरा विचार है - जिन उपयोगकर्ताओं के पास ऑटो-सुझाव सक्षम है, वे अन्य एप्लिकेशन में अपना पासवर्ड देखना शुरू कर देंगे, उन्हें सुझाव दिया जाएगा, क्योंकि EditText के रूप में घोषित नहीं किया गया थाinputType="textPassword"
Elad Nava

193

मुझे यह उपयोगी टिप डायलॉग्स गाइड से मिली

युक्ति: डिफ़ॉल्ट रूप से, जब आप "textPassword" इनपुट प्रकार का उपयोग करने के लिए एक EditText तत्व सेट करते हैं, तो फ़ॉन्ट परिवार मोनोस्पेस पर सेट होता है, इसलिए आपको अपने फ़ॉन्ट परिवार को "sans-serif" में बदलना चाहिए, ताकि दोनों पाठ फ़ील्ड एक मेल फ़ॉन्ट का उपयोग करें अंदाज।


उदाहरण के लिए

android:fontFamily="sans-serif"

21
यह स्वीकृत उत्तर होना चाहिए। यह सरल है और यह डॉक्स से है।
मार्सिन कोज़ीस्की

29
यह अच्छा है, सिवाय इसके कि यह केवल एपीआई स्तर 16 और इसके बाद के संस्करण पर काम करता है
बेन क्लेटन

6
ध्यान दें कि जब यह केवल एपीआई स्तर 16 और इसके बाद के संस्करण पर काम करता है, तो xml विशेषताएँ पुराने उपकरणों पर क्रैश का कारण नहीं बनती हैं, उन्हें केवल अनदेखा किया जाता है।
एडम जॉन्स

यदि आप कई बार शो /
हिडेन

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

मैंने इसे XML में textPassword के साथ आज़माया और जैसा कि आप .java फ़ाइल में कर रहे थे, और यह ठीक काम कर रहा था। मेरे लिए, यह परिवर्तन की आवश्यकता प्रतीत नहीं हुई
जो प्लांटे सेप

2
अनुस्मारक: कॉल सेट टाइपफेस () के बाद आप कोड द्वारा इनपुट टाइप बदलें। अगर इनपुट टाइप में xx_VARIATION_PASSWORD शामिल है तो setTransformationMethod की आवश्यकता नहीं है;
लोड़ा

21

सेटट्रांसफॉर्मेशनमेथोड दृष्टिकोण एंड्रॉइड को तोड़ता है: मेरे लिए imeOption, और गाड़ी के रिटर्न को पासवर्ड फ़ील्ड में टाइप करने की अनुमति देता है। इसके बजाय मैं यह कर रहा हूँ:

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

और XML में android: पासवर्ड = "true" सेट नहीं कर रहा हूँ।


हां, यह मेरे लिए 6.0.1 में भी काम किया, चुना हुआ जवाब नहीं था
Nactus

5

उत्तर प्रदान की गई मनीषा काम करती है, लेकिन यह डिफ़ॉल्ट की तुलना में पासवर्ड को गैर-मानक स्थिति में छोड़ देती है। यही है, फिर डिफ़ॉल्ट फॉण्टफेस पासवर्ड फ़ील्ड पर भी लागू होता है, जिसमें डॉट प्रतिस्थापन और पूर्वावलोकन वर्ण दोनों शामिल हैं जो डॉट्स के साथ प्रतिस्थापित होने से पहले दिखाई देते हैं (साथ ही जब यह "दृश्य पासवर्ड" फ़ील्ड है)।

इसे ठीक करने के लिए और इसे 1) बनाने के लिए डिफ़ॉल्ट textPasswordइनपुट प्रकार की तरह देखें और कार्य करें, लेकिन 2 भी) संकेत पाठ को डिफ़ॉल्ट (गैर-मोनोस्पेस) फ़ॉन्ट में प्रदर्शित करने की अनुमति दें, आपको TextWatcherउस फ़ील्ड पर होना चाहिए जो टॉगल कर सके Fontface ठीक से आगे और पीछे के आधार पर 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(जैसे संकेत पाठ रोबोटो लाइट बनाते हुए) पर एक फ़ॉन्ट सेट करते हैं , तो Typeface.DEFAULTबाद में सेटिंग इसे ओवरराइड कर देगी। field.getTypeface()जब भी मुझे "डिफ़ॉल्ट" फ़ॉन्ट को बाद में रीसेट करने की आवश्यकता होती है, मैं सामने कॉल करता हूं और उस टाइपफेस का उपयोग करता हूं।
क्रिस्टोफर ऑयर

ठीक है, कॉलिंग field.getTypeface()100% विश्वसनीय नहीं लगती है (जैसा कि अक्सर आप केवल मोनोस्पेस फ़ॉन्ट प्राप्त करेंगे), लेकिन इसके माध्यम से एक टाइपफेस तैयार करना Typeface.create()और फिर सेट करना अच्छा लगता है।
क्रिस्टोफर ऑयर

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"

मेरा समाधान

टाइपफेस को कैश करने से पहले setInputTypeउसका पुनः उपयोग करें

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

परीक्षण
कुछ डिवाइस फेस फ़ॉन्ट समस्या

  • Xiaomi A2 (8.0.1)
  • पिक्सेल XL (8.1.0)
  • Sony Xperia Z5 Au (SOV32) (6.0)
  • एरो एनएक्स (एफ -04 जी) (6.0.1)
  • क्योसेरा (S2) (7.0)

कुछ डिवाइस को फ़ॉन्ट समस्या का सामना नहीं करना पड़ता है

  • सैमसंग S4 (SC-04E) (5.0.1)
  • सैमसंग गैलेक्सी नोड 5 (5.1.1)
  • सैमसंग S7 एज (SM-G935F) (7.0)

डिवाइस (नाम और ओएस) क्या है?
कूलमाइंड

1
@CoolMind आपके सुझाव के लिए धन्यवाद, मेरे पास अपडेट डिवाइस फेस फॉन्ट की समस्या है और डिवाइस को मेरे वर्तमान डिवाइस पर फॉन्ट प्रॉब्लम बेस नहीं है
फान वान

एक बड़े परीक्षण के लिए धन्यवाद! मैं उसे stackoverflow.com/a/52178340/2914140 से लेकर आया था । सैमसंग एस 4 पर मैंने setTransformationMethodविधि का उपयोग किया (जहां समस्या का सामना नहीं करना पड़ा)।
कूलमाइंड

जैसा कि मैंने अपने उत्तर में उल्लेख किया है, setTransformationMethodकाम करेगा लेकिन कीबोर्ड अच्छा प्रदर्शन नहीं करेगा। हालांकि, अगर आप इसके साथ मजाक करते हैं, तो यह अभी भी मजाक करता है क्योंकि यह सिर्फ एक छोटी सी समस्या है
फान वान

4

अन्य उत्तर ज्यादातर मामलों के लिए सही समाधान हैं।

हालाँकि, यदि आप कस्टम EditTextउपवर्ग का उपयोग कर रहे हैं, तो कहें, डिफ़ॉल्ट रूप से एक कस्टम फ़ॉन्ट लागू करें, एक सूक्ष्म मुद्दा है। यदि आप अपने उपवर्ग के निर्माता में कस्टम फ़ॉन्ट सेट करते हैं, तो यह सिस्टम द्वारा आपके द्वारा सेट किए जाने पर भी अधिलेखित हो जाएगा 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

मुझे पता है कि यह पुराना हो सकता है, लेकिन मैंने इस मुद्दे से जुड़ी कुछ चीज़ों में गुनगुनाया है जब मैंने उपयोग किया था 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>

ऊपर कोड inputTypeXML में परिभाषित नहीं है

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

और जावा में, setTransformationMethodमुझे के गुणों को प्राप्त करने में मदद करेगाtextPassword इनपुट प्रकार और साथ ही मैं अपनी कस्टम फ़ॉन्ट शैली से खुश हूं।

लेकिन 27.1.1 समर्थन पुस्तकालय के साथ सभी एपीआई स्तरों में नीचे वर्णित दुर्घटना हुई।

java.lang.NullPointerException: वर्चुअल विधि 'void android.support.design.widget.CheckableImageButton.setChecked (बूलियन)' को एक अशक्त ऑब्जेक्ट संदर्भ पर लागू करने का प्रयास करें

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

एक्सएमएल में, जोड़ा गया 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

ऊपर के जावा कोड में,

मैंने उपयोगकर्ता नाम से कस्टम टाइपफेस का अधिग्रहण किया 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से कंस्ट्रक्टर कॉल के बाद कस्टम टाइपफेस को अधिलेखित करने के लिए लगता है। एक अन्य उत्तर में समाधान प्रदान किया।
कोरी पेटोस्की

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

मैंने हाल ही में विशेष रूप से पासवर्ड के लिए 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);

इसने मेरे संकेत टाइपफेस को संशोधित नहीं किया
राफेल रुइज़ मुनोज़

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 बनाने और एक अस्थायी के रूप में टाइपफेस के मूल्य को बचाने के लिए है और फिर InputType परिवर्तनों के लिए विधि लागू करें, अंत में, हम 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 अंतर्दृष्टि के लिए: डी।


-2

ऊपर की तरह, लेकिन सुनिश्चित करें कि फ़ील्ड्स के पास xml में बोल्ड स्टाइल नहीं है क्योंकि वे ऊपर के फिक्स के साथ भी समान नहीं दिखेंगे!


2
"ऊपर" मत कहो ... समय के साथ चीजें बदल जाती हैं :-)
ज़ैब्लैंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.