Предотвратить кнопки от скрытия мягкой клавиатуры на Android - PullRequest
7 голосов
/ 05 ноября 2011

У меня есть WebView и несколько кнопок в моем макете.В моем WebView есть большой тег.Это приложение используется для редактирования текстовых файлов.Кнопки используются для создания текстовой области внутри моего WebView.Когда пользователь нажимает кнопку (например, кнопку со стрелкой для перемещения текстового представления), он закрывает клавиатуру.Я использовал toggleSoftInput, но это просто переключает клавиатуру, чтобы показать или нет.Я хочу, чтобы кнопки перестали скрывать программную клавиатуру при нажатии кнопки.Я не нашел ничего о моей конкретной проблеме.Я искал недели.У кого-нибудь есть идеи о том, как я могу помешать моим кнопкам скрывать программную клавиатуру на Android?

Ответы [ 3 ]

5 голосов
/ 30 июня 2012

Решением вашей проблемы может быть постоянное отображение клавиатуры и предоставление пользователю возможности закрыть ее после выполнения действий.

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

Попробуйте этот код в методе onCreate () вашего Activity,Обратите внимание, что если пользователь нажимает кнопку закрытия на клавиатуре или кнопку возврата, он должен закрыть его.И я думаю, что вы не должны вмешиваться в этот сценарий.И когда действия будут выполнены, вы можете закрыть клавиатуру из кода.

4 голосов
/ 13 сентября 2013

Я нахожусь в одной лодке, поэтому, если бы вы когда-нибудь нашли идеальное решение, я бы с удовольствием его услышал.

РЕДАКТИРОВАТЬ: Успех!Или, во всяком случае, намного лучше, чем раньше.Я удалил свое старое решение, поскольку оно лучше.

Как указано в https://stackoverflow.com/a/10536033/513038,, оказывается, что loadData () скрывает клавиатуру. Однако , я обнаружил, что в hideSoftKeyboard () WebView он проверяет InputMethodManager на предмет активности веб-просмотра через imm.isActive (mWebView).

Итак, если вы переключите фокусна EditText до loadData (), и сразу же после этого переключитесь обратно в WebView, клавиатура остается на месте!Он ненадолго переключается на верхний регистр, я думаю, что при возврате фокуса к веб-представлению (на самом деле, это, кажется, не всегда происходит, это зависит), но это намного менее заметно, чем мерцание клавиатуры назад и назад.

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

Расширение WebView.Дайте ему поле EditText:

public EditText mFocusDistraction;

В конструкторе есть следующие строки:

mFocusDistraction = new EditText(context);
addView(mFocusDistraction);

Затем переопределите loadUrl ():

public void loadUrl(String s) {
    mFocusDistraction.requestFocus();
    super.loadUrl(s);
    this.requestFocus();
}

Это должнозаставить его работать, в основном.Это немного глючит, так что вот более полный класс:

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
import android.widget.EditText;

public class WebViewMod extends WebView {
    public EditText mFocusDistraction;
    public Context mContext;

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

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

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

    public WebViewMod(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
        super(context, attrs, defStyle, privateBrowsing);
        init(context);
    }

    public void init(Context context) {
        // This lets the layout editor display the view.
        if (isInEditMode()) return;

        mContext = context;

        mFocusDistraction = new EditText(context);
        mFocusDistraction.setBackgroundResource(android.R.color.transparent);
        this.addView(mFocusDistraction);
        mFocusDistraction.getLayoutParams().width = 1;
        mFocusDistraction.getLayoutParams().height = 1;
    }

    @Override
    public void loadUrl(final String url) {
        if (mContext instanceof Activity && this.isFocused()) {
            ((Activity)mContext).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mFocusDistraction.requestFocus();
                    WebViewMod.super.loadUrl(url);
                    WebViewMod.this.requestFocus();
                }
            });
        } else {
            super.loadUrl(url);
        }
    }
}
0 голосов
/ 29 апреля 2016

Xamarin Android (альтернатива):

InputMethodManager inputManager = (InputMethodManager)GetSystemService(Context.InputMethodService); 
inputManager.ToggleSoftInput (ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly);
...