项目可见性无法在脚本中运行

时间:2014-06-25 19:19:50

标签: java android

我的布局文件中有以下内容:

<?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);
    }
}

1 个答案:

答案 0 :(得分:1)

文档说明代码是在不同的Thread中运行的,所以当然,你不能像这样更新你的UI,请看这里:

http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)

  
      
  • 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);
       }
    });

}