android - एंड्रॉइड ओएस बग जेली बीन/4.2.1 चलने वाले कुछ डिवाइसों के साथ-पाठ दृश्य.सेटएर्रर(चौरसमेन्स त्रुटि) लापता आइकन




android-edittext android-textview (2)

कुछ, लेकिन सभी नहीं, जेली बीन (4.2.1) चलने वाले यंत्रों में विस्मयादिबोधक बिंदु त्रुटि चिह्न है जो कि TextView (या अधिक सामान्यतः एक EditText ) पर प्रदर्शित होना चाहिए, उस पर एक त्रुटि सेट किया गया है, जो EditText TextView.setError(CharSequence error)

गैलेक्सी नेक्सस निश्चित तौर पर आइकन याद कर रहा है।

प्रभाव यह है कि setError द्वारा सेट की गई त्रुटि की स्थिति केवल तब स्पष्ट होती है जब EditText फ़ोकस होता है। यह setError(...) बहुत कम उपयोगी बनाता है क्योंकि अक्सर उपयोगकर्ताओं को एक समस्या को ठीक करने के लिए उस EditText पर वापस जाने के लिए प्रोत्साहित किया जाता है। उदाहरण के लिए, आपके उपयोगकर्ता नाम और पासवर्ड फ़ॉर्म प्रविष्टियों के साथ एक मानक लॉगिन स्क्रीन होती है, जो उपयोगकर्ता सबमिट बटन पर क्लिक करते हैं। यूज़रनेम फ़ॉर्म पर एक सत्यापन त्रुटि संदेश प्रदर्शित नहीं होगा जब तक उपयोगकर्ता उस फॉर्म पर वापस नहीं लौटाएगा - जो कि उन्हें करने के लिए प्रोत्साहित करने के लिए त्रुटि आइकन बनाया गया है!

परीक्षण करने के लिए: (एक और आसानी से सुलभ EditText हो सकता है, लेकिन यह बहुत व्यापक रूप से उपलब्ध है)

  1. सेटिंग्स खोलें
  2. 'खाते जोड़ें' का चयन करें (यह पुराने डिवाइसों पर 'लेखा और समन्वयन' में है)
  3. खाता प्रकार के रूप में 'Google' का चयन करें
  4. 'मौजूदा' का चयन करें (पुराने डिवाइस पर 'अगला' और 'प्रवेश' पर क्लिक करने के बाद)
  5. 'ईमेल' EditText छोड़कर EditText रिक्त EditText , 'पासवर्ड' EditText पर क्लिक करें

इस बिंदु पर, 'ईमेल' EditText पर एक त्रुटि सेट की गई है, जिसमें कहा गया है कि यह रिक्त नहीं हो सकता। जिन डिवाइसों पर यह समस्या नहीं है, सामान्य त्रुटि आइकन दिखाया गया है, जो संपूर्ण त्रुटि संदेश को फैलता है जब EditText फ़ोकस होता है। जेली बीन चलाने वाले गैलेक्सी नेक्सस पर, कोई आइकन नहीं दिखाया गया है और त्रुटि केवल तब ही दिखाई देती है जब 'ईमेल' EditText फिर से फ़ोकस करता है, और उस बिंदु पर अभी भी आइकन का अभाव है।

यह एक बग की तरह दिखता है, लेकिन मैं यह देखना चाहता हूं कि क्या अन्य लोग इसे पुन: उत्पन्न कर सकते हैं, इस बारे में विचार कर सकते हैं कि समस्या क्या हो सकती है, और एक अच्छा समाधान हो सकता है।

setError(CharSequence error, Drawable icon) करना शायद चीजों को ठीक करेगा, लेकिन विभिन्न एंड्रॉइड संस्करणों में स्टॉक त्रुटि ग्राफिक का उपयोग करने में सक्षम होना अच्छा होगा।


अस्थायी समाधान! EditTextErrorFixed.java

