Подтвердить что ты не робот

Отключить клавиатуру на EditText

Я делаю калькулятор. Поэтому я сделал свой собственный Buttons с числами и функциями. Выражение, которое должно быть вычислено, находится в EditText, потому что я хочу, чтобы пользователи могли добавлять числа или функции также в середине выражения, поэтому с EditText у меня есть cursor. Но я хочу отключить Keyboard, когда пользователи нажимают на EditText. Я нашел этот пример, что он подходит для Android 2.3, но с ICS отключить Keyboard, а также курсор.

public class NoImeEditText extends EditText {

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

   @Override      
   public boolean onCheckIsTextEditor() {   
       return false;     
   }         
}

И затем я использую этот NoImeEditText в моем XML файле

<com.my.package.NoImeEditText
      android:id="@+id/etMy"
 ....  
/>

Как я могу совместить этот EditText с ICS??? Спасибо.

4b9b3361

Ответ 1

Вот сайт, который даст вам то, что вам нужно

В качестве резюме, он предоставляет ссылки на InputMethodManager и View от разработчиков Android. Он будет ссылаться на getWindowToken внутри View и hideSoftInputFromWindow() для InputMethodManager

Лучший ответ дан в ссылке, надеюсь, это поможет.

Вот пример использования события onTouch:

editText_input_field.setOnTouchListener(otl);

private OnTouchListener otl = new OnTouchListener() {
  public boolean onTouch (View v, MotionEvent event) {
        return true; // the listener has consumed the event
  }
};

Вот еще один пример с того же сайта. Это утверждает, что работает, но кажется плохой идеей, так как ваш EditBox равен NULL, он больше не будет редактором:

MyEditor.setOnTouchListener(new OnTouchListener(){

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    int inType = MyEditor.getInputType(); // backup the input type
    MyEditor.setInputType(InputType.TYPE_NULL); // disable soft input
    MyEditor.onTouchEvent(event); // call native handler
    MyEditor.setInputType(inType); // restore input type
    return true; // consume touch even
  }
});

Надеюсь, что это указывает вам в правильном направлении

Ответ 2

Ниже приведен код для API >= 11 и API < 11. Курсор по-прежнему доступен.

/**
 * Disable soft keyboard from appearing, use in conjunction with android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
 * @param editText
 */
public static void disableSoftInputFromAppearing(EditText editText) {
    if (Build.VERSION.SDK_INT >= 11) {
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);
    } else {
        editText.setRawInputType(InputType.TYPE_NULL);
        editText.setFocusable(true);
    }
}

Ответ 3

попробуйте: android:editable="false" или android:inputType="none"

Ответ 4

Вы также можете использовать setShowSoftInputOnFocus(boolean) непосредственно в API 21+ или через отражение в API 14 +:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    editText.setShowSoftInputOnFocus(false);
} else {
    try {
        final Method method = EditText.class.getMethod(
                "setShowSoftInputOnFocus"
                , new Class[]{boolean.class});
        method.setAccessible(true);
        method.invoke(editText, false);
    } catch (Exception e) {
        // ignore
    }
}

Ответ 5

Отключите клавиатуру (API 11 до текущей)

Это лучший ответ, который я нашел до сих пор, чтобы отключить клавиатуру (и я видел много их).

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
    editText.setShowSoftInputOnFocus(false);
} else { // API 11-20
    editText.setTextIsSelectable(true);
}

Нет необходимости использовать отражение или установить для параметра InputType значение null.

Включить клавиатуру

Вот как вы снова включаете клавиатуру, если это необходимо.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
    editText.setShowSoftInputOnFocus(true);
} else { // API 11-20
    editText.setTextIsSelectable(false);
    editText.setFocusable(true);
    editText.setFocusableInTouchMode(true);
    editText.setClickable(true);
    editText.setLongClickable(true);
    editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
}

См. этот вопрос Q & A, для чего требуется сложная версия pre API 21 для отмены setTextIsSelectable(true):

Этот ответ должен быть более тщательно протестирован.

Я тестировал setShowSoftInputOnFocus на более высоких API-устройствах, но после комментария @androiddeveloper ниже я вижу, что это нужно более тщательно протестировать.

