View的getWidth()和getHeight()返回0。
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); } }
从上述内容中可以整理出(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)这个问题的发生。
问题的出现原因是在某些情况下,调用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的问题。
问题的出现原因是在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的问题的方法有多种,可以根据具体的需求选择合适的方法来获取正确的宽度和高度。