2013-07-31 4 views
1

잠시 동안 여기에 집착했습니다. 내가 만든 HTML 파일이있는 webviewfragment 있습니다. html 파일에서 내 안드로이드 응용 프로그램에서 몇 가지 메서드를 호출 할 수있는 몇 가지 자바 스크립트입니다.javascript 인터페이스에서 호출하는 메서드는 업데이트보기가 표시되지 않습니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title></title> 
</head> 

<body> 
<img src="Guideline1.gif" usemap="#Guideline9" border="0" /> 
<map name="Guideline9" id="generalGuideline9"> 
<area shape="rect" coords="124,329,290,357" onClick="Android.TestMethod();" /> 
</map> 


</body> 
</html> 

WebViewFragment 코드는 다음과 같습니다 : 다음은 HTML입니다

@SuppressLint("JavascriptInterface") 
public class MyWebView extends WebViewFragment { 

android.webkit.WebView wv; 
String name2; 
String fileName2; 
String itemFileName; 

CommunicateWithMyWebView mCallback; 

public interface CommunicateWithMyWebView { 
    public void toggleActionBar(); 
    public void addTab(); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    try { 
    mCallback = (CommunicateWithMyWebView) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement CommunicateWithMyWebView"); 
    } 

} 



@SuppressLint("SetJavaScriptEnabled") 
@Override 
public void onResume() { 
    super.onResume(); 

    name2=getArguments().getString("name2"); 
    fileName2=getArguments().getString("fileName2"); 
    itemFileName = "file:///android_asset/" + fileName2 + ".html"; 

    wv = getWebView(); 

    wv.getSettings().setJavaScriptEnabled(true); 

    wv.addJavascriptInterface(new WebAppInterface(this.getActivity()), "Android"); 

    wv.getSettings().setBuiltInZoomControls(true); 

    wv.getSettings().setLoadWithOverviewMode(true); 

    wv.getSettings().setUseWideViewPort(true); 

    wv.setLongClickable(true); 

    wv.setOnLongClickListener(new OnLongClickListener() { 

     public boolean onLongClick(View v) { 

      mCallback.toggleActionBar(); 
      return false; 
     } 
    }); 

    wv.loadUrl(itemFileName); 
} 

public class WebAppInterface { 
    Activity mContext; 

    WebAppInterface(Activity activity) { 
     mContext = activity; 
    } 

    @JavascriptInterface 
    public void TestMethod() { 


     mCallback.addTab(); 
    } 
} 

}

이 부모 활동의 메소드를 호출 내 webviewfragment을 가지고있는 점, 날을 얻는다는 일하고있다. MainActivity는 CommunicateWithMyWebView 인터페이스를 구현합니다. 여기 addTab() 메소드가 주요 활동 코드의 부분이다 :

public void addTab() { 

    tabsFrag.test1(); 

} 

tabsFrag는 MainActivity에 의해 표시되는 또 다른 단편이다. tabFrag :

public void test1() { 

    Log.d("MyApp", "" + b1.getText()); 
} 

b1이 탭 조각 내에있는 버튼 인 test1() 함수의 코드는 다음과 같습니다. 이 코드는 내가 본 것처럼 잘 작동합니다. 그러나 나는에 로그 명령을 변경하는 경우 :

public void test1() { 

    b1.setVisibility(View.GONE); 
} 

B1의 가시성이 현재 표시했다, 그것은 에뮬레이터에서 가시성을 변경되지 않습니다 (하지만, API (18)을 충돌하지 않습니다)하지만 실속 충돌합니다 감안할 때 태블릿에서 나는 시험해야한다. 4.0.4를 실행하는 삼성 갤럭시 탭.

다른 메소드에서 tabsFrag의 test1() 메소드를 호출하는 경우 html 파일의 맵 영역에서 발생한 동작이 아니었던 경우 가시성 설정이 충돌이나 문제없이 잘 작동합니다.

여기서 try catch 블록을 구현하는 방법을 잘 모르겠습니다.

내가 얻을 수있는 모든 도움이 좋을 것입니다.

답변

4

뷰 상태를 변경하려면 ui 스레드를 사용하십시오.

@JavascriptInterface 
    public void TestMethod() { 

     runOnUiThread(new Runnable(){ 

      public void run(){ 

       mCallback.addTab(); 
      } 

     }); 

    } 
+0

감사합니다. 어젯밤 늦게 발견 했어. 그것은 작동합니다. 나는 당신의 대답을 받아 들일 것입니다. – A2345sooted

관련 문제