Як зробити так, щоб текст редагування не редагувався, а натискав у JAVA


91

Чи можна зробити EditTextінтерактивним, але не редагованим.

Я не хочу, щоб його можна було редагувати (ні клавіатура не повинна підходити, ні ми повинні мати можливість змінити підказку)

Насправді я хочу використовувати Редагувати текст просто як зображення з підказкою (яке не можна змінити). Я знаю, що насправді потрібно було використовувати ImageViewі один TextView, але я хочу, щоб спробувати, EditTextтому що тоді я буду використовувати лише одне представлення замість 2. Також кожна річ динамічна, тому немає XML.

Для вищевказаної вимоги рішення в XML є, android:editable="false"але я хочу використовувати це в Java.

Але,

Якщо я використовую: -

et.setEnabled(false);

або

 et.setKeyListener(null);

Це робить EditTextнередагованим, але в той же час робить його не клікабельним.


Як щодо налаштування et.setClickable(true)? Це може спрацювати.
Хайн,

вже пробував .... але не працював ... будь-які інші думки
Аамір Шах

1
можливо, спробувати використати відносний макет і покласти порожній прямокутник чи щось інше НА ПОВЕРХ редагувального тексту, і спробувати клікабельну річ у
прямому напрямку

Відповіді:


168

Фокус тут: -

et.setFocusable(false);
et.setClickable(true);

5
але якщо ви скопіювали якесь значення з будь-якого поля, ви можете вставити це значення почути, натиснувши lang tap and paste .. будь-яка ідея, як видалити
Rishabh Agrawal

11
@ANinJa ви можете встановити значення long clickkable на false, тобто et.setLongClickable (false);
Луїс,

Хм, курсор виділяється дивним чином при натисканні / довгому клацанні ... Але кращого підходу у мене немає. : /
Мартін Пфеффер

1
Ідеально! можливо, вам доведеться додати et.setLongClickable (false), щоб також уникнути копіювання / вставки
thanhbinh84

1
Ідеально, ти лікар?
Іман

22

Ви можете встановити EditText, використовуючи код Java як наступний: -

edittext.setFocusable(false);
edittext.setClickable(true);

або за допомогою наведеного нижче коду у файлі XML для EditText.

android:editable="false" 
android:inputType="none"  

22

Як editableзастаріло. ви можете використовувати android:inputTypeяк жоден при розробці xml або як InputType.TYPE_NULL у кодуванні.

Розробка XML

<android.support.v7.widget.AppCompatEditText
    android:id="@+id/edt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:focusable="false"
    android:inputType="none"
    android:text="EditText"/>

Кодування

edt.setClickable(true);
edt.setFocusable(false);
edt.setInputType(InputType.TYPE_NULL);

А нижче - подія натискання edittext

edt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(YourActivity.this,"edt click", Toast.LENGTH_LONG).show();
    }
});

Для мене це
спрацювало

8

Ви можете використовувати це ..

android:focusableInTouchMode="false"

щоб зробити edittext неможливим для редагування в xml. А для події, яка можна натиснути, ви можете використовувати подію setOnTouchListener (), щоб зробити те саме, що і як

editText.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
                        //do your stuff here..
        return false;
    }
});

1
Схоже, android:focusableInTouchMode="false"це також потрібно ( android:focusable="false"окремо не працює) в Android O. Принаймні, у DP2.
xip

7

android:editable застаріло, але ви можете зробити stg, як показано нижче:

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

Я використав вищезазначений код для редагування текстів, в яких я використовую інструменти вибору для встановлення даних. Ви можете використовувати макет вводу з цим.


7

Edittext увімкнути та вимкнути для редагування таким чином

EditText edit = (EditText) findviewby(R.id.edittext);

Через Java-код

edit.setEnabled(false); //non editable
edit.setEnabled(true); //editable

Через xml

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

0

Для мене жодна з відповідей не дала повністю робочого рішення.

Вітрина мого виправлення https://www.youtube.com/watch?v=oUA4Cuxfdqc

Посібник (зручний для користувачів) , зверніть увагу на кілька коментарів у коді.

Створіть клас Java для користувацького EditTextпід назвою EditTextDispatched.java

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;

/**
 * @author Martin Pfeffer
 * @see <a href="https://celox.io">https://celox.io</a>
 */
public class EditTextDispatched extends android.support.v7.widget.AppCompatEditText {

    private static final String TAG = "DispatchingEditText";

    private boolean editable = true;

    public EditTextDispatched(Context context) {
        super(context);
    }

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

    public EditTextDispatched(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    // get the current state
    public boolean isEditable() {
        return editable;
    }

    // set your desired behaviour
    public void setEditable(boolean editable) {
        this.editable = editable;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent motionEvent) {

        if (editable) {
            // default behaviour of an EditText
            super.dispatchTouchEvent(motionEvent);
            return true;
        }

        // achieve the click-behaviour of a TextView (it's cuztom)
        ((RelativeLayout) getParent()).onTouchEvent(motionEvent);
        return true;
    }

}

Посилання на EditTextDispatchedваш xml (вам доведеться змінити ім'я pgk):

  <io.celox.brutus.EditTextDispatched
    android:id="@+id/row_field_value"
    style="@style/row_field_text_display"
    android:layout_alignParentBottom="true"
    android:text="@string/sample_field_value" />

Щоб викликати:

private void changeEditTextBehaviour(EditTextDispatched value, boolean editable) {
    value.setEditable(editable);
    value.setEnabled(editable);
}


0

Я знаю, що на це питання вже відповіли, але, щоб дати більш актуальну (тобто 2018) відповідь, ось установка, яку я використовую для досягнення запитуваного (тобто не введеного чи редагованого) ефекту:

    val etUserLoc: EditText = themedEditText(R.style.Pale_Blue_Text_Bold_13) {
                id = R.id.et_comp_user_keys_var_user_location
                inputType = InputType.TYPE_NULL
                isClickable = true
                isFocusable = false
                textColor = resources.getColor(R.color.magenta)  // overrides the default theme color
                text = Editable.Factory.getInstance().newEditable(resources.getString(R.string.loc_swakopmund))
            }.lparams(width = matchConstraint, height = matchParent) {   }

Так, це ANKO, оскільки я більше не використовую XML у жодному зі своїх проектів Android. 'InputType' піклується про застаріння 'isEditable'.


0

Починаючи з 2020 року, якщо ви також дбаєте про доступність, вам слід уникати налаштування, et.setFocusable(false);оскільки це зробить EditText недоступним за допомогою навігації за допомогою клавіатури.

Ось моє рішення:

Котлін

editText.isFocusableInTouchMode = false

editText.isLongClickable = false //this will prevent copy and paste

editText.setOnClickListener {
   // handle the click
   // this will automatically make the edittext clickable = true
}

-1

Ви також можете зробити android:inputMethod="@null"у своєму, EditTextі він не відображатиме курсор або клавіатуру, і тоді ви зможете легко схопити клацання через налаштування прослуховувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.