AndroidでXMLを介してEditTextを編集できないようにする方法は?


300

EditTextXML を使用して編集不可にする方法を教えてもらえますか?に設定android:editableしてみましたfalseが、

  1. 非推奨です。そして
  2. うまくいきませんでした。

6
編集できない場合、なぜEditTextが必要ですか?通常のTextViewを使用すれば十分でしょうか?そしてsetEditable()関数も非推奨ですか?
kiki

4
私にとっては、コンテンツの標準的なコピーペーストを有効にするためにこれは理にかなっています。TextViewでは不可能です(少なくともデフォルトの動作ではありません)
Ixx

1
訂正:それは悪い考えです。特定の状況で、ビューが編集可能になるか、コピーと貼り付けのオプションが表示されなくなります。他のアプローチを探します。
-Ixx

11
私の場合、一連の操作の実行中はEditTextを一時的に無効にし、操作が終了したら再度有効にします。
Joe Plante、2012

1
この質問は正当な懸念についてです。EditTextスタイルを保持し、スクロールを許可するにはUI.setReadOnly(myEditText, true)このライブラリから使用します。設定が必要なプロパティがいくつかあります。これらはソースコードで確認できます
2015年

回答:


399

次の簡単なコードを使用します。

textView.setKeyListener(null);

できます。

編集:KeyListener後で追加するには、次の操作を行います

1:キーリスナーをタグに設定します textView

textView.setTag(textView.getKeyListener());
textView.setKeyListener(null);

2:タグからキーリスナーを取得し、それを textView

textView.setKeyListener((KeyListener) textView.getTag());

30
@AnkitAwasthi textView.setTag(textView.getKeyListener()); 後でtextView.setKeyListener((KeyListener)textView.getTag())を使用して設定します。
Thomas Dignan

@TomDignan素晴らしい方法を簡単に!一つ質問があります。これは、何らかの方法でKeyListenerに必要なデフォルト値を変更しますか。たとえば、setFocusable()変更するとデフォルトの実装が変更される可能性があるとドキュメントが述べているためです。
アンディ

afaikいいえ、タグを使用できるようにする必要があります
Thomas

ちょっとウル提案はme..thanx助け
user1387035

38
問題はXMLを介して設定することでしたが、これがソリューションとしてマークされているのはなぜですか?
Denys Vitali

398

これをEditText xmlファイルに追加します。

<EditText ...
        android:clickable="false" 
        android:cursorVisible="false" 
        android:focusable="false" 
        android:focusableInTouchMode="false">
</EditText>

と同じ効果がありandroid:editable="false"ます。私のために働いた、それがあなたのためにも働くことを願っています。


3
notes.setKeyListener(null); notes.setClickable(false); notes.setCursorVisible(false); notes.setFocusable(false); notes.setFocusableInTouchMode(false);
Jack Franzen 2014

3
あなたがXMLでそれをしたいのであれば...それとTextViewの違いは何ですか???
Chris Sim、2014

11
違いはTextInputLayout
次のとおりです

2
これは、質問で要求された純粋なXMLソリューションであるため、ソリューションとしてマークする必要があります。
zgc7009 2016年

2
これは非推奨です(2018年10月)
Sebastian Paduano

54

Edittextを

EditText editText;

editText.setKeyListener(null);

動作しますが、キーを聞くだけではありません。

ユーザーはedittextにカーソルを表示できます。

あなたが試すことができます editText.setEnabled(false);

つまり、ユーザーはカーソルを見ることができません。簡単に言うとになりTextViewます。


3
EditTextはTextViewのサブクラスであるため、これは正しいです。ただし、textViewの代わりにeditTextを変数として使用してください。
Joe Plante、2012

@JoePlante建設的なコメントのおかげで変数名が変更されました。
Mahendran 2012

これはEditTextをグレー表示します
スティーブン

灰色のEditTextは、無効になっていて、ユーザーが編集できないことを示します。
Mahendran 2013

色を設定するだけでなく、灰色の外観を防ぎます。XML:android:textColor = "@ color / Black"を試すandroid:enabled = "false"
赤ワイン

32

