Android webview布局 - 何时设置位置?
问题描述:
我有以下XML:Android webview布局 - 何时设置位置?
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/rl"
android:background="@color/red"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="10dp"
android:layout_height="10dp" />
</RelativeLayout>
当我打电话:
view.layout(50, 50, 1024 - 50, 600 - 50);
从的onCreate()和在onStart(),它没有任何效果。但是,当我将相同的调用添加到shouldOverrideKeyEvent()并按下一个键时,它可以工作。我想这是因为我的设置正在被XML的设置覆盖。所以,问题是:我应该在什么时候尽快调用layout(),但在android:layout_width =“10dp”和android:layout_height =“10dp”之后已经应用了。
UPDATE
我用blessenm的解决方案。
private class LayoutListener implements OnGlobalLayoutListener
{
public void onGlobalLayout()
{
Display display = getWindowManager().getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
// Workaround for a 'fill_parent' bug on my tablet (Kindle Fire).
_WebView.layout(0, 0, screenWidth, screenHeight);
_WebView.loadUrl("http://192.168.1.2");
//_Layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
如果我评论removeGlobalOnLayoutListener()出,它停止工作。调试器显示它被调用两次,所以我想第二次调用实际上只是设置了大小。所以,我决定不删除这个监听器(如果它被称为2次,那不是性能杀手)。它似乎没问题,直到我意识到这是每当我点击一个永久的底部条形图时,就会引起工具条的出现。由于我在设置布局之后加载了一个网站,因此每次都会重新加载。我只有在视图的大小正确时才加载站点,因为服务器发送的内容是针对给定大小进行了特别优化的。
这就是为什么我不能离开听众,应该删除它。但当?数到2?它可以在任何设备/ Android版本上运行吗?为什么它在第二个电话中工作,但不是第一个电话?
问候,
答
我认为它是因为onCreate事件的布局没有被抽中或测量呢。因此,如果您尝试在该事件中调用布局,则不会产生影响。尝试把你的代码放入viewtreeobserver中,它可能会工作。
添加到您的活动的onCreate
ViewTreeObserver vto = layout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.layout(50, 50, 1024 - 50, 600 - 50);
layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
这里布局可以是你的父母或外布局。
答
WebView webview = (WebView)findViewById(R.id.webview);
MarginLayoutParams marginsParams = new MarginLayoutParams(webview.getLayoutParams());
marginsParams.setMargins(50, 50,1024-50, 600-50);
RelativeLayout.LayoutParams lp = new LayoutParams(marginsParams);
webview.setLayoutParams(lp);
试试这个代码::::
谢谢。看起来你的代码中有2个错误。 1.(明显的一个)监听器是接口,而不是类,你必须实现onGlobalLayout(),而不是覆盖它。注释是不需要的。 2.我不知道为什么,但onGlobalLayout()的一个调用是不够的。如果删除实例,它将停止工作。我会试着找出它被调用的频率来决定,我应该删除它。 (如果我应该那么,也许,当左/上/右/底已经是我想要的,而不是立即)。 – noober 2012-04-22 11:41:40
无论如何,它的工作,所以再次感谢你。 – noober 2012-04-22 11:44:50
它只被调用两次。我认为离开听众是可以的。 – noober 2012-04-22 12:00:55