Как отключить всплывающее окно клавиатуры при редактировании текста?


85

В моем приложении первый вид всех моих экранов - это EditText, поэтому каждый раз, когда я перехожу на экран, появляется экранная клавиатура. как я могу отключить это всплывающее окно и включить его при нажатии на EditText вручную ????

    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

xml-код:

<ImageView
    android:id="@+id/feedPageLogo"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:src="@drawable/wic_logo_small" />

<Button
    android:id="@+id/goButton_feed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="@string/go" />

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/goButton_feed"
    android:layout_toRightOf="@id/feedPageLogo"
    android:hint="@string/search" />

<TextView
    android:id="@+id/feedLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/feedPageLogo"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/feed"
    android:textColor="@color/white" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ButtonsLayout_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/feedButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/feed"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/iWantButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/iwant"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/shareButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/share"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/profileButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/profile"
        android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/feedListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/ButtonsLayout_feed"
    android:layout_below="@id/feedLabel"
    android:textSize="15dp" >
</ListView>

третье представление (EditText) - это то место, где находится фокус.


Вы можете опубликовать свой xml-код. полностью.
user1213202

Ответы:


178

Самое лучшее решение лежит в файле проекта манифеста (AndroidManifest.xml) , добавьте следующий атрибут в activityконструкции

android: windowSoftInputMode = "stateHidden"


Пример:

    <activity android:name=".MainActivity" 
              android:windowSoftInputMode="stateHidden" />

Описание:

  • Состояние виртуальной клавиатуры - скрытая или видимая - когда действие становится фокусом внимания пользователя.
  • Корректировка, внесенная в главное окно действия - уменьшается ли его размер, чтобы освободить место для виртуальной клавиатуры, или его содержимое сдвигается, чтобы сделать текущий фокус видимым, когда часть окна закрыта мягкой клавиатурой.

Представлено в:

  • API уровня 3.

Ссылка на документы

Примечание. Установленные здесь значения (кроме «stateUnspecified» и «adjustUnspecified») переопределяют значения, установленные в теме.


3
Этот подход не работает, если у вас есть сочетание текстовых полей в действии, для некоторых из которых вы хотите иметь клавиатуру, а для других - нет. См. Мой ответ о том, как этого можно достичь для каждого текстового поля в таком сценарии.
slogan621

@ slogan621пожалуйста, уделите немного времени, чтобы понять этот вопрос. Вы идете по другому пути!
Skynet

83

Вы должны создать представление над EditText, которое принимает фальшивый фокус:

Что-то вроде :

<!-- Stop auto focussing the EditText -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:inputType="text" />

В этом случае я использовал LinearLayout для запроса фокуса. Надеюсь это поможет.

Это сработало отлично ... благодаря Zaggo0


26
Добавление бесполезного представления является неоптимальным решением по сравнению с добавлением android: windowSoftInputMode = "stateHidden" в запись манифеста Activity.
Крис Хорнер,

@ChrisHorner в обоих случаях, которые вам нужно указать для активности или макета ... это одно и то же раздражает ... оба хорошо подходят для этого решения.
Николас Джафель 09

2
Я перепробовал все решения, и это единственное, что работает правильно! спасибо ясно и просто
alfo888_ibg 03

Добавление бесполезного представления не является хорошей идеей, как сказал @ChrisHorner, лучше добавьте атрибут в файл манифеста, как он предлагает, или добавьте эту строку кода в свою деятельность InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9,

1
Какая плохая реализация иерархии представлений! Я думаю, что этого следует по возможности избегать.
sud007 05

43
     edittext.setShowSoftInputOnFocus(false);

Теперь вы можете использовать любую настраиваемую клавиатуру, которая вам нравится.


Спасибо, это единственное решение, которое у меня работает + оно короткое и простое.
Макс О.

20
он доступен с уровня API 21
Jithu PS

Это то, что я искал.
Санджай Джоши

@ JithuP.S, почему он работает над титаном Karbon, у которого уровень API 19 ??
尤金寶 漢子

23

