我正在使用API 19(android4.4)开发一个android应用程序。我有一个linearLayout视图嵌套了另一个linearLayout视图。现在,我想通过js代码来更改linearLayout的高度,但这是行不通的。
active_main.xml
<LinearLayout xmlns="...." ...
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@id/sContainer"
tools:context=".MainActivity">
</LinearLayout>
java测试代码:
...
private LinearLayout webViewContainer;
...
private void initView(){
LinearLayout container=(LinearLayout)findViewById(R.id.sContainer);
//add a child linearLayout
webViewContainer=new LinearLayout(this);
LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,200);
webViewContainer.setLayoutParams(layoutParams);
//add a child webview in this linearlayout
WebView webview=(WebView)new WebView(this);
LinearLayout.LayoutParams webParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
webview.setLayoutParams(webParams);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JsInteraction(), "bridge");
webView.loadUrl("http://xxxx/index.html");
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url){
view.loadUrl("javascript:callHtml('show')");
}
});
webViewContainer.addView(webview);
container.addView(webViewContainer);
}
class JsInteraction{
@JavascriptInterface
public void expand(){
LinearLayout.LayoutParams layoutParams=webViewContainer.getLayoutParams();
layoutParams.height = 500;
webViewContainer.setLayoutParams(layoutParams);
Log.v("height", layoutParams.height+"");
}
}
index.html js代码
<script>
function callHtml(method){
case 'show':
setTimeout(function(){
bridge.expand();//call app to expand after 5s
},5000);
break;
}
</script>
日志显示layoutParams.height已更改为500,但是模拟器没有任何反应,这是我做错了吗? 另外,如果我单击一个按钮来更改layoutParams的高度,则它可以工作。
答案 0 :(得分:1)
那是“可能的”,因为您没有调用requestLayout
,但在更改布局(视图的布局无效)之后就不需要了
当某些更改使该视图的布局无效时调用此函数。这将安排视图树的布局遍历。当视图层次结构当前处于布局阶段(isInLayout()中)时,不应调用此方法。如果正在进行布局,则可以在当前布局阶段结束时(然后布局将再次运行)或当前阶段结束时接受请求。绘制框架并进行下一个布局。
因此,更改高度后,您应该致电requestLayout
...
linearLayout.requestLayout();
答案 1 :(得分:0)
我已经解决了此问题,只需将JsInteraction代码更改为以下代码:
72956 134 874 02367 458 20 042 0220 53.000 45.00