2013-07-31 6 views
1

Застрял на этом какое-то время. У меня есть webviewfragment, в котором есть html-файл, который я создал, загружен. В html-файле есть некоторый javascript, который позволит мне вызвать некоторые методы в моем приложении для Android. Вот HTML:метод, вызванный интерфейсом javascript wint update view

<!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. Вот код для функции test1() в tabsFrag:

public void test1() { 

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

b1 есть кнопка внутри вкладки фраг. Этот код отлично работает, как я показал. Но если я сменю команду журнала, чтобы:

public void test1() { 

    b1.setVisibility(View.GONE); 
} 

Учитывая, что видимость Б1 была в настоящее время VISIBLE, это не изменит видимость на эмуляторе (но не врезаться, API 18), но будет простаивать и аварии на планшете я должен проверить. Вкладка галактики Samsung 4.0.4.

Если я вызываю метод test1() в tabsFrag из любого другого метода, пока действие не произошло из области карты, щелкните в html-файле, установив видимость, отлично работает без сбоев или чего-то еще.

Я не уверен, как реализовать try catch блоки здесь.

любая помощь, которую я мог получить, был бы замечательным.

ответ

4

Используйте ui thread для изменения состояния просмотра.

@JavascriptInterface 
    public void TestMethod() { 

     runOnUiThread(new Runnable(){ 

      public void run(){ 

       mCallback.addTab(); 
      } 

     }); 

    } 
+0

спасибо. Я только что обнаружил, что прошлой ночью. Оно работает. Я приму свой ответ. – A2345sooted

Смежные вопросы