以编程方式获取布局的高度和宽度

91

我设计了一个布局,其中LinearLayout有2个子元素LinearLayoutFrameLayout,并在每个子元素中放置不同的视图。

我只想测量FrameLayout的高度和宽度,以便达到我的目的。

在程序中,我正在使用

int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getHeight();
width=fr.getWidth();

返回值对于两者都是0

尝试以下代码后,甚至包括: int height, width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getMeasuredHeight();
width=fr.getMeasuredWidth();

返回相同的值0

最后我尝试了以下代码, int height,width;

FrameLayout fr=(FrameLayout)findviewbyid(R.id.fr);
height=fr.getgetLayoutParams().height();
width=fr.getLayoutParams().width;

返回给我的是 -2-1

我想要通过编程获取任何布局的高度和宽度的解决方案?


请查看以下问题:https://dev59.com/i2865IYBdhLWcg3whO3E - VinhNT
这是一篇很好的文章,可以帮助你了解安卓视图尺寸是如何设置的以及何时进行设置。https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/ - Krešimir Prcela
19个回答

2
尝试使用来自链接的以下代码:
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
 viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
  view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
  viewWidth = view.getWidth();
  viewHeight = view.getHeight();
}
 });
}

希望这能有所帮助。

2

我最近遇到了这个问题,想为Kotlin写一下解决方法:

Original Answer翻译成"最初的回答"

my_view.viewTreeObserver.addOnGlobalLayoutListener {
       // here your view is measured
       // get height using my_view.height
       // get width using my_view.width
    }

或者

my_view.post {
       // here your view is measured
       // get height using my_view.height
       // get width using my_view.width
    }

2
如果您使用Kotlin编码,请使用这个很好的扩展函数:
inline fun View.getDimensions(crossinline onDimensionsReady: (Int, Int) -> Unit) {
    lateinit var layoutListener: ViewTreeObserver.OnGlobalLayoutListener
    layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
        viewTreeObserver.removeOnGlobalLayoutListener(layoutListener)
        onDimensionsReady(width, height)
    }
    viewTreeObserver.addOnGlobalLayoutListener(layoutListener)
}

使用方法:

view.getDimensions { width, height ->
    println("width = $width")
    println("height = $height")
}

1

对于框架:

height=fr.getHeight();
width=fr.getWidth();

屏幕相关:
width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

1

我使用DisplayMetrics获取屏幕尺寸,然后可以将宽度/高度分配给一个元素的百分比

就像这样

DisplayMetrics dmetrics = new DisplayMetrics();
int widthPixels=dmetrics.widthPixels;
int heightPixels=dmetrics.heightPixels;       

//setting the height of the button 
button_nextPuzzle.setMinHeight((int) ((heightPixels/3)*.30));

对我非常有效!!!


它不会给你所需的FrameLayout的高度。 - Prabs

1
第一个代码片段是正确的,但需要在onMeasure()执行调用它。否则,视图的大小尚未测量。

此外,您可以重写onMeasure方法,并在每次调用该方法时从中获取新的测量值。 - Steven Trigg

0

检查行为 非常简单的解决方案

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(LOG, "MainActivity - onCreate() called")

        fragments_frame.post {
            Log.d(LOG, " fragments_frame.height:${fragments_frame.width}")
            Log.d(LOG, " fragments_frame.height:${fragments_frame.measuredWidth}")
        }
}

-1

getDefaultDisplay().getHeight已经被弃用,建议使用

getResources().getDisplayMetrics().heightPixels;


-4

你也可以使用协程,像这样:

CoroutineScope(Dispatchers.Main).launch {
        delay(10)
        val width = view.width()
        val height= view.height()
        // do your job ....
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接