শুধুমাত্র সম্পাদনা পাঠ্য পাঠ্য করুন


119

আমি কেবল পঠনযোগ্য EditTextদর্শন করতে চাই । এই কোডটি করার জন্য এক্সএমএল মনে হচ্ছে android:editable="false", তবে আমি কোডে এটি করতে চাই।

কিভাবে আমি এটি করতে পারব?



3
এটিও মূল্যবান যে এটির জন্য android:editableঅবমূল্যায়িত EditText
ডেরেক ডব্লিউ

এটি করার সবচেয়ে নির্ভরযোগ্য উপায় হ'ল এই গ্রন্থাগারটিUI.setReadOnly(myEditText, true) থেকে । কয়েকটি বৈশিষ্ট্য সেট করতে হবে যা আপনি উত্স কোডে পরীক্ষা করে দেখতে পারেন ।
কাবা

3
হ্যাঁ ডেরেক ঠিক বলেছেন। এখন এক্সএমএল এ আপনার ব্যবহার করা উচিত android:inputType="none"এবংandroid:textIsSelectable="true"
অতুল

উত্তর:


135

দয়া করে এই কোডটি ব্যবহার করুন ..

Edittext.setEnabled(false);

34
এটি কেবল 'পঠনযোগ্য' কেবলমাত্র পড়বে না তবে স্ক্রোলিং এবং অনুলিপিও অক্ষম করবে :-(
জোসেফ ২

1
এটি অক্ষম করে। বিশেষত মাল্টলাইন এডিটেক্সট-এর জন্য অকেজো।
অতুল

এই চেষ্টা কিন্তু হারানো মান?
fdurmus77

97

আপনি যদি setEnabled(false)তখন editTextঅক্ষম হন (ধূসর, ইত্যাদি)। আপনি আপনার সম্পাদকের চাক্ষুষ দিকটি পরিবর্তন করতে নাও পারেন।

একটি কম অনুপ্রেরণামূলক উপায় ব্যবহার করা হবে setFocusable(false)

আমি বিশ্বাস করি যে এটি আপনার প্রশ্নের উত্তরটিকে আপনার প্রাথমিক উদ্দেশ্যটির আরও কাছাকাছি উত্তর দেয়।


8
এটি ভাল, তবে ব্যবহারকারী এখনও পাঠ্য ক্ষেত্রে "পেস্ট" করতে পারেন।
xtrem

14
এটি আমার জন্য কাজ করে মহান। আমার এটিকে ক্লিকযোগ্য হওয়ার দরকার ছিল তাই আমি সেট-ইনেবল (ভুয়া) ব্যবহার করতে পারিনি। পেস্ট-সক্ষম ইস্যুটি পেতে, আমি কেবল অ্যান্ড্রয়েড করেছি: দীর্ঘ ক্লিকযোগ্য = "মিথ্যা"
dt0

3
যদি আপনি ব্যবহার করেন setFocusable(false)(এবং এমনকি setFocusableInTouchMode(false)সহ setClickable(false)) আপনি এখনও কয়েকশ মিলি সেকেন্ডের জন্য আপনার editTextচাপ দেওয়ার মান পরিবর্তন করতে পারেন এবং সিস্টেম ক্লিপবোর্ড খালি না হলে বিকল্প নির্বাচন করতে পারেন । আমি এটি 23 টির মধ্যে নতুন উপলব্ধ এপিআই দিয়ে পরীক্ষা করেছি । editTextPaste
patryk.beza 31'16

এটি কাজ করে, আমি স্ক্রোল করতে সক্ষম হয়েছি এবং কার্সারটি দেখতে পাচ্ছি না।
লাইভ-

28

ইন XMLব্যবহার:

android:editable="false"

উদাহরণ হিসাবে:

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

জাভাডোকের মতে , editableএ্যাট্রিবিউটটি অবচয় বলে মনে হচ্ছে না (কমপক্ষে, এপিআই স্তর 23 হিসাবে নয়)।
গ্রেগ ব্রাউন

8
@ মিশেলজং ঠিক আছে আপনার অবশ্যই ব্যবহার করতে হবেandroid:inputType="none"
আতা ইরাভানী

1
প্রশ্নটি XML নয় জাভা কোডের মাধ্যমে সম্পাদনযোগ্যকে মিথ্যা বানানোর উপায় চায়!
সাeedদ খালাফিনেজাদ

7
আমি চেষ্টা করছি android:inputType="none"এবং ডেটা এখনও সম্পাদনযোগ্য।
ব্লুমোনকএমএন

24

এটি আমার পক্ষে কাজ করে:

EditText.setKeyListener(null);

5
এটি ভাল হত, তবে ব্যবহারকারী এখনও ক্ষেত্রে "পেস্ট" করতে পারেন can থাম্ব আপ যাইহোক, যদিও এটি হ্যাকের মতো দেখাচ্ছে। আমি চাই তাদের একটি সেটডেটেবল () এপিআই থাকুক।
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

অ্যান্ড্রয়েড: সম্পাদনাযোগ্য = "মিথ্যা" হ্রাস করা হয়েছে। অতএব আপনি সম্পাদনা পাঠ্যটি কেবল পঠন করতে এটি ব্যবহার করতে পারবেন না।

আমি বেলো সলিউশনটি ব্যবহার করে এটি করেছি। এখানে আমি ব্যবহার করেছি

অ্যান্ড্রয়েড ইনপুট = "কিছুই না"

অ্যান্ড্রয়েড textIsSelectable = "সত্য"

অ্যান্ড্রয়েড focusable = "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"/>

এটি সত্যই পঠনযোগ্য নয়, আপনি এখনও এই কোডটিতে এডিটেক্সট করতে মানগুলি আটকে দিতে পারেন। 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) : "";
    }
} });

