-1

アクティビティ全体で webview を再利用しようとしています。これが私がやっていることのサンプルです。

と の 2 つのアクティビティがMainありSecondaryます。

Main の onResume() で webview オブジェクトを作成し、それをアプリケーション コンテキストに保存します。

    WebView wv = new WebView(getApplicationContext());
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
    wv.setWebViewClient(new WebViewClient() {

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

        @Override
        public void onPageFinished(WebView view, String url) {
            Log.e("test", "onPageFinished");
            ((WebViewReuseApplication) getApplicationContext()).setCachedWebView(view);
        }
    });
    wv.loadUrl("http://www.someurl.com/path/to/somewhere");

次に、 のボタンを押すとMain、彼を Activity に連れて行きSecondaryます。ここでは、既に読み込まれている webview をApplicationオブジェクトから取得し、ViewGroup.

onCreate()Secondary- _

    WebView cachedWebView = ((WebViewReuseApplication) getApplicationContext()).getCachedWebView();

    ((LinearLayout) findViewById(R.id.webview_holder)).addView(cachedWebView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

SecondaryAndroidではWebViewが非常に遅く、 Activityに関してはプリロードしたいので、私はこれをすべて行っています。

これは完璧に機能しますが、ここで問題が発生します。セカンダリ アクティビティのときに、特定のテキストを長押しして選択し、[Web 検索] をクリックすると、アプリがクラッシュします。これを回避する方法はありますか?私は本当にこのプリロードが必要であり、同じ理由で WebView をアクティビティ コンテキストで初期化できません。

ここに画像の説明を入力

アップデート -

これが私が得るlogcat出力です -

10-11 18:41:09.318: E/AndroidRuntime(3359): FATAL EXCEPTION: main
10-11 18:41:09.318: E/AndroidRuntime(3359): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.app.ContextImpl.startActivity(ContextImpl.java:922)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.content.ContextWrapper.startActivity(ContextWrapper.java:283)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.webkit.SelectActionModeCallback.onActionItemClicked(SelectActionModeCallback.java:139)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:2651)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.app.ActionBarImpl$ActionModeImpl.onMenuItemSelected(ActionBarImpl.java:757)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:156)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.widget.AbsListView.performItemClick(AbsListView.java:1182)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2710)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.widget.AbsListView$1.run(AbsListView.java:3465)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.os.Handler.handleCallback(Handler.java:605)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.os.Looper.loop(Looper.java:137)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at android.app.ActivityThread.main(ActivityThread.java:4511)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at java.lang.reflect.Method.invokeNative(Native Method)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at java.lang.reflect.Method.invoke(Method.java:511)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:986)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753)
10-11 18:41:09.318: E/AndroidRuntime(3359):     at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

WebView のアクティビティを呼び出すインテントに、以下のフラグを追加する必要があると思います。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

または少なくともこれはlogcatエラーレポートが示唆するものです、

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. 

したがって、これは、Androidの下位バージョンに対して行うべき方法だと思います。

上記の解決策が機能しない場合は、次のようにすべての applcationContext を Activity コンテキストに置き換えます。

それ以外の、

 WebView wv = new WebView(getApplicationContext());

試す

WebView wv = new WebView(activity.this);

ここだけでなく、getApplicationContext()を使用できたすべての場所で

于 2012-10-11T13:18:26.140 に答える