web-dev-qa-db-ja.com

Android WebViewがユーザー入力を拒否するのはなぜですか?

Facebookのログインページを表示するためにWebViewを使用するAndroidアプリケーションを開発しています。ページは美しく読み込まれ、ユーザー名/パスワードのテキストボックスを選択できますが、それらを入力しますつまり、それらには間違いなく入力フォーカスがありますが(オレンジのフォーカスハイライトボックスと点滅するカーソルがあります)、それらを入力してもまったく何も起こりません。確かではありませんが、フォームボタンも再生されていると思いますup-フォームを送信するのではなく、単にページを更新しているように見えます。

明確にするために、私はFacebookを実行することに特に関心がありますが、他のWebサイト(Googleなど)も同じ動作をするため、これはFacebookの問題ではないと確信しています。

誰が問題になるかもしれないアイデアを持っていますか?

36
Mac

問題であったのは明らかにWebViewにフォーカスがないことでした。

矢印キーを使用してテキストボックスにフォーカスを取得すると、テキストボックスが機能することがわかったので、どこかにフォーカスがない問題、おそらくWebViewにフォーカスがない問題があると理論的に考えました。案の定、次の行を追加すると問題が解決するようです。

webView.requestFocus(View.FOCUS_DOWN);

私はまだ問題が最初に発生した理由を正確に説明するのにまだ途方に暮れています-テキストボックスは、タップされたりフォーカスされたりしてフォーカスを受け取るかどうかにかかわらず機能するはずですが、少なくとも私には機能するように見える解決策があります。

ご入力いただきありがとうございます。

44
Mac

@Macこの1行を行います:

webView.requestFocus(View.FOCUS_DOWN);

あなたの問題を解決しましたか?私は私の場合ではありませんでした、しかしこれはそうします:

mWebView.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; 
        }
});

ご参考までに。

15
DiveInto

これらはほとんど持っています

webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setUseWideViewPort(true);
webview.requestFocus(View.FOCUS_DOWN);

それでも機能しない場合は、以下の代替策を使用してください

代替1

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;
        }
    });

代替2

webview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                v.requestFocusFromTouch();  
                break;
        }               
        return false;
    }

});
11
touchchandra

私のケースがあなたのケースとまったく同じかはわかりませんが、

CSS行を1つ追加すると問題を解決できることがわかりました。

追加するだけです

input{
    -webkit-user-select: text;
}

私のCSSに、それから問題が解決しました!

9
newbeeep

申し訳ありませんが、これでうまくいきませんでした。これはあなたのコンテキストに依存すると思います。私の場合、問題はhtmlポップアップ(絶対div)内で発生しました。他のすべての入力フィールドは大丈夫でした。

問題を分析すると、ウェブビューのバグであることがわかりました。他の固定/絶対位置divを含む固定位置divは、ページの入力フィールドを分割します。したがって、私があなたに代わって書いた規則(再定式化することをためらわないでください):

ページに、デフォルトで配置されていないネストされたdiv(つまり、絶対、固定など)を持つ固定されたdivがある場合、入力フィールドを含むページ内の次の絶対位置のdivのいずれかは、予期しない動作をします。

そのため、入力フィールドをページの上部に配置するか(可能な場合)、他の固定/絶対divにネストされる絶対divを避けます。それは役立つはずです。

詳細と潜在的な回避策が必要な場合は、ブログに何かを投稿しました: http://Java-cerise.blogspot.com/2012/02/Android-web-view-inputfields-refuse-to.html

6
twingocerise

私の場合、バックスタックの前のフラグメントのTabHostは、キーを押すたびにWebView入力からフォーカスを奪っていました。修正方法は次のとおりです。

tabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
  @Override
  public void onViewDetachedFromWindow(View v) {}

  @Override
  public void onViewAttachedToWindow(View v) {
    tabHost.getViewTreeObserver().removeOnTouchModeChangeListener(tabHost);
  }
});

このトピックの詳細については、 https://code.google.com/p/Android/issues/detail?id=2516 を参照してください。

5

他のWebサイトも同じ動作をするため、問題かどうかはわかりませんが、JavaScriptを有効にしましたか? WebView はデフォルトでは有効になりません。

WebView webView = (WebView)findViewById(R.id.yourWebView);
webView.getSettings().setJavaScriptEnabled(true);
2
wf.

