Soru Bir düzenin yükseklik ve genişliğini programsal olarak alın


Bir düzen tasarladım LinearLayout 2 çocuğu var LinearLayout ve FrameLayout ve her çocukta farklı görüşler ortaya koyarım.

Sadece yükseklik ve genişliğini ölçmek istedim FrameLayout böylece amacına hizmet edebilirdim.

Kullanıyorum programda

int height,width;

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

değeri döndürür 0 ikisi için

Hatta aşağıdaki kod ile denedim int yükseklik, genişlik;

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

aynı değeri döndürür 0

ve sonunda aşağıdaki kodla denedim, int yükseklik, genişlik;

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

beni döndür -2 ve -1

Çözümün, herhangi bir düzenin boylu ve genişliğini programlı olarak almasını istiyorum.


37
2018-02-21 06:13


Menşei


Bu soruyu gör stackoverflow.com/questions/3779173/... - VinhNT


Cevaplar:


Görüşün kendisi, temel olarak aşağıdaki gibi olan kendi yaşam döngüsüne sahiptir:

-Attached

-Ölçülen

-Layout

-Çekmek

Yani, ne zaman genişlik / yükseklik elde etmeye çalıştığınıza bağlı olarak, ne görmek istediğinizi göremeyebilirsiniz, örneğin, onCreate sırasında bunu yapıyorsanız, görünüm o zamana kadar ölçülmemiş olabilir. Eğer bir butonun onClick yöntemi sırasında bunu yaparsanız, o görüşe göre bu görünüm eklenmiş, ölçülmüş, düzenlenmiş ve çizilmiştir, bu yüzden beklenen değeri göreceksiniz, değerleri aldığınızdan emin olmak için bir ViewTreeObserver uygulamanız gerekir. doğru zamanda.

LinearLayout layout = (LinearLayout)findViewById(R.id.YOUD VIEW ID);
ViewTreeObserver vto = layout.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                this.layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                this.layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            } 
        int width  = layout.getMeasuredWidth();
        int height = layout.getMeasuredHeight(); 

    } 
});

Umarım yardımcı olur.

Saygılarımızla!


91
2018-02-21 06:17



Cevabınız için THNx .... Ama yine de aynı sonuç :( - Rohit
RemoveGlobalOnLayoutListener'ın kullanımdan kaldırıldığını unutmayın, böylece this.layout.getViewTreeObserver () öğesini kaldırmanız gerekir. RemoveOnGlobalLayoutListener (this); son android API'de. - Nicolas Massart
Bir çekicilik gibi çalışır :) - boctulus


OnCreate () yönteminde Yükseklik ve Genişlik elde ettiğinizi düşünüyorum, bu nedenle her zaman 0 değer elde ediyorsunuz, çünkü o sırada görünümünüz hala oluşturulmuyor.

Bir tuşa veya başka bir tuşa tıklayarak yükseklik ve genişlik elde etmeye çalışın.


12
2018-02-21 06:15



Neredeyse aynı problemim var. Android'de yeni başlıyorum. O zaman işleri yapmanın en iyi yolu nedir? Şu anda onCreate'da birkaç düğme oluşturuyorum ve onları konumlandırmak istiyorum. Bunu yapmak için en iyi yer neresi? - Vlad E. Borovtsov


CapDroid olarak, eğer çizildiyse görünümden önce boyutu elde etmeye çalışıyorsunuz, başka bir olası çözüm ise, View'da bir runnable ile bir Post yapmak olabilir:

mView.post(new Runnable() {
        @Override
        public void run() {
            int width = mView.getWidth();
            int height = mView.getHeight();
        }
}

8
2017-12-16 19:38





-1 veya -2 alırsanız, LayoutParams.WRAP_CONTENT (-2) veya LayoutParams.MATCH_PARENT (-1) öğesinin sayısal değeri de olabilir.


5
2017-09-09 09:15





sadece boyunu ver ve istenirse boy veya hatta genişlik kazanacaksın.

/ **      * Görünüm görüntülenmeden önce görünüm yüksekliğini alın      * @param ölçmek için görünümü görüntüleyin      * @ Görünümün yüksekliğini döndürün      * /

public static int getViewHeight(View view) {
    WindowManager wm =
            (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();

    int deviceWidth;

    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
        Point size = new Point();
        display.getSize(size);
        deviceWidth = size.x;
    } else {
        deviceWidth = display.getWidth();
    }

    int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST);
    int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    view.measure(widthMeasureSpec, heightMeasureSpec);
    return view.getMeasuredHeight(); //        view.getMeasuredWidth();
}

2
2018-01-17 19:31



Benim için çalışıyor ... teşekkürler .. - Sanghati Mukherjee


İlk snippet doğru, ancak aramanız gerekiyor sonra  onMeasure() infaz edilir. Aksi takdirde, görünüm için boyut henüz ölçülmez.


1
2018-02-21 06:15



Ek olarak, her defasında, bu yönteme dayanarak Ölçümü geçersiz kılabilir ve yeni ölçümleri alabilirsiniz. - Steven Trigg


Çerçeve için:

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

Ekran için:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

1
2018-02-21 06:20