簡體   English   中英

從布局獲取寬度,高度

[英]get width, height from Layout

我需要獲取線性布局的寬度和高度,但是我不知道相對布局何時准備向我提供這兩個屬性。

但它只會返回0。

我的螢幕 在此處輸入圖片說明

請檢查我的代碼,我不知道。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        LinearLayout container = (LinearLayout)findViewById(R.id.container);
        int width = container.getWidth();
        int height = container.getWidth();

        Log.d("MainActivity onCreate", "width #" + width + ", height #" + height);
    }
}

和activity_main.xml布局

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:background="#FFFFFFAA"
        android:orientation="vertical"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>

</RelativeLayout>

我該如何解決?

每當您嘗試在onResume()onCreate()方法上獲取尺寸時,它始終返回0 所以你應該使用ViewTreeObserver

ViewTreeObserver vto = container.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        container.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = container.getMeasuredHeight();
        finalWidth = container.getMeasuredWidth();
        return true;
    }
});

另外,您還可以自定義View ,它將隨LinearLayout擴展,在onMeasure()方法中,您可以獲得widthheight

首先更換

 int height = container.getWidth();

通過

 int height = container.getHeight();

如果尚未繪制, container.getHeight()將返回0 (以及container.getWidth() )。

解決方案是在布局視圖后獲取高度:

container.post(new Runnable(){
    public void run(){
     int height = container.getHeight();
    }
});

首先,您兩次調用getWidth-表示寬度和高度。
您可以使用measureSpecs進行嘗試,如下所示:

int matchParentMeasureSpecWidth = View.MeasureSpec.makeMeasureSpec(((View) container.getParent()).getWidth(), View.MeasureSpec.EXACTLY);
int matchParentMeasureSpecHeight = View.MeasureSpec.makeMeasureSpec((View) container.getParent()).getHeight(), View.MeasureSpec.EXACTLY);
v.measure(matchParentMeasureSpecWidth, matchParentMeasureSpecHeight);

int height = container.getMeasuredHeight();

您可以先嘗試測量一下。 但是請確保僅在添加所有其他視圖之后再執行此操作,因為LinearLayout依賴於其他視圖。

LinearLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
LinearLayout.getMeasuredWidth();

嘗試這個

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

    final LinearLayout container = (LinearLayout)findViewById(R.id.container);

            container.post(new Runnable()
            {

                @Override
                public void run()
                {
                    Log.i("TEST", "  Layout width : "+ container.getWidth() +"  Layout height "+ container.getHeight()) ;

                }
            });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM