我的布局文件中有以下内容:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:id="@+id/topNav"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop_surfing"/>
<TextView
style="@style/Counter"
/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
</LinearLayout>
当我运行方法surf()
时,我假设我的线性布局会显示,但没有任何反应。我是否需要做其他事情来刷新活动或什么?
以下是主要活动:
public class MainActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
// Snipped code //
WebView webView = (WebView)findViewById(R.id.webview);
webView.addJavascriptInterface(new JavaScriptBinder(this), "$js");
// Snipped code //
}
}
这是二级课程:
public class JavaScriptBinder{
Activity context;
JavaScriptBinder(Activity context){
this.context = context;
}
public void surf(String memberId){
// Snipped code //
LinearLayout top = (LinearLayout)context.findViewById(R.id.topNav);
top.setVisibility(View.VISIBLE);
}
}
从webview中加载的javascript文件中调用 surf()
:
function startSurfing(){
var users = document.getElementsByClassName("user");
for(var i = 0; i < users.length; i++){
users[i].addEventListener("click", function(e){
e.stopPropagation();
with(document.getElementById("black-overlay").style){
display = "block";
backgroundColor = "rgba(0,0,0,0.7)";
}
var userId = this.dataset.id;
$js.surf(userId);
}, false);
}
}
答案 0 :(得分:1)
文档说明代码是在不同的Thread中运行的,所以当然,你不能像这样更新你的UI,请看这里:
- JavaScript与此WebView的私有后台线程上的Java对象进行交互。因此需要注意保持螺纹安全。
所以你需要做的是在UI线程中运行该代码。
此外,您需要使用@JavascriptInterface
注释您的方法,以便Android 4.2及更高版本可以调用该方法。
试试这个:
@JavascriptInterface
public void surf(String memberId){
// Snipped code //
final LinearLayout top = (LinearLayout)context.findViewById(R.id.topNav);
context.runOnUiThread(new Runnable(){
@Override
public void run(){
top.setVisibility(View.VISIBLE);
}
});
}