EditText ReadOnly करें


119

मैं केवल पढ़ने के लिए एक EditTextदृश्य बनाना चाहता हूं । इस कोड को करने के लिए XML प्रतीत होता है android:editable="false", लेकिन मैं कोड में ऐसा करना चाहता हूं।

मैं यह कैसे कर सकता हूँ?



3
यह भी ध्यान देने योग्य है कि इसके android:editableलिए पदावनत किया जाता है EditText
डेरेक डब्ल्यू

ऐसा करने का सबसे विश्वसनीय तरीका इस पुस्तकालयUI.setReadOnly(myEditText, true) से उपयोग करना है । कुछ गुण हैं जिन्हें सेट करना है, जिन्हें आप स्रोत कोड में देख सकते हैं ।
caw

3
हाँ डेरेक सही है। अब XML में आपको इस्तेमाल करना चाहिए android:inputType="none"औरandroid:textIsSelectable="true"
अतुल

जवाबों:


135

कृपया इस कोड का उपयोग करें ..

Edittext.setEnabled(false);

34
यह न केवल 'सेट' को रीड-ओनली करेगा बल्कि स्क्रॉलिंग और कॉपी को भी निष्क्रिय कर देगा :-(
josef

1
यह अक्षम करता है। विशेष रूप से बहुस्तरीय EditText के लिए बेकार।
अतुल

यह कोशिश करो, लेकिन मूल्य खो दिया है?
fdurmus77

97

यदि आप setEnabled(false)तब editTextविकलांग (ग्रे, आदि) दिखेंगे। आप अपने संपादक के दृश्य पहलू को बदलना नहीं चाह सकते हैं।

एक कम घुसपैठ तरीका उपयोग करना होगा setFocusable(false)

मेरा मानना ​​है कि यह आपके प्रश्न का आपके प्रारंभिक इरादे के करीब है।


8
यह अच्छा है, लेकिन उपयोगकर्ता अभी भी पाठ क्षेत्र में "पेस्ट" कर सकता है।
xtrem

14
यह मेरे लिए बहुत अच्छा काम किया। मुझे यह क्लिक करने योग्य होने की आवश्यकता थी इसलिए मैं setEnabled (गलत) का उपयोग नहीं कर सका। पेस्ट-सक्षम मुद्दे के आसपास जाने के लिए, मैंने अभी-अभी android किया: longClickable = "false"
dt0

3
यदि आप setFocusable(false)(और यहां तक setFocusableInTouchMode(false)कि setClickable(false)) का उपयोग करते हैं, तब भी आप कुछ सौ मिलीसेकंड के लिए अपने editTextदबाने का मूल्य बदल सकते हैं और विकल्प का चयन कर सकते हैं जब तक कि सिस्टम क्लिपबोर्ड खाली न हो। मैंने इसे नवीनतम उपलब्ध एपीआई के साथ परीक्षण किया जो 23 हैeditTextPaste
patryk.beza

यह काम करता है, मैं कर्सर को स्क्रॉल करने और देखने में सक्षम नहीं हूं।
लाइव-प्यार

28

में XMLउपयोग करें:

android:editable="false"

उदहारण के लिए:

<EditText
    android:id="@+id/EditText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:editable="false" />

Javadoc के अनुसार , editableविशेषता को पदावनत नहीं किया जाना चाहिए (कम से कम, एपीआई स्तर 23 के रूप में नहीं)।
ग्रेग ब्राउन

8
@ मायचेलजंग सही है। आप का उपयोग करना चाहिएandroid:inputType="none"
अता इरावनी

1
सवाल जावा कोड नहीं XML के माध्यम से संपादन योग्य गलत बनाने के लिए एक रास्ता चाहता है!
सईद खलफीनजाद

7
मैं कोशिश कर रहा हूं android:inputType="none"और डेटा अभी भी संपादन योग्य है।
BlueMonkMN

24

यह मेरे लिए काम करता है:

EditText.setKeyListener(null);

5
यह अच्छा होता, लेकिन उपयोगकर्ता अभी भी क्षेत्र में "पेस्ट" कर सकता है। वैसे भी, एक हैक की तरह लग रहा है, वैसे भी अंगूठे। काश उनके पास एक सेटएडिटेबल () एपीआई होता।
xtrem

15

इसके TextViewबजाय का उपयोग करके सबसे अच्छा है ।


8
अपने ऐप के प्रवाह के अनुसार उसे कुछ समय के लिए संपादन योग्य बनाने की आवश्यकता हो सकती है और अन्य में नहीं
मुहम्मद रिफैट

15
editText.setInputType(InputType.TYPE_NULL);

डॉक्स के अनुसार यह सॉफ्ट कीबोर्ड को प्रदर्शित होने से रोकता है। यह चिपकाने से भी रोकता है, स्क्रॉल करने की अनुमति देता है और दृश्य के दृश्य पहलू को परिवर्तित नहीं करता है। हालाँकि, यह दृश्य के भीतर पाठ के चयन और प्रतिलिपि बनाने से भी रोकता है।

मेरे परीक्षण सेटिंग setInputTypeसे TYPE_NULLलगता है कि यह कार्यात्मक रूप से मूल्यह्रास के बराबर है android:editable="false"। इसके अतिरिक्त, android:inputType="none"कोई ध्यान देने योग्य प्रभाव नहीं है।


सहमत, यह अब के लिए काम करता है, और जैसा आपने कहा कि अब और android:inputType="none"काम नहीं करता है।
गोका ओबासा

1
दुर्भाग्य से यह क्षेत्र में टाइप करने से नहीं रोकता है यदि आभासी कीबोर्ड पहले से ही खुला है (यानी उपयोगकर्ता पहले किसी संपादन योग्य क्षेत्र पर टैप करता है, तो इस पर - वर्चुअल कीबोर्ड बंद नहीं होता है)। इसके अलावा यह बाहरी कीबोर्ड से क्षेत्र में टाइप करने से नहीं रोकता है।
jk7

11

Android: editable = "false" को हटा दिया गया है। इसलिए आप इसे संपादित पाठ को आसानी से बनाने के लिए उपयोग नहीं कर सकते।

मैंने इसे bellow समाधान का उपयोग करके किया है। यहाँ मैंने उपयोग किया है

एंड्रॉयड: inputType = "कोई नहीं"

एंड्रॉयड: textIsSelectable = "true"

एंड्रॉयड: फ़ोकस करने योग्य = "false"

इसे आज़माएं :)

