Як вимкнути спливаюче меню клавіатури під час редагування тексту?


84

У моєму додатку першим видом усіх моїх екранів є 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

Відповіді:


177

Найкраще рішення полягає у файлі Project Manifest (AndroidManifest.xml) , додайте наступний атрибут у activityконструкцію

android: windowSoftInputMode = "stateHidden"


Приклад:

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

Опис:

  • Стан м’якої клавіатури - прихована вона чи видима - коли діяльність стає центром уваги користувача.
  • Коригування, здійснене в основному вікні діяльності - чи зменшено його розмір, щоб звільнити місце для м’якої клавіатури, чи його вміст рухається, щоб зробити поточний фокус видимим, коли частина вікна покрита м’якою клавіатурою.

Введено в:

  • API рівня 3.

Посилання на Документи

Примітка: Значення, встановлені тут (крім "stateUnspecified" та "AdjuUnspecified"), замінюють значення, встановлені в темі.


3
Цей підхід виявляється невдалим, якщо у вас є поєднання текстових полів в діяльності, деякі для яких ви хочете мати клавіатуру, інші для яких ви цього не робите. Подивіться мою відповідь про те, як за такого сценарію цього можна досягти на основі кожного тексту.
slogan621

@ slogan621, будь ласка, приділіть хвилину для розуміння питання тут. Ви на іншій дотичній!
Skynet

1
він не працює, коли я відкриваю свою програму з недавнього.
Мохд Наушад

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" до запису маніфесту Діяльності.
Кріс Хорнер

@ChrisHorner в обох, які вам потрібно вказати для діяльності чи макета ... - це одна і та ж докучлива річ .. обидва добре працюють для цього рішення.
Nicolas Jafelle

2
Я спробував усі рішення, і це єдине, що працює належним чином! дякую чітко і просто
alfo888_ibg

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

1
Така погана реалізація ієрархії View! Думаю, таких слід уникати, якщо це можливо.
sud007

42
     edittext.setShowSoftInputOnFocus(false);

Тепер ви можете використовувати будь-яку спеціальну клавіатуру, яка вам подобається.


Дякую, це єдине рішення, яке працює для мене + воно коротке і просте.
Макс О.

20
доступний з API рівня 21
Jithu PS

Це те, що я шукав.
Санджай Джоші

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

23

Люди запропонували тут багато чудових рішень, але я використав цей простий прийом у своєму EditText (нічого не потрібно в Java та AnroidManifest.xml). Просто встановіть для фокусування та фокусування InTouchMode значення 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"/>

Моїм наміром є використовувати це поле редагування в операції блокування програми, де я прошу користувача ввести PIN-код, і я хочу показати свою власну PIN-код. Тестується з minSdk = 8 та maxSdk = 23 в Android Studio 2.1

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


це зробило моє життя легкої stackoverflow.com/questions/9577304 / ...
Мохаммед Мансур

20

Додайте нижче код до свого класу активності.

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

Клавіатура вискакує, коли користувач натискає EditText


9

Ви можете використовувати наступний код для вимкнення екранної клавіатури.

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

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

8

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

Перше рішення додано під рядком коду у файлі xml маніфесту. У файл Manifest (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);
}

ніщо u не може вводити за замовчуванням калькулятор ні на що, крім u може встановити будь-який рядок

Спробуй це


3

Дякую @AB за хороше рішення

    android:focusableInTouchMode="false"

у цьому випадку, якщо ви вимкнете клавіатуру під час редагування тексту, просто додайте android: focusableInTouchMode = "false" у слоган edittext.

працює для мене в Android Studio 3.0.1 minsdk 16, maxsdk26


1
Це коментар до A.Bвідповіді? Або це відповідь на вихідне запитання? Якщо це коментар до A.Bs-відповіді, вам слід скористатися опцією коментарів, наданою StackOverflow, і видалити цю відповідь на вихідне запитання.
Девід Уолшоц,

вибачте, якщо я не зрозумів відповісти на вирішену відповідь. я кажу подяку АБ за хорошу відповідь, щоб усунути мою проблему .. якщо я помиляюся, я можу видалити цю відповідь, вибачте @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

Ну, у мене була та ж проблема, і я просто вирішив фокусування у файлі 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

Єдине, що вам потрібно зробити, це додати android:focusableInTouchMode="false"EditText у xml і це все. (Якщо хтось все-таки повинен знати, як це зробити простим способом)


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;

Якщо цільовий пристрій не підтримує вищевказаний код, ви можете скористатися наведеним нижче кодом у події ClickText 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, яку я будував, у мене було три EditTexts, 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

Простий, просто видаліть тег із "" файлу xml


2
Будь ласка, можете це детальніше описати та показати приклад. Будь ласка, див. Як відповісти .
Багс

-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.