他の回答で述べたように、あなたはそれを行うことができますsetEnabled(false) が、XMLを介してそれを設定する方法を尋ねているので、ここでそれを行う方法を説明します。

次の属性をに追加しますEditText

android:enabled="false"

4
OPの質問に対する正確な回答。
SMR 2015年

ただし、この方法は廃止されました
Lalit kumar

2
@Lalitkumar enabledは非推奨ではありません。editableです。
InsanityOnABun

7
有効にすると、クリックリスナーにもアクセスできなくなります。だから私にとっては答えではありません。
Naveed Ahmad

これはテキストを非表示にします:(
Chego

24

XMLから無効にする(1行):

 android:focusable="false"

必要に応じて、Javaから再度有効にします(これも1行です)。

editText.setFocusableInTouchMode(true);

いい答えだ。この方法でも、editText.setText( "your text")を使用してeditText値を設定できます。しかし、ユーザーはそれを編集できません。
Prakash、2016

17

「編集可能」を非推奨にしましたが、inputTypeで対応する機能を提供しませんでした。

ところで、inputType = "none"は効果がありますか?それを使用してもしなくても、私が見る限り、違いはありません。

たとえば、デフォルトのeditTextは1行と呼ばれます。ただし、それが単一行になるようにinputTypeを選択する必要があります。「なし」を選択しても、複数行のままです。


1
それは上の違いがありませんすべてのデバイスを、それはすべきで、ドキュメントによると:developer.android.com/reference/android/widget/...
CAW

12
Googleの混乱の美しい例
Yar

14

この組み合わせは私にとってうまくいきました:

<EditText ... >
    android:longClickable="false"
    android:cursorVisible="false"
    android:focusableInTouchMode="false"
</EditText>

13

あなたが言ったようにandroid:editableは非推奨です。代わりにandroid:inputType = "none"を使用する必要がありますが、バグのために機能しません(https://code.google.com/p/android/issues/detail?id=2854

ただし、focusableを使用して同じことを実現できます。

XML経由:

<EditText ...
        android:focusable="false" 
</EditText>

コードから:

((EditText) findViewById(R.id.LoginNameEditText)).setFocusable(false);

グーグルの厚意により、バグは2つの異なるシナリオに分類されます。1。)修正される予定ですが、6年後に2.)修正されることはなく、Androidの新しいバージョンを開発するだけです。
ネオンWarge

12

クリックしたいが編集したくない場合は、以下を試してください。

        android:focusable="false"


7
<EditText
    android:id="@+id/txtDate"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="2dp"
    android:clickable="false"
    android:cursorVisible="false"
    android:gravity="center" />

そして以下を使用してください:

txtDate.setKeyListener(null);

7

Javaコードで実行する場合は、次の行を使用して無効にします。

editText.setEnabled(false);

そしてこれを有効にする:

editText.setEnabled(true);

5

私がやろうとしました:

textView.setInputType( InputType.TYPE_NULL );

うまくいくはずですが、私にとってはうまくいきませんでした。

私はこのコードで終わりました:

textView.setKeyListener(new NumberKeyListener() {
    public int getInputType() {
        return InputType.TYPE_NULL;
    }

    protected char[] getAcceptedChars() {
        return new char[] {};
    }
});

完璧に動作します。


4

EditTextにフォーカスせず、クリックしたときにキーボードも表示しないようにしたい場合、これがうまくいきました。

メインレイアウトに属性を追加する

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

次にEditTextフィールド

android:focusable="false"
android:focusableInTouchMode="false"

次に例を示します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_home"
    android:background="@drawable/bg_landing"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    tools:context="com.woppi.woppi.samplelapp.HomeActivity">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:inputType="textPersonName"
        android:ems="10"
        android:id="@+id/fromEditText"
        android:layout_weight="1"
        android:hint="@string/placeholder_choose_language"
        android:textColor="@android:color/white"
        android:textColorHint="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onSelectFromLanguage" />

</RelativeLayout>

3

@mahe madiに加えて、これも試すことができます

editText.setEnabled(false);
editor.setTextColor(Color.BLACK);

このメソッドはカーソルを非表示にし、フォーカスを失い、さらに重要なことに、テキストの色をTextViewのように動作する黒に設定します。