Люди предложили здесь много отличных решений, но я использовал эту простую технику с моим EditText (ничего в java и AnroidManifest.xml не требуется). Просто установите для вашего focusable и focusableInTouchMode значение false непосредственно в EditText.

 <EditText
        android:id="@+id/text_pin"
        android:layout_width="136dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAlignment="center"
        android:inputType="numberPassword"
        android:password="true"
        android:textSize="24dp"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

Я намерен использовать это поле редактирования в блокировке приложения, где я прошу пользователя ввести ПИН-код, и я хочу показать свою настраиваемую ПИН-панель. Протестировано с minSdk = 8 и maxSdk = 23 на Android Studio 2.1.

введите описание изображения здесь


это облегчило мою жизнь stackoverflow.com/questions/9577304/…
Мохаммед мансур 01

20

Добавьте ниже код в свой класс активности.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

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


10

Вы можете использовать следующий код для отключения экранной клавиатуры.

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);

1
и я могу снова включить его, используя EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) или что-то в этом роде ??
Housefly

8

Два простых решения:

Первое решение добавлено под строкой кода в XML-файле манифеста. В файле манифеста (AndroidManifest.xml) добавьте следующий атрибут в конструкцию действия

android: windowSoftInputMode = "stateHidden"

Пример:

<activity android:name=".MainActivity" 
          android:windowSoftInputMode="stateHidden" />

Второе решение добавляет строку кода в действие

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Мы можем использовать любое из вышеперечисленных решений. благодаря


5

Объявите глобальную переменную для InputMethodManager:

 private InputMethodManager im ;

В onCreate () определите его:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

Установите onClickListener на этот текст редактирования внутри oncreate ():

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

Это сработает.


Пожалуйста, разместите свой код. Что вы получаете, когда выполняете.
AndroGeek

весь код в вопросе, экранная клавиатура не отображается, когда я нажимаю на текст редактирования
Housefly

Вы тестируете это с помощью эмулятора или устройства. Если вы попробуете это сделать с помощью эмулятора, то программные клавиши не появятся. Протестируйте это с помощью устройства. Это сработает.
AndroGeek

да, я использую устройство для тестирования
Housefly

Хммм, это странно. Если бы вы могли опубликовать свой код, метод, в котором вы написали, это могло бы помочь. В противном случае приведенный выше код отлично работает на моем устройстве.
AndroGeek

4

Используйте следующий код, напишите его под onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

4

попробуйте ....... я решаю эту проблему с помощью кода: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

ничего, что вы можете ввести по умолчанию калькулятором ни на что, кроме вы можете установить любую строку.

попытайся


3

Спасибо @AB за хорошее решение

    android:focusableInTouchMode="false"

В этом случае, если вы отключите клавиатуру в тексте редактирования, просто добавьте android: focusableInTouchMode = "false" в слоган edittext.

работать для меня в Android Studio 3.0.1 minsdk 16, maxsdk26


1
Это комментарий к A.Bответу? Или это ответ на исходный вопрос? Если это комментарий к A.Bответу, вам следует использовать параметр комментария, предоставленный StackOverflow, и удалить этот ответ на исходный вопрос.
Дэвид Уолшотс,

извините, если я не понял, чтобы ответить на решенный ответ. Я говорю спасибо AB за хороший ответ, чтобы прояснить мою проблему ... если я ошибаюсь, я могу удалить этот ответ, извините @DavidWalschots.
NZXT

2

Попробуйте с этим:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

Чтобы закрыть, вы можете использовать:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
 imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0); 

Попробуйте это в своем коде:

ed = (EditText)findViewById(R.id.editText1);

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);  

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});

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

хорошо, теперь он работает после добавления нескольких атрибутов макета ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" спасибо
Housefly

нет. сделай одно. напиши код сокрытия клавиатуры в методе edittext.setOnFocusChangeListener () и попробуй
user1213202

это было бы решением, ЕСЛИ вы могли бы точно указать, когда использовать вызов hideSoftInput. клавиатура автоматически появляется ПОСЛЕ OnCreate и onResume
Ahmet Emrah