<EditText
         android:id="@+id/et_newsgpa_university"
         android:layout_height="wrap_content"
         android:layout_width="match_parent"
         android:hint="@string/hint_educational_institute"
         android:textSize="@dimen/regular_text"
         android:inputType="none"
         android:textIsSelectable="true"
         android:focusable="false"
         android:maxLines="1"
         android:imeOptions="actionNext"/>

यह वास्तव में आसानी से नहीं है, आप अभी भी इस कोड में edittext के लिए मूल्यों को चिपका सकते हैं। android:enabled="false"एक अच्छा विकल्प हो सकता है।
eVader

7
editText.setEnabled(false);
editText.setFilters(new InputFilter[] { new InputFilter() {
    public CharSequence filter(CharSequence src, int start, int end,
            Spanned dst, int dstart, int dend) {
        return src.length() < 1 ? dst.subSequence(dstart, dend) : "";
    }
} });

यह आपको uneditable EditText फ़िल्टर देगा। आपको पहले एडिट टेक्स्ट फील्ड पर मनचाहा टेक्स्ट डालना होगा और फिर इस फिल्टर को लगाना होगा।


2
एक अच्छा समाधान, और एक TextWatcher की तुलना में कोड की कम लाइनें। इससे उपयोगकर्ता पाठ का चयन और कॉपी कर सकता है लेकिन टाइप या CUT या PASTE द्वारा पाठ को नहीं बदल सकता है। रिटर्न स्टेटमेंट को सरल बनाया जा सकता हैreturn dst.subSequence(dstart, dend);
jk7

मेरी पिछली टिप्पणी सिर्फ एडिट टेक्स्ट फील्ड को डिसेबल किए बिना सिर्फ सेटफिल्टर () स्टेटमेंट का जिक्र कर रही थी।
jk7

धन्यवाद, यह एकमात्र समाधान है जो मेरे लिए काम करता है! यह निराशा की बात है कि कुछ काम करना ह्रास था, और कुछ के साथ बदल दिया गया (इनपुट टाइप = "कोई नहीं") जो अभी भी काम नहीं कर रहा है, और अवांछित साइड-इफेक्ट (मल्टी-लाइन इनपुट) के साथ। कृपया ध्यान दें कि @ jk7 द्वारा सुझाए गए परिवर्तन महत्वपूर्ण हैं, क्योंकि मूल रिटर्न स्टेटमेंट के साथ, यदि आप अपने मूल पाठ का हिस्सा चुनते हैं, और कुछ टाइप करते हैं, तो आप चयनित पाठ को फ़िल्टर द्वारा दिए गए खाली स्ट्रिंग के साथ समाप्त कर देंगे। इस स्थिति में src की लंबाई गैर-शून्य है, और खाली स्ट्रिंग प्रभाव डाल रही है।
पॉल एल।



3

प्रयोग करके देखें

editText.setEnabled(false);
editText.setClickable(false);

