1

しばらくこれで立ち往生しています。私が作成してロードしたhtmlファイルを持つwebviewfragmentがあります。HTMLファイルには、Androidアプリケーションでいくつかのメソッドを呼び出すことができるjavascriptがあります。html は次のとおりです。

<!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 コードは次のようになります。

@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 によって表示される別のフラグメントです。tabsFrag の test1() 関数のコードは次のとおりです。

public void test1() {

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

b1 は、タブ フラグメント内のボタンです。私が示したように、このコードは正常に動作します。しかし、ログコマンドを次のように変更すると:

public void test1() {

    b1.setVisibility(View.GONE);
}

b1 の可視性が現在 VISIBLE であるとすると、エミュレーターでの可視性は変更されませんが (API 18 ではクラッシュしません)、テストする必要があるタブレットで停止してクラッシュします。4.0.4 を実行している Samsung Galaxy タブ。

他のメソッドから tabsFrag の test1() メソッドを呼び出すと、アクションが html ファイルのマップ エリア クリックから発生していない限り、可視性の設定はクラッシュなどなしに正常に機能します。

ここで try catch ブロックを実装する方法がよくわかりません。

私が得ることができるどんな助けも素晴らしいでしょう。

4

1 に答える 1

5

ビュー ステートを変更するには、UI スレッドを使用します。

@JavascriptInterface
    public void TestMethod() {

        runOnUiThread(new Runnable(){

            public void run(){

              mCallback.addTab();
            }

        });

    }
于 2013-07-31T11:47:06.677 に答える