0

我有以下 XML:

<?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" 已经应用之后。

更新

我使用 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 版本吗?为什么它适用于第二个电话,但不适用于第一个电话?

问候,

4

2 回答 2

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

试试这个代码::::

于 2012-04-22T02:25:50.297 回答
2

我认为这是因为在 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); 
    } 
}); 

其中布局可以是您的父布局或外部布局。

于 2012-04-22T01:56:00.420 回答