EditTextに戻るには、これを実行してEditTextのすべてのプロパティを取得します。

editText.setEnabled(true);

それが役に立てば幸い :)


3

使用することもできますandroid:editable="false"setEnabled(false)、コントロールを編集できないというユーザーへの視覚的な手掛かりを提供するため、使用することをお勧めします。無効になっているすべてのウィジェットで同じビジュアルキューが使用され、一貫性は良好です。


3
android:focusable="false"

android:clickable="false"

android:longClickable="false"

「longClickable」属性は、「貼り付け」または「すべて選択」オプションをツールチップとして表示させる長押しアクションを無効にします。


2

私は以下を試しました:

codeEditText.setInputType(InputType.TYPE_NULL);

this.codeEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

  @Override
  public void onFocusChange(View v, boolean hasFocus) {

    if (hasFocus) {

      pickCode();

    }

  }

});
this.codeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickCode();

  }

});

しかし問題は、エディットテキストがフォームの最初の場合、フォーカスが取得され、新しいアクティビティを起動するpickCode()コードがすぐに呼び出されることでした。だから私は次のようにコードを変更し、それはかなりうまくいくようです(テキスト編集にフォーカスを設定することはできませんが、必要はありません):

itemCodeEditText.setFocusable(false);

this.itemCodeEditText.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {

    pickItem();

  }

});

宜しくお願いします、

コメント歓迎、

ジョン・ゴッシュ


1
正常に動作しているようですが、EditTextのように見えるTextViewを使用する方が簡単ではありませんか(style = "@ android:style / Widget.EditText"を使用)。
Android開発者

2

EditText.setFocusable(false)編集したい場合は、使用して再度trueに設定します。



2

この方法でうまくいきました。選択してクリップボードにコピーできますが、変更したり貼り付けたりすることはできません。

android:enable="true"
android:textIsSelectable="true"
android:inputType="none"

1

android:editableは非推奨であるため、代わりにinputTypeを使用してください

   <EditText
        android:id="@+id/editText_x"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="70"
        android:inputType="none"
        android:hint="@string/enter_x" />

android:inputType = "none"はandroid:editableとは大きく異なりますので、自分で試してみてください!
Denys Vitali

EditTextを編集不可にする場合は、EditTextの代わりにTextViewウィジェットを使用することをお勧めします。その場合、EditTextを使用しても意味がないように見えるためです。
M-Razavi 2016

あなたの提案は、PopupWindowのあるEditTextには適用されません。問題をよりよく理解するには、この画像を参照してください。この例ではEditTextの外観が必要ですが、ポップアップウィンドウだけでユーザーが値を変更できるように「ロックする」必要があります。この問題チェックして、より多くの動機を確認してください。それは2009
。– Denys Vitali

1

同じ問題に直面しましたが、観察後android:editable="false"、inputtext(android:inputType="ANY_VALUE")がEdittextで指定されていない場合にのみ機能することがわかりました。

EditTextからinputTypeを削除し、editable = falseを使用してください。


0

ダイアログでこれを解決します。

    AlertDialog dialog;
    EditText _editID;
    TextView _txtID;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
        _txtID = (TextView) findViewById(R.id._txtID);
        dialog = new AlertDialog.Builder(this).create();
        _editID = new EditText(this);
        _editID.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);
        dialog.setTitle("Numero do Registro:");
        dialog.setView(_editID);
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, "IR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                _txtID.setText(_editID.getText());
                toId(Integer.parseInt((_editID.getText().toString())));
            }
        });
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCELAR", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        _txtID.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _txtID.setText("_editID.getText()");
                //_editID.setText("");
                dialog.show();

            }
        });



-10

このコードを試してください。それは私のプロジェクトで機能しているので、あなたのプロジェクトでも機能します。

android:editable="false"

2
これが機能しないことを確認でき、さらに減価償却方法の使用は推奨されません。
Adorjan Princz 2013年

1
android:editableは、フィールドをクリック可能にしたいが編集不可にしたい場合、つまりフィールドをクリックした後にダイアログを開く場合に、実際に最適なソリューションです。
2015

それはあなたのプロジェクトで機能するからではありません。非常に貧しい思考。
ネオンWarge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.