यह अभी भी कीबोर्ड से टैब मारकर इसे ध्यान देने योग्य
बनाता है

3
android:editable

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

एक होना चाहिए booleanमूल्य, या तो trueया false

यह एक संसाधन (प्रपत्र में @[package:]type:name) या थीम विशेषता (प्रपत्र में ?[package:][type:]name) इस प्रकार के मान से संबंधित हो सकता है।

यह वैश्विक विशेषता संसाधन प्रतीक संपादन योग्य है।

संबंधित तरीके


2

संदर्भ मेनू को हटाने के लिए संपादित पाठ के onLongClick श्रोता को ओवरराइड करने का प्रयास करें:

EditText myTextField = (EditText)findViewById(R.id.my_edit_text_id);
myTextField.setOnLongClickListener(new OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        return true;
    }
});

3
मैंने android: editable = "false" और android: focusable = "false" का उपयोग किया है, फिर onLongclick को ओवरराइड किया और मुझे जो परिणाम चाहिए, वह मिला
JannGabriel

2

इस कोड का उपयोग करें:

editText.setEnabled(false);
editText.setTextColor(ContextCompat.getColor(context, R.color.black);

अक्षम करना editTextएक देता है केवल पढ़ने के रूप और व्यवहार पर भी बदल जाता है text-colorकी स्थापना अपने पाठ रंग की जरूरत है तो ग्रे।


कृपया कुछ स्पष्टीकरण भी जोड़ें।
ब्लैकबर्ड

1

यह मेरा कार्यान्वयन है (थोड़ा लंबा, लेकिन मेरे लिए उपयोगी है!): इस कोड से आप EditView Read-only या Normal बना सकते हैं। यहां तक ​​कि केवल-पढ़ने की स्थिति में, पाठ उपयोगकर्ता द्वारा कॉपी किया जा सकता है। आप सामान्य एडिट टेक्स्ट से अलग दिखने के लिए बैकग्राउड को बदल सकते हैं।

public static TextWatcher setReadOnly(final EditText edt, final boolean readOnlyState, TextWatcher remove) {
    edt.setCursorVisible(!readOnlyState);
    TextWatcher tw = null;
    final String text = edt.getText().toString();
    if (readOnlyState) {
            tw = new TextWatcher();

            @Override
            public void afterTextChanged(Editable s) {

            }
            @Override
            //saving the text before change
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            // and replace it with content if it is about to change
            public void onTextChanged(CharSequence s, int start,int before, int count) {
                edt.removeTextChangedListener(this);
                edt.setText(text);
                edt.addTextChangedListener(this);
            }
        };
        edt.addTextChangedListener(tw);
        return tw;
    } else {
        edt.removeTextChangedListener(remove);
        return remove;
    }
}

इस कोड का लाभ यह है कि, EditText को सामान्य EditText के रूप में प्रदर्शित किया जाता है, लेकिन सामग्री परिवर्तनशील नहीं है। रिटर्न वैल्यू को एक वैरिएबल के रूप में रखा जाना चाहिए जो रीड-ओनली स्टेट से सामान्य में वापस आ सके।

एक EditText को केवल पढ़ने के लिए, बस इसे इस प्रकार रखें:

TextWatcher tw = setReadOnly(editText, true, null);

और पिछले बयान से इसे सामान्य उपयोग ट्विस्ट बनाने के लिए:

setReadOnly(editText, false, tw);

1

यह मेरे लिए काम करता है, ऊपर दिए गए सुझावों में से कई को ध्यान में रखते हुए। TextEdit को फ़ोकस करने योग्य बनाता है, लेकिन यदि उपयोगकर्ता क्लिक या फ़ोकस करता है, तो हम पॉपअपविंडो में चयनों की एक सूची दिखाते हैं। (हम निराला स्पिनर विजेट की जगह ले रहे हैं)। TextEdit xml बहुत सामान्य है ...

public void onCreate(Bundle savedInstanceState) {
    ....  
    fEditState = (EditText) findViewById(R.id.state_edit);

    fEditState.setLongClickable(false);
    fEditState.setKeyListener(null);
    fEditState.setFocusable(true);

    fEditState.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus)
        {
            if (hasFocus)
            {
               showStatesPopup();

            }
        }
    });

    fEditState.setOnClickListener(new Button.OnClickListener(){

        public void onClick(View arg0)
        {
           showStatesPopup();
        }
    });
    ....
}

private void showStatesPopup()
{
    // fPopupWindowStates instantiated in OnCreate()

    if (!fPopupWindowStates.isShowing()) {
        // show the list view as dropdown
        fPopupWindowStates.showAsDropDown(fEditState, -5, 0);
    }
}  

1

