1

我试图在我的线性布局中缩放图像以填充可用空间,但我不明白我得到的布局宽度的值。这是我的 main.xml 布局文件的相关部分:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LeftButtonsLayout"
    android:layout_width="0dip"
    android:layout_height="fill_parent"
    android:layout_weight="10"
    android:orientation="vertical" >

    <TextView
    android:id="@+id/Jump"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/jump"
    android:textStyle="bold"
    android:padding="5dip"
    />
    <ImageView
    android:id="@+id/JumpButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:src="@drawable/jump"
    android:contentDescription="@string/jump"
    android:padding="5dip"
    />
<LinearLayout

这是我的活动的 onCreate() 方法,它有一个调试打印:

public void onCreate (Bundle savedInstanceState) {

    setContentView(R.layout.main);

    LinearLayout leftButtonsLayout = (LinearLayout) findViewById(R.id.LeftButtonsLayout);
    imageView = (ImageView) findViewById(R.id.ResetButton);

    Log.d("DEBUG", CLASS_NAME + "scaleLeftButtonsLayoutContents: \n" + 
          "linear layout height: " + leftButtonsLayout.getHeight() + "\n" +
      "text height: " + ((TextView)findViewById(R.id.Jump)).getHeight()  + "\n" +
          "image height: " + imageView.getLayoutParams().height); 

}

1) 如果我在 Log.d() 调试打印之后放置 setContentVew() 调用,我会得到一个空指针异常。为什么?在视图上使用之前,是否没有为 LinearLayout 分配内存?

2)我看到的打印是:线性布局高度:0 文本高度:0 图像高度:-2 我在这里做错了什么?我希望在这里看到合理的值,因为我可以在设备屏幕上看到 imageView。

3) 我打算使用以下方法缩放图像:imageView.getLayoutParams().height = newHeight。这样做对吗?这样做会自动更新屏幕上的 imageView,还是我必须再次执行 setContentView()?

在此先感谢您的帮助。

更新

谢谢大家的回答。我已经覆盖了我的活动的 onWindowFocusChanged() 方法,但是当我检查下面嵌套的 ImageView 的大小时,它报告为 -2。调整它的大小是可行的,但我很好奇为什么它应该有一个理智的值时是-2。我的代码如下:

@Override
public void onWindowFocusChanged (boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    if (hasFocus)
        scaleLeftButtonsLayoutContents();
}


private void scaleLeftButtonsLayoutContents () {
    LinearLayout leftButtonsLayout = (LinearLayout)findViewById(R.id.LeftButtonsLayout);

    imageView = (ImageView) findViewById(R.id.JumpButton);      
    Log.d("TAG", CLASS_NAME + "JumpButton.height " + imageView.getLayoutParams().height);
    imageView.getLayoutParams().height = verticalSpaceAvailable;
    imageView.getLayoutParams().width = verticalSpaceAvailable;

    leftButtonsLayout.requestLayout();
}

这会产生打印: JumpButton.height -2

调整大小会产生一个健全的图像,但为什么初始高度是-2?

4

3 回答 3

3

为了回答你的观点,

1)这是因为你还没有初始化你的Button或ImageView。由于您在执行此操作之前调用了 Log,显然 Button 和 ImageView 为空,因此您会收到异常。

2)初始化并不意味着您的视图被完全绘制为您提供宽度和高度。所以你必须提供时间让自己被吸引。但不幸的是,我们不知道绘制的确切时间。所以Android提供了这个方法,

  @Override 
public void onWindowFocusChanged(boolean hasFocus) 
{ 
   // which gets called when your view is drawn. 
 }  

刚才在这里回答了一个类似的问题。

所以你要做的是,在你的活动中的这个方法中添加你的日志,然后检查结果的宽度和高度。

3)要回答您的第三个问题,您绝对不应该再次调用 setContentView() ,这可能会引发其他一些异常。但是在考虑缩放时,您可能会使用一些位图来执行此操作。

于 2012-06-18T08:07:18.860 回答
3

这里有一些答案给你:

1)如果您在调用 view.getHeight() 之后放置 setContentView ,您将获得空指针,因为该视图未在 Activity 内容上设置,因此在将其设置为 Activity 内容之前您无法获得对它的引用

2)您会看到,因为视图没有时间进行布局..如果您想查看视图的高度/宽度,最好使用这样的 ViewTreeObserver 侦听器:

view.getViewTreeObserver().addOnGlobalLayoutListener(new     ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                /* don't forget to remove the listener after you use it once */
                view.getViewTreeObserver().removeGlobalOnLayoutListener(this);

                Log.d("MY VIEW WIDTH","width:"+view.getWidth());

            }
        });

3)设置视图的布局参数后,不要忘记调用view.requestLayout()以确保您的视图将刷新。您不必再次调用 setContentView()。

编辑:如果您想查看线性布局的子视图,LinearLayout 的宽度必须至少为 wrap_content 如果不是 fill_parent 或大于 0 的值。

于 2012-06-18T08:15:18.030 回答
1

你不能这样做。因为线性布局是您活动的主要容器。您不能提供android:layout_weight="10"android:layout_width="0dip"主布局。在此之外创建一个线性布局android:id="@+id/LeftButtonsLayout",并将布局高度和宽度设置为fill_parentor match_parent。这将适用于您的情况。

还有一件事,你不能允许在setContentView.

于 2012-06-18T08:12:49.920 回答