Android: автоматично показуйте м'яку клавіатуру, коли фокус знаходиться на EditText


341

Я показую вікно введення, використовуючи AlertDialog. EditTextУсередині діалогу сама автоматично фокусується , коли я дзвоню AlertDialog.show(), але м'яка клавіатура не відображається автоматично.

Як змусити м'яку клавіатуру автоматично відображатися, коли з'явиться діалогове вікно? (а фізичної / апаратної клавіатури немає). Аналогічно тому, як коли я натискаю кнопку Пошук, щоб викликати глобальний пошук, автоматично відображається м'яка клавіатура.


1
Це має відбуватися автоматично, відповідно до коментаря Теда нижче. Перевірте це спочатку!
Чизмайстер

Ця відповідь найпростіша і чудово працює: stackoverflow.com/a/8018630/89818
caw


1
Я кілька разів повертався до цієї відповіді протягом багатьох років. Це завжди в діалозі, що я маю цю проблему, ніколи не Фрагмент чи Діяльність.
tir38

Можливий дублікат програми " Закрити / приховати" клавіатуру Android
Md Imran Choudhury

Відповіді:


305

Ви можете створити прослуховувач фокусу на EditTextввімкнення AlertDialog, а потім отримати AlertDialog"s" Window. Звідти ви можете зробити шоу м'якої клавіатури, зателефонувавши setSoftInputMode.

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

5
Як я можу це зробити за допомогою AlertDialog.Builder? ... остаточне попередження AlertDialog.Builder = новий AlertDialog.Builder (Main.this);
Стівен

6
@Stephen ви можете отримати діалогове вікно у конструктора за допомогою, final AlertDialog dialog = builder.create()а потім showу діалоговому вікні замість конструктора.
tidbeck

30
Я ПОВЕРНУТИСЯ МОЄГО КОМЕНТАРУ ВІДПОВІДУ Я дізнався, що якщо ви не можете отримати фокус правильно, подивіться на свій XML! Якщо ви бачите тег <requestFocus> </requestFocus> там - видаліть його. Схоже, тег буде зосереджувати увагу на EditText, і тоді ваш слухач не буде звільнений, оскільки EditText вже має фокус.
Тед

11
Як цього не зробити, якщо на пристрої є апаратна клавіатура? Схоже, це дратує цих користувачів.
mxcl

8
Я дійсно не розумію, чому це не поведінка за замовчуванням у SDK. Якщо у вікні, який потребує введення тексту, відображається миготливий курсор, чому б хтось не хотів бачити клавіатуру для введення тексту? Мені здається, що UX мені не так
Крістіан Гарсія

240

Показано використання клавіатури:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Для приховування використання клавіатури:

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

3
Це особливо добре спрацьовує, коли ви хочете показати / приховати м'яку клавіатуру на основі переключення видимості виду у вашому макеті між VISIBLE та GONE.
PacificSky

38
Я б запропонував замість цього використовувати прапор SHOW_IMPLICIT, оскільки це означає, що зміна активності або програми автоматично приховають клавіатуру, як очікувалося.
drspaceboo

6
@drspaceboo Використання SHOW_IMPLICIT зовсім не працює для мене, я повинен використовувати SHOW_FORCED, не впевнений, чому ...
Yoann Hercouet

1
Коли слід запускати вищевказаний код? Я спробував це зробити невдовзі після додавання моєї верстки до її батьківського. Це не спрацювало. Але якщо я це зробив після того, як макет був деякий час, він спрацював. Отже, чи є зворотній дзвінок, який скаже мені "Якщо ви зараз спробуєте показати клавіатуру, вона дійсно спрацює"?
Вільям Йокуш

1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0) перемикає м'яку клавіатуру. Якщо ви хочете переконатися, що клавіатура відображається, ви можете використовувати im.showSoftInput (view, InputMethodManager.SHOW_IMPLICIT) замість цього, перегляд - це Вид, який отримає вхід.
PJ_Finnegan

111

Ви можете подати запит на м'яку клавіатуру відразу після створення діалогового вікна (тест на SDK - r20)

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Для всіх, хто цікавиться, цей метод не відкриває м'яку клавіатуру, коли приєднано апаратну клавіатуру. Я щойно тестував USB-кабель на ходу. Ідеально!
13rac1

Це нічого не робить для мене.
JohnyTex

У мене немає апаратної клавіатури. Можливо конфігурація (?)
JohnyTex

25

У мене була така ж проблема і вирішено її за допомогою наступного коду. Я не впевнений, як це поведе себе на телефоні з апаратною клавіатурою.

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();

Це в класі діалогового інтерфейсу API Dialog рівень 8
tidbeck

повинні бути видалені пізніше: /
Jacek Kwiecień

@Xylian це ще в документації Dialog.setOnShowListener ()
tidbeck


18
<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

або

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

Дякую, товариш, це було приголомшливо, фактично я використовував їх обидва для вирішення своєї проблеми, у мене була ситуація, коли якщо користувач перебуває в режимі додавання, то потрібно показати клавіатуру на початку роботи, а для режиму оновлення не потрібна клавіатура за замовчуванням. Отже, в маніфесті для діяльності, яку я встановив, stateHiddenі коли я виявляю, що користувач створює новий елемент, я відображав клавіатуру, використовуючи згаданий вами рядок коду. :) Ще раз дякую.
Месник PHP

Я отримую повідомлення "Не можу вирішити getWindow ()". я спробував поставити "це". та інші речі перед цим. я хочу отримати клавіатуру без використання редакційного тексту, просто натиснувши певну частину екрана.
Androidcoder

1
@Androidcoder, це частина діяльності, тому додайте щось подібне ((Activity) context).getWindow().....
CoolMind

15

Фрагменти коду з інших відповідей працюють, але не завжди очевидно, де їх розмістити в коді, особливо якщо ви використовуєте AlertDialog.Builderі дотримуєтесь офіційного діалогового посібника, оскільки він не використовує final AlertDialog ...або alertDialog.show().

alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Переважно

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Оскільки SOFT_INPUT_STATE_ALWAYS_VISIBLE приховає клавіатуру, якщо фокус відключиться від EditText, де SHOW_FORCED буде зберігати клавіатуру, поки вона не буде явно відхилена, навіть якщо користувач повернеться на головний екран або відобразить останні програми.

Нижче працює код для AlertDialog, створений за допомогою користувацького макета з EditText, визначеним у XML. Він також встановлює клавіатуру, щоб мати клавішу "йти", і дозволяє їй запускати позитивну кнопку.

alert_dialog.xml:

<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

    <!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
    <!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:imeOptions="actionGo"
        android:inputType="textUri"/>

</RelativeLayout>

AlertDialog.java:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class CreateDialog extends AppCompatDialogFragment {
    // The public interface is used to send information back to the activity that called CreateDialog.
    public interface CreateDialogListener {
        void onCreateDialogCancel(DialogFragment dialog);    
        void onCreateDialogOK(DialogFragment dialog);
    }

    CreateDialogListener mListener;

    // Check to make sure that the activity that called CreateDialog implements both listeners.
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (CreateDialogListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
        }
    }

    // onCreateDialog requires @NonNull.
    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater customDialogInflater = getActivity().getLayoutInflater();

        // Setup dialogBuilder.
        alertDialogBuilder.setTitle(R.string.title);
        alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
        alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogCancel(CreateDialog.this);
            }
        });
        alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogOK(CreateDialog.this);
            }
        });

        // Assign the resulting built dialog to an AlertDialog.
        final AlertDialog alertDialog = alertDialogBuilder.create();

        // Show the keyboard when the dialog is displayed on the screen.
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        // We need to show alertDialog before we can setOnKeyListener below.
        alertDialog.show();

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

        // Allow the "enter" key on the keyboard to execute "OK".
        editText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Trigger the create listener.
                    mListener.onCreateDialogOK(CreateDialog.this);

                    // Manually dismiss alertDialog.
                    alertDialog.dismiss();

                    // Consume the event.
                    return true;
                } else {
                    // If any other key was pressed, do not consume the event.
                    return false;
                }
            }
        });

        // onCreateDialog requires the return of an AlertDialog.
        return alertDialog;
    }
}

11

Ну, це досить стара публікація, все ж є що додати.
Це два простих методу, які допомагають мені тримати клавіатуру під контролем, і вони працюють ідеально:

Показати клавіатуру

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

Сховати клавіатуру

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

Що таке getCurrentFocus()?
CoolMind

Я бачу, це метод Activity.
CoolMind

10

Дозвольте вказати якусь додаткову інформацію на рішення юку, тому що мені було важко налагодити це! Як я можу отримати об’єкт AlertDialog від свого AlertDialog.Builder? Ну, це результат мого alert.show()страти:

final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
final EditText input = new EditText(getActivity());
alert.setView(input);

// do what you need, like setting positive and negative buttons...

final AlertDialog dialog = alert.show();

input.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      }
   }
});

7

Погляньте на цю дискусію, яка обробляє приховування вручну та показ IME. Однак, я відчуваю, що якщо цілеспрямовано EditTextне підводити IME, це тому, що ви викликаєте AlertDialog.show()свій OnCreate()чи інший метод, який викликається до того, як екран буде фактично представлений. OnPostResume()Якщо я переконаю, що це потрібно, виправте це.


6

Так, ви можете з setOnFocusChangeListenerцим допомогти вам.

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

4

Я знаю, що це питання давнє, я думаю, що використання функції розширення є гарнішим способом показу клавіатури для редагування тексту

ось метод, який я використовую для показу клавіатури для редагування тексту.

Котлін код: просто потрібно зателефонуватиedittext.showKeyboard()

fun EditText.showKeyboard() {
  post {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
  }
}

