3

2 つのタブがあり、それぞれに Web ビューが含まれています (簡単にするために Google ページを使用)。Web ビューは正常にロードされますが、Google の検索フィールドにテキストを挿入しようとすると、ソフト キーボードが期待どおりに表示されますが、テキストを書き始めるとフィールドがフォーカスを失います。ソフト キーボードは、Web ページ レイアウトではなく、タブ レイアウトの一部と見なされているようです。

見つけたすべての解決策を何時間もかけて試しましたが、私の場合はどれもうまくいきました。例: Android WebView がユーザー入力を拒否するのはなぜですか? および Web ビュー内に入力できません

他のアイデアは大歓迎です!関連するコードはすべて以下に掲載されていると思いますが、それ以外の場合はお尋ねください。

ありがとう!

MainActivity.java (フラグメントアクティビティ)

public void onTabChanged(String selected) {

Fragment shownFragment = fm.findFragmentByTag(shown);
FragmentTransaction ft = fm.beginTransaction();

// Remove the current fragment from screen
if (shownFragment != null) {
    ft.remove(shownFragment);
}

// Change to the new fragment
if (selected.equals("Tab1")) {
    shown = "Tab1";
    ft.add(R.id.fragment_content, new WebFragment(), "Tab1");

} else if (selected.equals("Web")) {
    shown = "Web";
    ft.add(R.id.fragment_content, new WebFragment(), "Web");

}

ft.commit();
}

WebFragment.java

public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {

webView = (WebView) inflater.inflate(R.layout.activity_web_fragment, container, false);
webView.getSettings().setJavaScriptEnabled(true);

webView.loadUrl("http://www.google.com");
webView.setWebViewClient(new MyWebViewClient());

Log.v("WebFragment", "Returning web view");
webView.requestFocus(View.FOCUS_DOWN);

return webView;

}

private class MyWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
}

@Override
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
    if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) && view.canGoBack()) {
    view.goBack();
    return true;
    }

    return super.shouldOverrideKeyEvent(view, event);
}
}

activity_main.xml

<LinearLayout android:id="@+id/LinearLayout1" 
android:orientation="vertical" 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent"
android:layout_height="match_parent">

<TabHost android:id="@android:id/tabhost" 
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_marginTop="2dp">

    <LinearLayout android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:orientation="vertical">

        <HorizontalScrollView android:id="@+id/hScrollView" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:fillViewport="true" 
            android:scrollbars="none">

            <TabWidget android:id="@android:id/tabs"
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:tabStripEnabled="true"/>
        </HorizontalScrollView>

        <FrameLayout android:id="@android:id/tabcontent"
            android:layout_width="0dp" 
            android:layout_height="0dp"
            android:layout_weight="0" />

        <FrameLayout android:id="@+id/fragment_content"
            android:layout_width="match_parent" 
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>
</TabHost>

activity_web_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<WebView android:id="@+id/webView" 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" 
android:layout_height="fill_parent" />
4

1 に答える 1

3

こんにちはSafime、解決策を見つけたと思います。バグを修正すると主張されているように、あなたは周りを検索し、インターネット上でこの回避策の投稿を見たことがあると確信しています:

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

しかし、それは私にとってはうまくいかなかったので、少し変更してうまくいきました。これがお役に立てば幸いです。

Webview.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_UP:
                    //The key is this line. 
                    v.requestFocusFromTouch();  
                    break;
            }               
            return false;
        }
    });
于 2013-07-23T20:42:16.823 に答える