View的getWidth()和getHeight()返回0。

14 浏览
0 Comments

View的getWidth()和getHeight()返回0。

我正在动态创建Android项目中的所有元素。我想要获取按钮的宽度和高度,以便可以围绕该按钮进行旋转。我只是想学习如何使用Android语言。然而,它返回0。\n我进行了一些研究,并且发现它需要在onCreate()方法之外的某个地方完成。如果有人能给我一个示例,那就太好了。\n这是我的当前代码:\n

package com.animation;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
public class AnimateScreen extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(30, 20, 30, 0);
        Button bt = new Button(this);
        bt.setText(String.valueOf(bt.getWidth()));
        RotateAnimation ra = new RotateAnimation(0,360,bt.getWidth() / 2,bt.getHeight() / 2);
        ra.setDuration(3000L);
        ra.setRepeatMode(Animation.RESTART);
        ra.setRepeatCount(Animation.INFINITE);
        ra.setInterpolator(new LinearInterpolator());
        bt.startAnimation(ra);
        ll.addView(bt,layoutParams);
        setContentView(ll);
    }
}

0
0 Comments

从上述内容中可以整理出(View's getWidth() and getHeight() returns 0)这个问题的出现原因是因为在调用getWidth()和getHeight()方法时,UI界面还没有被正确地测量和布局。解决这个问题的方法是使用一个维度资源来定义按钮的大小,然后在布局文件和源代码中引用这个维度资源,以避免这个问题的发生。

另外,还可以使用onWindowFocusChanged()方法来获取视图的尺寸。在这个方法中,当屏幕准备就绪时,可以通过调用getWidth()和getHeight()方法来获取视图的尺寸。

以下是一个示例代码,展示了如何使用onWindowFocusChanged()方法获取视图的尺寸:

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // 在这里可以获取视图的尺寸
    int width = view.getWidth();
    int height = view.getHeight();
}

另外,还可以使用addOnGlobalLayoutListener()方法来监听视图的全局布局事件,从而在屏幕准备就绪时获取视图的尺寸。以下是一个示例代码:

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 在这里可以获取视图的尺寸
        int width = view.getWidth();
        int height = view.getHeight();
        // 在获取到尺寸之后,可以移除监听器,避免重复调用
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

通过使用onWindowFocusChanged()方法或addOnGlobalLayoutListener()方法,可以在屏幕准备就绪时正确地获取视图的尺寸,避免了(View's getWidth() and getHeight() returns 0)这个问题的发生。

0
0 Comments

问题的出现原因是在某些情况下,调用View的getWidth()和getHeight()方法返回的值为0。这可能是因为在调用这两个方法时,View的尺寸还没有被正确计算出来。解决这个问题的方法是使用View的onWindowFocusChanged()方法或View的ViewTreeObserver来获取尺寸。

在Activity中,可以在onWindowFocusChanged()方法中获取View的尺寸。这个方法在窗口焦点发生变化时被调用,可以通过参数hasFocus来判断窗口是否获得焦点。当窗口获得焦点时,可以调用View的getWidth()和getHeight()方法来获取尺寸。

但是在Fragment中,不能直接使用onWindowFocusChanged()方法来获取尺寸,因为Fragment没有这个方法。在Fragment中,可以使用View的ViewTreeObserver来获取尺寸。ViewTreeObserver可以监听View的布局变化事件,当View的布局发生变化时,可以通过ViewTreeObserver来获取最新的尺寸。

使用ViewTreeObserver获取尺寸的方法如下:

View view = getView(); // 获取Fragment的根View
ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int width = view.getWidth();
        int height = view.getHeight();
        // 在这里可以获取到View的尺寸
        // 这个方法可能会被调用多次,所以要小心使用
        // 可以在获取到尺寸后,移除监听器,避免多次调用
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

使用ViewTreeObserver获取尺寸的好处是可以在任何时候获取到View的尺寸,而不仅仅是在窗口焦点发生变化时。此外,使用ViewTreeObserver也可以避免onWindowFocusChanged()方法被多次调用的问题。

,如果在Activity中获取View的尺寸,可以使用onWindowFocusChanged()方法;如果在Fragment中获取View的尺寸,可以使用View的ViewTreeObserver。通过这两种方法,可以解决View的getWidth()和getHeight()方法返回0的问题。

0
0 Comments

问题的出现原因是在onResume()方法中,布局阶段通常还没有完成,因此无法获取到View的实际宽度和高度。解决方法有以下几种:

1. 监听绘制/布局事件:ViewTreeObserver。使用ViewTreeObserver的OnGlobalLayoutListener监听器,在布局阶段之后获取View的宽度和高度。在监听器中调用getWidth()和getHeight()方法即可。需要注意的是,为了避免重复触发监听器,需要在获取到宽度和高度后立即移除监听器。

2. 将代码添加到布局队列中:View.post()。使用View的post方法,将获取宽度和高度的代码封装在Runnable中,并通过view.post()方法将其添加到布局队列中。这样代码会在视图的测量、布局等操作之后执行,确保可以获取到正确的宽度和高度。相比于ViewTreeObserver,这种方法更简洁,并且只会执行一次。

3. 重写View的onLayout方法。在自定义的View中重写onLayout方法,在方法中调用super.onLayout()方法后即可获取到View的宽度和高度。需要注意的是,onLayout方法可能会被多次调用,因此需要谨慎处理其中的逻辑,并在第一次调用后禁用相应的代码。

4. 检查View是否已经经历了布局阶段。如果在创建UI时需要多次执行某段代码,可以使用ViewCompat.isLaidOut()方法来检查View是否已经经历了至少一次布局。只有在View已经经历了布局阶段后,才能获取到正确的宽度和高度。

附加:获取静态定义的宽度和高度。如果只需要获取静态定义的宽度和高度,可以使用View的getMeasuredWidth()和getMeasuredHeight()方法。需要注意的是,这些值可能与实际绘制后的宽度和高度不一致。

总结起来,解决获取View宽度和高度为0的问题的方法有多种,可以根据具体的需求选择合适的方法来获取正确的宽度和高度。

0