私はこの問題を解決するために多くの時間を費やしています。最後に、それはWebViewに関するものではないことに気付きました。私の場合、ダイアログ内にウェブビューがあります。ダイアログをキャンセルしてアクティビティも終了するために、押し下げられたボタンを処理したい。そして、私は以下のコードを書きました:

private void setOnBackPressed() {
    this.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                dialog.dismiss();
                activity.finish();
            }
            return true;
        }
    });
}

したがって、キーボードを使用すると、このメソッドは何らかの方法ですべてのキー入力を拒否し、テキストフィールドに表示されません。

戻り値をfalseに変更しただけです。したがって、適切に機能しました。

それが役に立てば幸い!!

[〜#〜] ps [〜#〜]:このメソッドは、Dialogクラスを拡張する私のダイアログクラス内にあります

2
sembozdemir

ここに掲載されている他のすべてのソリューションを試しましたが、どれもうまくいきませんでした。

代わりに、WebViewを拡張し、KeyEventsを強制的にディスパッチするInputConnectionをオーバーライドしました。

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
  return new BaseInputConnection(this, false);
}
2
afathman

4.1.2と4.2.2でページをロードするときに偶然起こり、検索の1日後に、答えを見つけました here (コメント#18)

元の投稿からの引用:

WebViewを使用してレンダリングしたさまざまなWebページの一部がWebViewに適切に適合せず、その結果、div(または他のHTMLコンポーネント)が入力フィールドの上に見えないように配置されていました。タッチすると入力フィールドが選択されたように見えますが、テキストインプットは許可されません(たとえトラックボールを使用してソフトキーボードを起動できたとしても)。

だからソリューション。

webview.getSettings().setUseWideViewPort(true);

これで問題が完全になくなるわけではありませんが、サイトが設計されているPCブラウザーのように表示されます。オーバーレイの変更が少ない。

1
Mohsen Afshin

WebViewが最初のページをロードしているときにスプラッシュ画像を表示しているため、この問題が発生しました。 onPageFinishedでwebviewをView.VISIBLEに設定していますが、テキストボックスにフォーカスすることはできますが、テキストボックスに入力することはできません。私も、webview requestFocusをView.FOCUS_DOWNに設定するための修正が機能することを確認できます。

NB。 onResumeでwebviewをView.VISIBLEに設定した場合、問題は発生しませんが、私の場合、スプラッシュ画像がすぐに消えてしまいます。

1
jhad

異なる可能性のある問題を見つけましたが、同じように聞こえます。 Android 2.3ネイティブブラウザでは、ページの固定位置要素がある場合、選択ボックスが壊れることがあります。

2.3デバイスのこの問題の回避策は、固定位置の親に空の子要素を許可しないことです。したがって、

<div style="position:fixed">
  <div>
    <span>not empty</span>
    <span></span>
  </div>
</div>

なるだろう

<div style="position:fixed">
  <div>
    <span>not empty</span>
    <span>&nbsp;</span>
  </div>
</div>

これで問題が解決しました。

これがあなたの問題の問題であったかどうかはわかりませんが、これは事後1年以上ですが、私は現在、アプリの別の修正された位置の問題を扱っており、私は共有していないので、共有するだろうと考えましたtの回避策が見つかりました。

0
Daniel

私のコンテキスト(外部URLを含むウェブビュー)では、このフラグメントは機能します:

    webview.setOnTouchListener(new View.OnTouchListener() {
       @Override
       public boolean onTouch(View v, MotionEvent event) {
           switch (event.getAction()) {
               case MotionEvent.ACTION_DOWN:
               case MotionEvent.ACTION_UP:
                   v.requestFocusFromTouch();  
                   break;
           }               
           return false;
       }

});

エラーは、タッチするたびにWebViewがフォーカスを失っていたためです。

0
edwindh

私は同様の問題に直面しました、そのテキスト入力はウェブビューで機能しません。テキスト入力に集中するとキーボードが表示されますが、文字を入力することはできません。

長い解決策を探したところ、これで問題が解決することがわかりました。

body {
    -webkit-transform: translate3d(0,0,0);
    -moz-transform: translate3d(0,0,0);
    -ms-transform: translate3d(0,0,0);
    -o-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

私が理解したように、このルールは一部のデバイスにハードウェアアクセラレーションを実行させます。 translate3d(0,0,0)についての詳細 こちら

一方、これによると article どこでもGPUアクセラレーションを使用することは推奨されません。