2012-10-11 5 views
-1

활동 전반에서 webview를 재사용하려고합니다. 여기 제가하는 일의 샘플이 있습니다.텍스트를 선택하고 "웹 검색"을 클릭하면 응용 프로그램이 충돌합니다.

두 가지 활동, MainSecondary이 있습니다.

메인의 onResume()에서 웹보기 개체를 만들고 응용 프로그램 컨텍스트에 저장합니다.

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에있는 버튼을 눌러에, 나는 활동 Secondary에 데려가. 여기에 내 Application 개체에서 이미로드 된 webview를 가져와 ViewGroup에 첨부합니다.

SecondaryonCreate()에서 - WebViews 안드로이드 매우 느린 내가 정말 Secondary 활동에 관해서이 프리로드를 원하기 때문에

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

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

나는이 모든 일을하고있다.

이 방법이 완벽하게 작동하지만 여기에 문제가 있습니다. 보조 활동에있을 때 특정 텍스트를 선택하여 길게 누르면 웹 검색을 클릭하면 내 앱이 다운됩니다. 이 문제를 해결할 수있는 방법이 있습니까? 나는이 프리 로딩 작업을 원합니다. 동일한 이유로 WebView를 액티비티 컨텍스트로 초기화 할 수 없습니다.

enter image description here

UPDATE - 나는 당신이 웹보기의 활동을 호출 할 경우 당신의 의도에 아래에 언급 된 플래그를 추가 할 필요가 있다고 생각

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) 
+0

예외 세부 사항은 어디에 있습니까? logcat? –

+0

추가됨. 그리고 이것은 JellyBean에서 완벽하게 작동합니다. 이것은 Android의 버그입니까? – Enigma

+0

startActivity()를 사용할 코드를 추가 할 수 있습니까? –

답변

0

,

- 여기

는 로그 캣 출력 내가 얻을입니다

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

또는 적어도 이것이 무엇입니까? ogcat 오류 보고서

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

그래서 나는 이것이 당신이 낮은 안드로이드 버전을 위해 그것을 할 방법이라고 생각, 제안한다. 위의 솔루션이 작동하지 않는 경우 다음과 같이 당신의 활동 상황과 모든 applcationContext 교체

, 대신

,

WebView wv = new WebView(getApplicationContext()); 

은뿐만 아니라 여기

WebView wv = new WebView(activity.this); 

시도 , 그러나 당신이 사용할 수있는 모든 장소에서 getApplicationContext()

+0

내가 활동을 시작할 때 충돌이 발생했다면, 당신이 말한 것이 문제 일 수도 있습니다. 그러나이 시스템 작업 표시 줄의 '웹 검색'옵션이 어쩌면 다른 활동을 브라우저로 열려고 할 때 이런 일이 발생합니다. 내가보기에는 액션 바 구현에 FLAG_ACTIVITY_NEW_TASK을 추가해야합니다. – Enigma

+0

방금 ​​logcat에서 예외를 기반으로 답변을 제공했습니다. 시도해 봤어? –

+0

예. 도움이되지 않습니다. 필요한 경우 샘플 프로젝트를 제공 할 수 있습니다. – Enigma

관련 문제