EditTextを読み取り専用にする


119

読み取り専用のEditTextビューを作成したい。このコードを実行するXMLはのようですが、コードで実行しandroid:editable="false"たいと思います。

これどうやってするの?



3
android:editableは非推奨となっていることにも注意してくださいEditText
デレクW

これを行う最も信頼できる方法はUI.setReadOnly(myEditText, true)このライブラリから使用することです。設定が必要なプロパティがいくつかあります。これらはソースコードで確認できます
2015年

3
はいデレクは正しいです。今、XMLで使用する必要がandroid:inputType="none"ありますandroid:textIsSelectable="true"
Atul

回答:


135

このコードを使用してください。

Edittext.setEnabled(false);

34
これにより、読み取り専用に設定されるだけでなく、スクロールとコピーも無効になります:-(
josef

1
これは無効になります。特に複数行のEditTextには役に立たない。
Atul

これを試してみましたが値が失われましたか?
fdurmus77

97

あなたは場合はsetEnabled(false)、あなたのeditText(など、灰色)無効になります。エディターの視覚的な側面を変更したくない場合があります。

より煩わしくない方法は、を使用することsetFocusable(false)です。

私はこれがあなたの最初の意図に近い質問に答えると信じています。


8
これは良いことですが、ユーザーはテキストフィールドに「貼り付け」できます。
xtrem 2013年

14
これは私にとってはうまくいきました。setEnabled(false)を使用できないようにクリック可能にする必要がありました。貼り付け可能な問題を回避するために、私はandroid:longClickable = "false"を実行しました
dt0

3
あなたが使用している場合はsetFocusable(false)(とさえsetFocusableInTouchMode(false)してsetClickable(false))あなたはまだあなたがの値を変更することができeditText、あなたの押しeditTextのために数百ミリ秒をし、選択Pasteしない限り、オプションをシステムクリップボードが空です。私は23である最新の利用可能なAPIでそれをテストしました。
patryk.beza

これは機能し、スクロールしてカーソルを表示できません。
live-love

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属性は非推奨ではないようです(少なくとも、APIレベル23以降)。
グレッグブラウン

8
@MichelJungは正しいです。使用する必要がありますandroid:inputType="none"
Ata Iravani '25

1
質問は、XMLではなくJavaコードを介して編集可能falseにする方法を求めています!
saeed khalafinejad 2017年

7
私は試しandroid:inputType="none"ていますが、データはまだ編集可能です。
BlueMonkMN 2017

24

これは私にとってはうまくいきます:

EditText.setKeyListener(null);

5
これは良かったのですが、ユーザーはフィールドに「貼り付ける」ことができます。これはハックのように見えますが、とにかく高く評価します。彼らにsetEditable()APIがあればいいのに。
xtrem 2013年

15

TextView代わりに使用するのが最善です。


8
彼のアプリフローによると、編集可能にする必要がある場合とそうでない場合があります
Muhammed Refaat

15
editText.setInputType(InputType.TYPE_NULL);

ドキュメントに従ってこれはソフトキーボードが表示されるのを防ぎます。また、貼り付けを防止し、スクロールを許可し、ビューの視覚的側面を変更しません。ただし、これにより、ビュー内のテキストの選択とコピーもできなくなります。

私のテストから、setInputTypeへの設定TYPE_NULLは、機能的には減価償却と同等のようandroid:editable="false"です。また、android:inputType="none"目立った影響はないようです。


これは今のところ機能し、あなたが言ったようにandroid:inputType="none"機能しなくなりました。
Goke Obasa 2017年

1
残念ながら、仮想キーボードが既に開いている場合(つまり、ユーザーが最初に編集可能なフィールドをタップし、次にこのフィールドをタップした場合、仮想キーボードは閉じません)、フィールドへの入力を妨げることはありません。また、外部キーボードからフィールドに入力することを妨げません。
jk7

11

android:editable = "false"は非推奨になりました。したがって、これを使用して編集テキストを読み取り専用にすることはできません。

私は以下のソリューションを使用してこれを行いました。ここで私は使用しました

android:inputType = "none"

android:textIsSelectable = "true"

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

これは実際には読み取り専用ではなく、値をこのコードの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) : "";
    }
} });

これにより、編集できないEditTextフィルターが作成されます。まず、必要なテキストをeditTextフィールドに入力してから、このフィルターを適用する必要があります。


2
優れたソリューションであり、TextWatcherよりもコード行が少ない。これにより、ユーザーはテキストを選択してコピーできますが、入力、CUT、PASTEによるテキストの変更はできません。returnステートメントは単純化することができますreturn dst.subSequence(dstart, dend);
jk7 '27 / 10/27

私の以前のコメントは、EditTextフィールドを無効にせずにsetFilters()ステートメントだけを参照していました。
jk7

おかげで、これは私のために働く唯一の解決策です!機能しているものの価値が下がり、まだ機能していないもの(inputType = "none")と、不要な副作用(複数行の入力)に置き換えられたのはイライラしています。@ jk7によって提案された変更は重要です。元のreturnステートメントでは、元のテキストの一部を選択して何かを入力すると、選択したテキストがフィルターによって返された空の文字列に置き換えられるためです。この場合、srcの長さがゼロではなく、空の文字列が有効です。
Paul L



3

使ってみてください

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

これにより、キーボードからタブを
押す

3
android:editable

設定されている場合、これTextViewに入力メソッドがあることを指定します。特に指定のない限り、テキスト形式です。の場合TextView、これはデフォルトでfalseです。の場合EditText、デフォルトではtrueです。

またはの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灰色に変わるため、テキストの色を設定する必要があります。


説明も追加してください。
BlackBeard 2018年

1

これは私の実装です(少し長いですが、私にとっては便利です!):このコードを使用すると、EditViewを読み取り専用または通常にできます。読み取り専用の状態でも、ユーザーはテキストをコピーできます。バックグラウンドを変更して、通常のEditTextとは異なる外観にすることができます。

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

そしてそれを通常のようにするために前のステートメントからtwを使います:

setReadOnly(editText, false, tw);

1

これは、上記の提案のいくつかを考慮に入れてうまくいきました。TextEditをフォーカス可能にしますが、ユーザーがクリックまたはフォーカスすると、選択のリストをPopupWindowに表示します。(奇抜なSpinnerウィジェットを置き換えます)。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の値を設定すると、focusable、focusableInTouchMode、clickable、およびlongClickableの各フラグに同じ値が設定されます...

ただし、タッチ入力で機能させるには、focusableおよびfocusableInTouchModeを明示的にtrueに設定する必要がありました。


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

android:editable=""推奨されていません、

設定

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

「読み取り専用」にします。

ただし、ユーザーはフィールドに貼り付けたり、他の長押しアクションを実行したりできます。これを無効にするには、単にonLongClickListener()をオーバーライドします。
コトリンでは:

  • myEditText.setOnLongClickListener { true }

十分です。


0

これに対する私のアプローチは、次のようにカスタムTextWatcherクラスを作成しています。

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.