2

Единственное, что вам нужно сделать, это добавить android:focusableInTouchMode="false"в EditText в xml и все. (Если кому-то еще нужно знать, как это сделать простым способом)


2

Ну, у меня была та же проблема, и я просто занялся фокусировкой в ​​файле XML.

<EditText
            android:cursorVisible="false"
            android:id="@+id/edit"
            android:focusable="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

Вы, вероятно, тоже ищете безопасности. Это поможет и в этом.


1

Используйте следующий код в своем onCreate()методе:

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);

1

Для пользователей Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop

1
       <TextView android:layout_width="match_parent"
                 android:layout_height="wrap_content"

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

                <requestFocus/>
      </TextView>

      <EditText android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

1

Если вы используете Xamarin, вы можете добавить это

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

после этого вы можете добавить эту строку в метод OnCreate ()

youredittext.ShowSoftInputOnFocus = false;

Если целевое устройство не поддерживает приведенный выше код, вы можете использовать приведенный ниже код в событии щелчка EditText.

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);

1

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

  1. Отключить мягкий фокус ввода в поле редактирования. Я не могу отключить все действие, так как есть поля редактирования, для которых я хочу, чтобы клавиатура использовалась в том же макете.
  2. Первые щелчки в текстовом поле приводят к изменению фокуса, повторный щелчок вызывает событие щелчка. Поэтому я переопределяю оба (здесь я не реорганизую код, чтобы показать, что оба обработчика делают одно и то же):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    

0

В приложении для Android, которое я создавал, у меня было три EditTextэлемента, LinearLayoutрасположенных по горизонтали. Пришлось не допускать появления мягкой клавиатуры при загрузке фрагмента. В дополнение к установке focusableи focusableInTouchModeк истине на LinearLayout, я должен был установить descendantFocusabilityв blocksDescendants. В onCreate, я позвонил requestFocusнаLinearLayout . Это предотвратило появление клавиатуры при создании фрагмента.

Макет -

    <LinearLayout
       android:id="@+id/text_selector_container"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:weightSum="3"
       android:orientation="horizontal"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:descendantFocusability="blocksDescendants"
       android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

В onCreate-mTextSelectorContainer.requestFocus();


0

Если кто-то все еще ищет самое простое решение, установите для следующего атрибута в trueродительском макете

android:focusableInTouchMode="true"

Пример:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true">

.......
......
</android.support.constraint.ConstraintLayout>

голосующих против, прокомментируйте, пожалуйста, свои аргументы перед голосованием против!
Аджмал Салим

0

Используйте это для включения и отключения EditText ....

InputMethodManager imm;

imm = (InputMethodManager)
getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }

0

Попробуйте этот ответ,

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

Примечание: только для API 11+


0
private InputMethodManager imm;

...


editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        hideDefaultKeyboard(v);
        return true;
    }
});

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}

-1

для любого текстового представления в вашей деятельности (или создайте поддельный пустой текстовый вид с помощью android: layout_width = "0dp" android: layout_height = "0dp") и добавьте для этого текстового представления следующее: android: textIsSelectable = "true"



-1

Просто нужно добавить свойство, android:focusable="false"в частности, EditTextв макет xml. Затем вы можете написать список кликов EditTextбез всплывающего окна клавиатуры.


-1

Эту проблему можно отсортировать с помощью: Нет необходимости устанавливать для editText inputType какие-либо значения, просто добавьте строку ниже, editText.setTextIsSelectable (true);


Эй, спасибо, что написали ответ! Однако, поскольку здесь уже так много ответов, было бы еще полезнее, если бы вы на самом деле написали это как комментарий к ответу Ранджита Кумара, вместо того, чтобы делать его собственным ответом. Также было бы интересно упомянуть, каков будет эффект от исключения inputType. Но похоже, что было бы неплохо узнать, согласился ли я с этим другим ответом, поэтому, даже если вы настаиваете на том, чтобы оставить его как отдельный ответ, все равно оставьте там комментарий.
Марк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.