WebView textarea не всплывает на клавиатуре - PullRequest
40 голосов
/ 11 августа 2010

Когда я отображаю WebView, я не вижу всплывающей программной клавиатуры.Жесткая клавиатура также не работает!

Каковы обычные недостатки.

Код, который я использую для доступа к WebView:

package com.example.blahblah;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Window;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class createAccount extends Activity {

private static final String LOG_TAG = "Create Account";
private WebView mWebView;
private static final String URL = blah_app.urlSelected+"createAccount.html";    
private Handler mHandler = new Handler();

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    Toast.makeText(createAccount.this, "URL = " +URL, Toast.LENGTH_SHORT).show();
    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.webview);
    getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);

    mWebView = (WebView) findViewById(R.id.webview);

    WebSettings webSettings = mWebView.getSettings();
    webSettings.setSavePassword(true);
    webSettings.setSaveFormData(true);
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportZoom(true);


    final Activity activity = this;
    mWebView.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress) {

        activity.setProgress(progress * 1000);
      }
    });

    mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
    mWebView.clearCache(true);
    setProgressBarVisibility(true);
    mWebView.setWebViewClient(new WebViewClient() {
          public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
          }

           @Override  
           public void onPageFinished(WebView view, String url)  
           {  
               mWebView.loadUrl("javascript:(function () { " +
                       "setVariables("+blah_app.numberSelected+",'"+blah_app.urlSelected+"');" +
                       "})()");
           }
        });

    mWebView.loadUrl(URL);
}

final class DemoJavaScriptInterface {

    public void setData(String fname, String lname, String gacct, String phone) {

        SharedPreferences prefCreateAccount = PreferenceManager.getDefaultSharedPreferences(createAccount.this);
        SharedPreferences.Editor editor = prefCreateAccount.edit();
        editor.putString("FirstName", fname);
        editor.putString("LastName", lname);
        editor.putString("GmailAcct", gacct);
        editor.putString("Phone", phone);
        editor.commit();    

    }
    DemoJavaScriptInterface() {

    }

    /**
     * This is not called on the UI thread. Post a runnable to invoke
     * loadUrl on the UI thread.
     */
    public void clickOnAndroid() {
        mHandler.post(new Runnable() {
            public void run() {
                mWebView.loadUrl("javascript:wave()");
            }
        });
    }
}

/**
 * Provides a hook for calling "alert" from javascript. Useful for
 * debugging your javascript.
 */
final class MyWebChromeClient extends WebChromeClient {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        Log.d(LOG_TAG, message);
        result.confirm();
        return true;
    }
}

public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        startActivity(new Intent(getApplication(), blah_app.class));
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
}

Ответы [ 11 ]

46 голосов
/ 26 июля 2011

Полное решение немного больше, чем у Саны.Это задокументировано как ошибка на сайте Android (http://code.google.com/p/android/issues/detail?id=7189):

webView.requestFocus(View.FOCUS_DOWN);
webView.setOnTouchListener(new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                if (!v.hasFocus())
                {
                    v.requestFocus();
                }
                break;
        }
        return false;
    }
});
37 голосов
/ 24 ноября 2010

Проблема заключалась в том, что веб-просмотр не фокусировался при загрузке, поэтому использование

webView.requestFocus(View.FOCUS_DOWN);

решило проблему.

8 голосов
/ 16 ноября 2012

Я удивлен, что даже на Android 4.1 (протестировано на SGS3) проблема все еще присутствует, и переопределение onTouch () не решает ее для меня.

Тестовый код:

String HTML = "<html><head>TEST</head><body><form>";
HTML += "<INPUT TYPE=TEXT SIZE=40 NAME=user value=\"your name\">";
HTML += "</form></body></html>";

WebView wv = new WebView(getContext());
wv.loadData(HTML, "text/html", null);

final AlertDialog.Builder adb = new AlertDialog.Builder(getContext());
adb.setTitle("TEST").setView(wv).show();

Моё сложное решение - заменить WebView на MyWebView:

private static class MyWebView extends WebView
{
    public MyWebView(Context context)
    {
        super(context);
    }

    // Note this!
    @Override
    public boolean onCheckIsTextEditor()
    {
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev)
    {
        switch (ev.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                if (!hasFocus())
                    requestFocus();
            break;
        }

        return super.onTouchEvent(ev);
    }
}
6 голосов
/ 03 апреля 2013

однострочный ответ, и он прекрасно работает

// define webview for browser
wb = (WebView) findViewById(R.id.webView1);
wb.requestFocusFromTouch();

где wb - мой объект webView

4 голосов
/ 24 октября 2013

Была та же проблема, и ни одно из вышеприведенных решений не работало.Это проснулось для меня

    <CustomWebView
    android:id="@+id/webView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:focusable="true"
    android:focusableInTouchMode="true" />
4 голосов
/ 10 декабря 2012

Для тех из вас, кто ищет решение, когда WebView в AlertDialog, ответ здесь решил эту проблему для меня: Показать программную клавиатуру в AlertDialog с WebView внутри (Android)

1 голос
/ 20 ноября 2012

У меня была такая же проблема с Jelly Bean, но ни одно из вышеперечисленных решений не помогло мне.Это решение работало для меня на JellyBean

WebView webView = new WebView(getActivity(), null, android.R.attr.webViewStyle);

Иногда android.R.attr.webViewStyle не применяется по умолчанию.Это гарантирует, что стиль всегда применяется.

0 голосов
/ 25 сентября 2017

Чтобы упростить задачу, и поскольку другие решения имеют проблемы, работающие на всех устройствах или при любых условиях, я всегда использую небольшой взлом, чтобы преодолеть эту проблему, не касаясь кода, просто добавьте скрытый editText к макет содержит webView, который автоматически предоставит фокус всему виду, и вам больше не придется беспокоиться о текстовых полях webView:

<EditText
    android:id="@+id/kb_holder"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:inputType="text"
    android:maxLines="1"
    android:visibility="gone" /> 

Итак, весь макет будет выглядеть так:

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

    <EditText
        android:id="@+id/kb_holder"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:inputType="text"
        android:maxLines="1"
        android:visibility="gone" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>
0 голосов
/ 24 ноября 2015

попробуйте это -> имя - это имя поля и убедитесь, что оно не имеет атрибута автофокуса.

    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            mWebView.loadUrl("javascript:document.getElementById(\"firstname\").focus();");
        }
    });
0 голосов
/ 13 октября 2011

У меня была точно такая же проблема, ни одно из вышеперечисленных решений не помогло мне.После долгих попыток я наконец нашел проблему.

Некоторые из различных веб-страниц, которые я отображал с помощью WebView, не вписывались в веб-представление должным образом, и в результате div (или некоторый другой html-компонент) былинезаметно накладывается на поля ввода.Хотя поля ввода казались выбранными при касании, они не позволяли бы вводить текст (даже если бы мне удалось поднять экранную клавиатуру с помощью трекбола).

Итак, решение.

WebView.getSettings().setUseWideViewPort(true);

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

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...