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

Android Hide Soft Keyboard от EditText, не теряя курсора

Я дошел до этого, который достает меня на полпути, но не совсем. У меня есть dialer Fragment, у которого есть все обычные Button, чтобы ввести число, включая backspace, поэтому мне не нужна мягкая клавиатура. Я также хотел бы дать пользователю возможность вставлять текст (длинный клик... отлично работает по умолчанию), а также редактировать введенные данные, поэтому мне нужен курсор.

Самый простой способ, которым я нашел, чтобы убедиться, что мягкая клавиатура не появляется, если пользователь нажимает внутри EditText, - это установить значение inputType в null, но это также убивает курсор.

Итак, как я объявляю свой EditText и какие команды следует запускать, чтобы в поле EditText никогда не отображалась мягкая клавиатура, независимо от того, что пользователь пытается, но все же сохраняют функциональность вставки и курсор?

Я также пробовал android:windowSoftInputMode="stateAlwaysHidden" в своем манифесте, но безрезультатно.

4b9b3361

Ответ 1

Это сработало для меня:

        // Update the EditText so it won't popup Android own keyboard, since I have my own.
    EditText editText = (EditText)findViewById(R.id.edit_mine);
    editText.setOnTouchListener(new OnTouchListener() {

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

Ответ 2

Наконец-то я нашел для меня рабочее решение.

Первая часть (in onCreate):

// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (android.os.Build.VERSION.SDK_INT >= 11) {
    // this fakes the TextView (which actually handles cursor drawing)
    // into drawing the cursor even though you've disabled soft input
    // with TYPE_NULL
    mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}

Кроме того, для android: textIsSelectable необходимо установить значение true (или установить в onCreate), и EditText не должен фокусироваться на инициализации. Если ваш EditText является первым настраиваемым представлением (что было в моем случае), вы можете обойти это, поставив его чуть выше него:

<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>

Вы можете увидеть результаты этого в приложении Grapher, бесплатно и доступны в Google Play.

Ответ 3

Установка флага textIsSelectable в true отключает мягкую клавиатуру.

Вы можете установить его в своем XML-макете следующим образом:

<EditText
    android:id="@+id/editText"
    ...
    android:textIsSelectable="true"/>

Или программно, например:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

Курсор по-прежнему будет присутствовать, вы сможете выбрать/скопировать/вырезать/вставить, но мягкая клавиатура никогда не будет отображаться.

Ответ 4

использовать

android:windowSoftInputMode="stateHidden" 

в файле манифеста вместо android:windowSoftInputMode="stateAlwaysHidden"

Ответ 5

Лучшее решение от @Lupsaa здесь:

Установка флага textIsSelectable в true отключает мягкую клавиатуру.

Вы можете установить его в своем XML-макете следующим образом:

<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>

Или программно, например:

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

editText.setTextIsSelectable(истина);

Курсор по-прежнему будет присутствовать, вы сможете выбрать/скопировать/вырезать/вставить, но мягкая клавиатура никогда не будет отображаться.

Ответ 6

Это то, что я сделал. Во-первых, в манифестной внутренней деятельности

android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"

Во-вторых, в onCreate, если внутренняя активность или onActivityCreated, если внутри фрагмента

editText.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            hideSoftKeyboard(v);
        }
    });

Не забудьте запросить фокус на editText

editText.requestFocus();

Затем добавьте метод hideSoftKeyboard(v) так же, как и другой ответ.

private void hideSoftKeyboard(View v){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

Ключ здесь - requestFocus, прежде чем нажать EditText. Если без фокуса, первый щелчок заставит клавиатуру отобразиться (мой опыт). Однако это применяется, если у вас есть один EditText в действии. При этом вы по-прежнему можете вводить пользовательскую клавиатуру (если есть), можете копировать и вставлять, а курсор все еще отображается.

Ответ 7

Точная функциональность, которая вам требуется, обеспечивается установкой флага textIsSelectable в EditText на true. При этом курсор все равно будет присутствовать, и вы сможете выбрать/скопировать/вырезать/вставить, но SoftKeyboard никогда не будет показывать. Требуется API 11 и выше.

Вы можете установить его в своем XML-макете следующим образом:

<EditText
    android:textIsSelectable="true"
    ...
/>

Или программно, например:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

Для тех, кто использует API 10 и ниже, здесь можно найти хак:  fooobar.com/questions/139478/...

Ответ 8

    EditText text = (EditText) findViewById(R.id.text);
    if (Build.VERSION.SDK_INT >= 11) {
        text.setRawInputType(InputType.TYPE_CLASS_TEXT);
        text.setTextIsSelectable(true);
    } else {
        text.setRawInputType(InputType.TYPE_NULL);
        text.setFocusable(true);
    }

Ответ 9

Это работает отлично (для меня) в 2 этапа:

  • <activity... android:windowSoftInputMode="stateHidden"> в файле манифеста

  • Добавьте эти свойства в свой XML-код editText

    android:focusable="true"
    android:focusableInTouchMode="true
    

Вам нужно поставить как 1, так и 2, только тогда он будет работать.

Приветствия

Ответ 10

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

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

На ваш XML добавить этот android:textIsSelectable="true". Это сделает указатель видимым.

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

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

Ответ 11

EditText editText = (EditText) findViewById (R.id.edit_mine);   editText.setOnTouchListener(новый OnTouchListener() {

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

ha... это правильный способ делать... эта работа... это будет работать!

Ответ 12

Вы можете использовать следующую строку кода в методе Activity onCreate, чтобы убедиться, что клавиатура всплывает только тогда, когда пользователь щелкает или касается поля EditText. Я перепробовал много методов и кодов из stackoverflow, но ничего не получилось, но это отлично работает для меня !! Попробуй это.. :)'

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Ответ 13

Вы можете использовать следующую строку кода в методе Activity onCreate, чтобы убедиться, что клавиатура всплывает только тогда, когда пользователь щелкает или касается поля EditText. Я перепробовал много методов и кодов из stackoverflow, но ничего не получилось, но это отлично работает для меня !! Попробуй это.. :)'

        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Ответ 14

Если ваш минимальный SDK равен 21, вы можете использовать этот метод из кода Java:

editText.setShowSoftInputOnFocus(true);

Авторы статьи Чен Су.