এটি আপনাকে অখাদ্য সম্পাদনা পাঠ্য ফিল্টার দেবে। আপনাকে প্রথমে আপনার সম্পাদনা পাঠ্য ক্ষেত্রটিতে পাঠ্য লাগাতে হবে এবং তারপরে এই ফিল্টারটি প্রয়োগ করতে হবে।


2
একটি ভাল সমাধান এবং পাঠ্য ওয়াচচারের চেয়ে কোডের কম লাইন। এটি ব্যবহারকারীর পাঠ্য নির্বাচন করতে এবং অনুলিপি করতে সক্ষম করে তবে টাইপ করে বা পাঠা বা আবদ্ধ করে পাঠ্য পরিবর্তন করতে পারে না। রিটার্নের বিবৃতিটি কেবল সরল করা যায়return dst.subSequence(dstart, dend);
jk7

আমার আগের মন্তব্যটি সম্পাদনা পাঠ্য ক্ষেত্রটি অক্ষম না করে কেবল সেটফিল্টার () বিবৃতি উল্লেখ করছে।
jk7

ধন্যবাদ, এটিই আমার জন্য কার্যকর সমাধান! হতাশাজনক যে কোনও কিছুকে কাজের অবমূল্যায়ন করা হয়েছিল এবং এমন কিছু (ইনপুটটাইপ = "কিছুই নয়") যা এখনও কাজ করছে না এবং অযাচিত পার্শ্ব-প্রতিক্রিয়া (মাল্টি-লাইন ইনপুট) দিয়ে প্রতিস্থাপিত হয়েছে। দয়া করে নোট করুন @ jk7 এর প্রস্তাবিত পরিবর্তনটি অত্যাবশ্যক, কারণ মূল রিটার্ন স্টেটমেন্টের সাহায্যে আপনি যদি আপনার মূল পাঠ্যের কিছু অংশ নির্বাচন করেন এবং কিছু টাইপ করেন তবে আপনি নির্বাচিত পাঠ্যটি ফিল্টার দ্বারা ফিরে আসা খালি স্ট্রিংয়ের পরিবর্তে শেষ করবেন। এই ক্ষেত্রে এসআরসি দৈর্ঘ্য শূন্য নয়, এবং খালি স্ট্রিংটি কার্যকর হচ্ছে।
পল এল

6

আপনার কাজের জন্য এই দুটি লাইনটি লেখার পক্ষে যথেষ্ট।

yourEditText.setKeyListener(null); 
yourEditText.setEnabled(false);

শ্রোতাদের এটি নিষ্ক্রিয় করার চেয়ে অনেক বেশি সহায়ক সেটকে স্থির করে দেয়।
হাম্বার্তো কাস্তেয়েদা


3

ব্যবহার করার চেষ্টা করুন

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

এটি এখনও এটি কীবোর্ড থেকে ট্যাব হিট করে ফোকাসযোগ্য হতে অনুমতি দেয়
অ্যালানকলে

3
android:editable

যদি সেট করা থাকে তবে উল্লেখ করুন যে TextViewএটির একটি ইনপুট পদ্ধতি রয়েছে। এটি অন্যথায় সুনির্দিষ্ট না করা থাকলে এটি পাঠ্যসূচী হবে। কারণ TextViewএটি ডিফল্টরূপে মিথ্যা। কারণ EditTextএটি ডিফল্টরূপে সত্য।

একটি হওয়া আবশ্যক booleanমান, নয়তো trueবা false

এটি কোনও সংস্থার (আকারে @[package:]type:name) বা থিমের অ্যাট্রিবিউটের (আকারে ?[package:][type:]name) এই ধরণের মান সহ একটি রেফারেন্সও হতে পারে ।

এটি গ্লোবাল অ্যাট্রিবিউট রিসোর্স প্রতীক সম্পাদনযোগ্য to

সম্পর্কিত পদ্ধতি


2

প্রসঙ্গ মেনু অপসারণ করতে সম্পাদনা পাঠ্যের অন লং ক্লিক শ্রোতাকে ওভাররাইড করার চেষ্টা করুন:

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

3
আমি অ্যান্ড্রয়েড ব্যবহার করেছি: সম্পাদনাযোগ্য = "মিথ্যা" এবং অ্যান্ড্রয়েড: ফোকাসযোগ্য = "মিথ্যা", তারপরে লংক্লিককে ওভাররাইড করেছিলাম এবং আমার যে ফলাফলটি চেয়েছিল তা পেয়েছে
জান্ন গ্যাব্রিয়েল