Вот какой код вырезать и вставить, чтобы проверить этот ответ. Если вы можете подтвердить, что он работает или не работает для API с 11 по 20, оставьте комментарий. У меня нет никаких API 11-20, и у моего эмулятора возникают проблемы.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    android:background="@android:color/white">

    <EditText
        android:id="@+id/editText"
        android:textColor="@android:color/black"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="enable keyboard"
        android:onClick="enableButtonClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="disable keyboard"
        android:onClick="disableButtonClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText);
    }

    // when keyboard is hidden it should appear when editText is clicked
    public void enableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
            editText.setShowSoftInputOnFocus(true);
        } else { // API 11-20
            editText.setTextIsSelectable(false);
            editText.setFocusable(true);
            editText.setFocusableInTouchMode(true);
            editText.setClickable(true);
            editText.setLongClickable(true);
            editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
            editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
        }
    }

    // when keyboard is hidden it shouldn't respond when editText is clicked
    public void disableButtonClick(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // API 21
            editText.setShowSoftInputOnFocus(false);
        } else { // API 11-20
            editText.setTextIsSelectable(true);
        }
    }
}

Ответ 6

Добавьте свойства ниже в контроллер Edittext в файле макета

<Edittext
   android:focusableInTouchMode="true"
   android:cursorVisible="false"
   android:focusable="false"  />

Я использую это решение на время, и он отлично работает для меня.

Ответ 7

Я нашел это решение, которое работает для меня. Он также помещает курсор при нажатии на EditText в правильном положении.

EditText editText = (EditText)findViewById(R.id.edit_mine);
// set OnTouchListener to consume the touch event
editText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            v.onTouchEvent(event);   // handle the event first
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);  // hide the soft keyboard 
            }                
            return true;
        }
    });

Ответ 8

Собирая решения из нескольких мест здесь, в StackOverflow, я думаю, следующий из них подводит итог:

Если вам не нужна клавиатура, которая будет отображаться в любом месте вашей деятельности, вы можете просто использовать следующие флаги, которые используются для диалогов (получены из здесь):

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Если вы не хотите его использовать только для определенного EditText, вы можете использовать его (полученный от здесь):

public static boolean disableKeyboardForEditText(@NonNull EditText editText) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        editText.setShowSoftInputOnFocus(false);
        return true;
    }
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
        try {
            final Method method = EditText.class.getMethod("setShowSoftInputOnFocus", new Class[]{boolean.class});
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
        try {
            Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(editText, false);
            return true;
        } catch (Exception ignored) {
        }
    return false;
}

Или это (взято из здесь):

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
           editText.setShowSoftInputOnFocus(false);
       else
           editText.setTextIsSelectable(true); 

Ответ 9

// only if you completely want to disable keyboard for 
// that particular edit text
your_edit_text = (EditText) findViewById(R.id.editText_1);
your_edit_text.setInputType(InputType.TYPE_NULL);

Ответ 10

Просто установите:

 NoImeEditText.setInputType(0);

или в конструкторе:

   public NoImeEditText(Context context, AttributeSet attrs) { 
          super(context, attrs);   
          setInputType(0);
       } 

Ответ 11

Чтобы добавить к решению Алекса Кучеренко: проблема с исчезновением курсора после вызова setInputType(0) связана с ошибкой структуры на ICS (и JB).

Ошибка описана здесь: https://code.google.com/p/android/issues/detail?id=27609.

Чтобы обойти это, вызовите setRawInputType(InputType.TYPE_CLASS_TEXT) сразу после вызова setInputType.

Чтобы остановить появление клавиатуры, просто переопределите OnTouchListener в EditText и верните true (проглатывание события касания):

ed.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                return true;
            }
        });

Причины появления курсора на устройствах GB, а не на ICS +, заставили меня вырвать мои волосы на пару часов, поэтому я надеюсь, что это сэкономит время.

Ответ 12

Это сработало для меня. Сначала добавьте этот android:windowSoftInputMode="stateHidden" в ваш файл манифеста Android, под вашу активность. как показано ниже:

<activity ... android:windowSoftInputMode="stateHidden">

Затем в onCreate метод youractivity, добавьте следующий код:

EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputMethod!= null) {
            inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }                
        return true;
    }
});

Затем, если вы хотите, чтобы указатель был видимым, добавьте это на свой xml android:textIsSelectable="true".

Это сделает видимым указатель. Таким образом, клавиатура не будет всплывать при запуске вашей активности, а также будет скрыта при нажатии на edittext.

Ответ 13

Просто поместите эту строку внутри тега активности в манифесте android: windowSoftInputMode = "stateHidden"

Ответ 14

editText.setShowSoftInputOnFocus(false);