यदि आप नियंत्रण से पाठ की प्रतिलिपि बनाना चाहते हैं, लेकिन इसे संपादित करने में सक्षम नहीं हैं, तो आप इसके बजाय एक TextView का उपयोग करना चाहते हैं और पाठ का चयन करना संभव है

कोड:

myTextView.setTextIsSelectable(true);
myTextView.setFocusable(true);
myTextView.setFocusableInTouchMode(true);
// myTextView.setSelectAllOnFocus(true);

xml:

<TextView
    android:textIsSelectable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"     
    ...
/>
<!--android:selectAllOnFocus="true"-->


SetTextIsSelectable का प्रलेखन कहता है:

जब आप इस विधि को textIsSelectable का मान सेट करने के लिए कहते हैं, तो यह फ़्लैग करने योग्य, फ़ोकस करने योग्यInTouchMode, क्लिक करने योग्य और समान मान के लिए longClickable सेट करता है ...

हालाँकि मुझे स्पष्ट रूप से फ़ोकस करने योग्य और फ़ोकस करने योग्य बनाया गया था। इन टच इनपुट के साथ काम करने के लिए ट्रूकोड को सही बनाना।


1

यह मेरे लिए एकमात्र पूर्ण सरल समाधान था।

editText.setEnabled(false);   // Prevents data entry
editText.setFocusable(false); // Prevents being able to tab to it from keyboard

0

मुझे EditTextPreference को रीड-ओनली बनाने में कोई समस्या नहीं थी, केवल उपयोग करके:

editTextPref.setSelectable(false);

रीड-ओनली फ़ील्ड्स (उदाहरण के लिए, खाता जानकारी प्रदर्शित करने के लिए उपयोगी) प्रदर्शित करने के लिए 'सारांश' फ़ील्ड का उपयोग करने पर युग्मित होने पर यह अच्छी तरह से काम करता है। Http://gmariotti.blogspot.com/2013/01/preferenceactivity-preferencefragment.html से डायनामिक रूप से सारांश फ़ील्ड अपडेट करना

private static final List<String> keyList;

static {
    keyList = new ArrayList<String>();
    keyList.add("field1");
    keyList.add("field2");
    keyList.add("field3");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
        initSummary(getPreferenceScreen().getPreference(i));
    }
}

private void initSummary(Preference p) {
    if (p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for (int i = 0; i < pCat.getPreferenceCount(); i++) {
            initSummary(pCat.getPreference(i));
        }
    } else {
        updatePrefSummary(p);
    }
}

private void updatePrefSummary(Preference p) {
    if (p instanceof ListPreference) {
        ListPreference listPref = (ListPreference) p;
        p.setSummary(listPref.getEntry());
    }
    if (p instanceof EditTextPreference) {
        EditTextPreference editTextPref = (EditTextPreference) p;
        //editTextPref.setEnabled(false); // this can be used to 'gray out' as well
        editTextPref.setSelectable(false);
        if (keyList.contains(p.getKey())) {
            p.setSummary(editTextPref.getText());
        }
    }
}

0

इसे EdiTextView xml फ़ाइल में सेट करें

android:focusable="false"

1
सवाल पूछता है कि इसे केवल-प्रोग्रामेटिक तरीके से कैसे बनाया जाए, एक्सएमएल में नहीं।
jk7

0

के रूप android:editable=""में पदावनत,

सेटिंग है

  • android:clickable="false"
  • android:focusable="false"
  • android:inputType="none"
  • android:cursorVisible="false"

इसे "केवल पढ़ने के लिए" बना देगा।

हालांकि, उपयोगकर्ता अभी भी फ़ील्ड में पेस्ट करने या किसी अन्य लंबी क्लिक क्रिया करने में सक्षम होंगे। इसे अक्षम करने के लिए, बस onLongClickListener () को ओवरराइड करें।
कोटलिन में:

  • myEditText.setOnLongClickListener { true }

पर्याप्त होता।


0

इसके लिए मेरा दृष्टिकोण एक कस्टम टेक्स्टवैकर वर्ग बना रहा है जो निम्नानुसार है:

class ReadOnlyTextWatcher implements TextWatcher {
    private final EditText textEdit;
    private String originalText;
    private boolean mustUndo = true;

    public ReadOnlyTextWatcher(EditText textEdit) {
        this.textEdit = textEdit;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        if (mustUndo) {
            originalText = charSequence.toString();
        }
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (mustUndo) {
            mustUndo = false;
            textEdit.setText(originalText);
        } else {
            mustUndo = true;
        }
    }
}

फिर आप केवल उस चौकीदार को किसी भी क्षेत्र में जोड़ सकते हैं जिसे आप सक्षम होने के बावजूद पढ़ना चाहते हैं:

editText.addTextChangedListener(new ReadOnlyTextWatcher(editText));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.