2

এই কোডটি ব্যবহার করুন:

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

অক্ষম করা হচ্ছে editTextএকটি দেয় শুধুমাত্র পাঠযোগ্য চেহারা এবং আচরণের কিন্তু পরিবর্তন text-colorসেটিং তার পাঠ্য রঙ প্রয়োজন হয়, যাতে ধূসর।


দয়া করে কিছু ব্যাখ্যাও যুক্ত করুন।
ব্ল্যাকবিয়ার্ড

1

এটি আমার বাস্তবায়ন (কিছুটা দীর্ঘ তবে আমার পক্ষে দরকারী!): এই কোডের সাহায্যে আপনি এডিটভিউ পঠনযোগ্য বা সাধারণ করতে পারেন। এমনকি কেবল পঠনযোগ্য অবস্থায়, পাঠ্যটি ব্যবহারকারীর দ্বারা অনুলিপি করা যায়। আপনি ব্যাকগ্রাউডটিকে একটি সাধারণ এডিটেক্সট থেকে আলাদা দেখানোর জন্য পরিবর্তন করতে পারেন।

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

এই কোডটির সুবিধা হ'ল এডিট টেক্সটটি সাধারণ এডিটেক্সট হিসাবে প্রদর্শিত হয় তবে সামগ্রীটি পরিবর্তনযোগ্য নয়। রিটার্নের মানটি একটি পরিবর্তনশীল হিসাবে রাখা উচিত যার মধ্যে কেবলমাত্র পঠনযোগ্য রাষ্ট্র থেকে সাধারণ অবস্থায় ফিরে যেতে সক্ষম হয়।

এডিটেক্সটকে কেবল পঠনযোগ্য করে তুলতে, কেবল এটির মতো রাখুন:

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

এবং এটিকে আগের বিবৃতি থেকে সাধারণ ব্যবহার করতে:

setReadOnly(editText, false, tw);

1

এটি আমার পক্ষে কাজ করেছিল, উপরের বেশ কয়েকটি পরামর্শ আমলে নিয়েছিল। পাঠ্য সম্পাদনাটিকে ফোকাসযোগ্য করে তোলে তবে ব্যবহারকারী যদি ক্লিক করে বা ফোকাস করে তবে আমরা পপআপ উইন্ডোতে নির্বাচনের তালিকা প্রদর্শন করি show (আমরা ওয়াকি স্পিনার উইজেট প্রতিস্থাপন করছি)। টেক্সটএডিট এক্সএমএল খুব সাধারণ ...

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


সেটটেক্সটসিলিটেবলের ডকুমেন্টেশনটি বলে:

আপনি যখন পাঠ্য আইসিসিলেটেবলের মান সেট করার জন্য এই পদ্ধতিটি কল করেন তখন এটি ফ্ল্যাগকে ফোকাসযোগ্য, ফোকাসেবল ইনটচমোড, ক্লিকযোগ্য এবং দীর্ঘ ক্লিকেবল একই মানটিতে সেট করে ...

তবে এটিকে স্পর্শ ইনপুট দিয়ে কাজ করার জন্য আমাকে স্পষ্টতই ফোকাসযোগ্য এবং ফোকাসযোগ্য ইনটচমড সেট করতে হয়েছিল।


1

এটি ছিল আমার জন্য একমাত্র সম্পূর্ণ সহজ সমাধান।

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

0

এডিটটেক্সটপ্রেফারেন্স কেবল পঠনযোগ্য, ব্যবহার করে আমার কোনও সমস্যা হয়নি:

editTextPref.setSelectable(false);

কেবলমাত্র পঠনযোগ্য ক্ষেত্রগুলি প্রদর্শনের জন্য 'সংক্ষিপ্তসার' ক্ষেত্রটি ব্যবহারের সাথে মিল রেখে এটি ভাল কাজ করে (উদাহরণস্বরূপ অ্যাকাউন্টের তথ্য প্রদর্শনের জন্য দরকারী)। Http://gmariotti.blogspot.com/2013/01/preferencesactivity-preferencesfraament.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

এডিটেক্সটভিউ এক্সএমএল ফাইলে এটি সেট করুন

android:focusable="false"

1
এক্সএমএলে নয়, প্রোগ্রামিয়ালি এটি কীভাবে কেবল পঠনযোগ্য তা প্রশ্ন জিজ্ঞাসা করে।
jk7

0

android:editable=""যেমন অবচয় হিসাবে

সেট করা হচ্ছে

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

এটি "কেবল পঠনযোগ্য" করে দেবে।

তবে, ব্যবহারকারীরা এখনও মাঠে পেস্ট করতে বা অন্য যে কোনও দীর্ঘ ক্লিক ক্রিয়াকলাপ করতে সক্ষম হবেন। এটি অক্ষম করতে, কেবলমাত্র লংক্লিকলিস্টার () এ ওভাররাইড করুন।
কোটলিনে:

  • 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));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.