हालांकि यह वास्तव में एक एसडीके बग है, मैंने इरादा के रूप में काम करने के लिए आइकन प्राप्त करने के लिए प्रतिबिंब के तरीकों का इस्तेमाल किया है मैंने चेक किया कि यह 4.2 और 4.2.1 दोनों के साथ काम करता है और सत्यापित है कि यह मेरे अद्यतित गैलेक्सी नेक्सस पर काम करता है।

स्रोत यहां पाया जा सकता है।

स्क्रीनशॉट दिखाता है कि नीचे दिए गए EditTextErrorFixed के नीचे दिए गए चिह्न तब भी बनी EditTextErrorFixed जब फ़ोकस में परिवर्तन हो। इसके अलावा यह एक और फिक्स को शामिल करता है जहां उपयोगकर्ता प्रेस EditText गए पहले से ही रिक्त EditText पर त्रुटि गायब हो जाता है (दूसरा बग?)।

सुविधा के लिए, यहां EditTextErrorFixed स्रोत है; वर्ग आसानी से XML में उपयोग किया जा सकता है:

package com.olegsv.showerrorfixeddemo;

import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.EditText;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * EditText which addresses issues with the error icon
 * (http://.com/q/13756978/832776) and also the error icon
 * disappearing on pressing delete in an empty EditText
 */
public class EditTextErrorFixed extends EditText {
    public EditTextErrorFixed(Context context) {
        super(context);
    }

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

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

    /**
     * Don't send delete key so edit text doesn't capture it and close error
     */
    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (TextUtils.isEmpty(getText().toString()) && keyCode == KeyEvent.KEYCODE_DEL)
            return true;
        else
            return super.onKeyPreIme(keyCode, event);
    }

    /**
     * Keep track of which icon we used last
     */
    private Drawable lastErrorIcon = null;

    /**
     * Resolve an issue where the error icon is hidden under some cases in JB
     * due to a bug http://code.google.com/p/android/issues/detail?id=40417
     */
    @Override
    public void setError(CharSequence error, Drawable icon) {
        super.setError(error, icon);
        lastErrorIcon = icon;

        // if the error is not null, and we are in JB, force
        // the error to show
        if (error != null /* !isFocused() && */) {
            showErrorIconHax(icon);
        }
    }

    /**
     * In onFocusChanged() we also have to reshow the error icon as the Editor
     * hides it. Because Editor is a hidden class we need to cache the last used
     * icon and use that
     */
    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
        showErrorIconHax(lastErrorIcon);
    }

    /**
     * Use reflection to force the error icon to show. Dirty but resolves the
     * issue in 4.2
     */
    private void showErrorIconHax(Drawable icon) {
        if (icon == null)
            return;

        // only for JB 4.2 and 4.2.1
        if (android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.JELLY_BEAN &&
                android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.JELLY_BEAN_MR1)
            return;

        try {
            Class<?> textview = Class.forName("android.widget.TextView");
            Field tEditor = textview.getDeclaredField("mEditor");
            tEditor.setAccessible(true);
            Class<?> editor = Class.forName("android.widget.Editor");
            Method privateShowError = editor.getDeclaredMethod("setErrorIcon", Drawable.class);
            privateShowError.setAccessible(true);
            privateShowError.invoke(tEditor.get(this), icon);
        } catch (Exception e) {
            // e.printStackTrace(); // oh well, we tried
        }
    }
}

मुझे पता है कि पहले से ही यहां एक समाधान है। इसका सिर्फ मैं एंड्रॉइड पर हर कीमत पर प्रतिबिंब से बचने का प्रयास करता हूं। यदि प्रतिबिंब के साथ आपका ठीक ठीक है, लेकिन नीचे अपना समाधान नीचे आज़माएं, क्योंकि यह उपवर्ग और प्रतिबिंबित किए बिना समस्या को ठीक कर सकता है

Drawable d= getResources().getDrawable(R.drawable.ic_launcher);
            d.setBounds(0, 0, 
                    d.getIntrinsicWidth(), d.getIntrinsicHeight());

            et.setError("my error",d);




android-4.2-jelly-bean