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

这里布局可以是你的父母或外布局。

+0

谢谢。看起来你的代码中有2个错误。 1.(明显的一个)监听器是接口,而不是类,你必须实现onGlobalLayout(),而不是覆盖它。注释是不需要的。 2.我不知道为什么,但onGlobalLayout()的一个调用是不够的。如果删除实例,它将停止工作。我会试着找出它被调用的频率来决定,我应该删除它。 (如果我应该那么,也许,当左/上/右/底已经是我想要的,而不是立即)。 – noober 2012-04-22 11:41:40

+0

无论如何,它的工作,所以再次感谢你。 – noober 2012-04-22 11:44:50

+0

它只被调用两次。我认为离开听众是可以的。 – noober 2012-04-22 12:00:55

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

试试这个代码::::

+0

不幸的是,我不明白如何处理布局参数。我尝试了onCreate中的代码,无济于事。 – noober 2012-04-22 11:49:19

+0

任何方式解决您的问题? – 2012-04-22 11:51:57

+0

是的,我从OnGlobalLayoutListener做布局,它的工作原理。有关详细信息,请参阅blessenm的答案。 – noober 2012-04-22 12:04:26