код Java:

public static void showKeyboard(EditText editText) {
    editText.post(new Runnable() {
      @Override
      public void run() {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) editText.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
      }
    });
  }

3

Якщо хтось отримує:

Неможливо зробити статичну посилання на нестатичний метод getSystemService (String) з типу Activity

Спробуйте додати контекст для виклику getSystemService.

Тому

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

1

Оригінальне питання стосується діалогів, і мій EditText регулярно переглядається. Так чи інакше, я підозрюю, що це має працювати і для більшості з вас. Тож ось що для мене працює (вищенаведений запропонований метод найвищої оцінки для мене нічого не робив). Ось користувацький EditView, який робить це (підкласифікація не потрібна, але я вважав це зручним для своїх цілей, оскільки я хотів також захопити фокус, коли вид стає видимим).

Це насправді багато в чому те саме, що і відповіді від тідбека. Я насправді зовсім не помітив його відповіді, оскільки він мав нульовий голос. Тоді я збирався просто прокоментувати його повідомлення, але це було б занадто довго, тому я все-таки закінчився цим дописом. tidbeck вказує, що він не впевнений, як це працює з пристроями, що мають клавіатури. Я можу підтвердити, що поведінка здається абсолютно однаковою в будь-якому випадку. Це так, що в портретному режимі вискакує клавіатура програмного забезпечення, а в пейзажному - не. Якщо фізична клавіатура висунута чи ні, це не має значення для мого телефону.

Тому що, я особисто знайшов поведінку трохи ніяково , я вибрав для використання: InputMethodManager.SHOW_FORCED. Це працює так, як я хотів, щоб він працював. Клавіатура стає видимою незалежно від орієнтації, однак принаймні на моєму пристрої вона не з’являється, якщо апаратну клавіатуру висунули.

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

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

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}

1

Проблема, здається, полягає в тому, що оскільки місце, де ви вводите текст, спочатку приховане (або вкладене чи щось), AlertDialog автоматично встановлює прапор WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMабоWindowManager.LayoutParams.FLAG_NOT_FOCUSABLE так, щоб речі не запускали м'який вклад.

Для виправлення цього способу слід додати наступне:

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

спробуйте і скористайтеся:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

1

Щоб показати клавіатуру, мені довелося зробити наступне

Android TextField: налаштування фокусу + м'якого введення програмно

По суті рішення наступне

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

Де ShowKeyboardє

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        passwordInput.requestFocus();
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Після успішного введення я також переконуюсь, що я приховав клавіатуру

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1

Покладіть ці методи у свій клас Util і використовуйте будь-де.

Котлін

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Java

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

1

Я створив приємні функції розширення kotlin-esqe у випадку, коли когось цікавить

fun Activity.hideKeyBoard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

fun Activity.showKeyboard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

0

Це хороший зразок для вас:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollID"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:weightSum="1" >

        <EditText
            android:id="@+id/txtInpuConversation"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:hint="@string/edt_Conversation" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/btnSend"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/btn_Conversation" />
    </LinearLayout>

</LinearLayout>

0

Чому ця відповідь - Тому що вищевказане рішення покаже вашу клавіатуру, але воно не зникне, якщо натиснути будь-яке інше EditText. Тому потрібно щось зробити, щоб клавіатура зникала, коли EditTextвтрачається фокус.

Ви можете досягти цього, виконавши наступні дії:

  1. Зробіть батьківський вигляд (вміст перегляду вашої діяльності) клікабельним і фокусуваним, додавши наступні атрибути

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. Реалізуйте метод hidKeyboard ()

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. Нарешті, встановіть onFocusChangeListener свого редакційного тексту.

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });

0

Це трохи хитро. Я так і зробив, і це спрацювало.

1.Перший дзвінок, щоб приховати програмне введення з вікна. Це дозволить приховати м'який вхід, якщо видно м'яку клавіатуру або нічого не робити, якщо її немає.

2.Покажіть свій діалог

3. Потім просто зателефонуйте, щоб перемкнути м'який вхід.

код:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);

0

Спробуйте це

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}

0

Пробував багато, але це те, що працювало для мене (kotlin):

        val dialog = builder.create()
        dialog.setOnShowListener {
            nameEditText.requestFocus()
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }

        dialog.setOnDismissListener {
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
        }

        dialog.show()

0

Дивлячись на https://stackoverflow.com/a/39144104/2914140, я трохи спростив:

// In onCreateView():
view.edit_text.run {
    requestFocus()
    post { showKeyboard(this) }
}

fun showKeyboard(view: View) {
    val imm = view.context.getSystemService(
        Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Це краще, ніж https://stackoverflow.com/a/11155404/2914140 :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

тому що, коли ви натиснете кнопку "Головна" і перейдете на головний екран, клавіатура залишиться відкритою.


-1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Я закликаю це в onCreate (), щоб автоматично відображати клавіатуру, коли я зайшов у програму.

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