web-dev-qa-db-ja.com

getHeightは、すべてのAndroid UIオブジェクトに対して0を返します

私はUIを構築していますが、それはすべてXMLで静的に定義されています。すべての場所に重さがあるので、見た目は正しいが、実際にはすべてが適切な高さであることを確認したかった。問題は、フォーマットレイアウトの.getHeight()をどこで呼び出しても0になることです。onCreate()とonStart()の両方で試しました。同じこと。すべてのUIオブジェクトでも発生します。何か案が?

package com.app.conekta;

import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.Window;
import Android.widget.Button;
import Android.widget.FrameLayout;
import Android.widget.Toast;

public class Conekta extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    }

    @Override
    public void onStart() {

        super.onStart();


    }

    @Override
    public void onResume() {
        super.onResume();

        FrameLayout fl1 = (FrameLayout) findViewById(R.id.headerFrameLayout);
        FrameLayout fl2 = (FrameLayout) findViewById(R.id.footerFrameLayout);
        Button b=(Button) findViewById(R.id.searchButton);

        Log.d("CONEKTA", String.valueOf(b.getHeight()));

    }
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >



    <FrameLayout
        Android:id="@+id/headerFrameLayout"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.05"
        Android:background="#597eAA" >

        <ImageView
            Android:id="@+id/logoImage"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:background="#7ba1d1"
            Android:src="@drawable/logo_conekta" />
    </FrameLayout>

    <LinearLayout
        Android:id="@+id/bodyLinearLayout"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.7"
        Android:background="#f3f3f3"
        Android:orientation="horizontal" >

        <FrameLayout
            Android:id="@+id/leftBlankFrameLayout"
            Android:layout_width="wrap_content"
            Android:layout_height="fill_parent"
            Android:layout_weight="0.15"
            Android:background="#f3f3f3" >
        </FrameLayout>

        <LinearLayout
            Android:id="@+id/centerVerticalLayout"
            Android:layout_width="wrap_content"
            Android:layout_height="fill_parent"
            Android:layout_weight="0.7"
            Android:orientation="vertical" >

            <FrameLayout
                Android:id="@+id/topCenterFrameLayout"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.35" >
            </FrameLayout>

            <TextView
                Android:id="@+id/venueLabel"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.025"
                Android:text="What are you looking for?"
                Android:textAppearance="?android:attr/textAppearanceMedium"
                Android:textColor="#000000" />

            <EditText
                Android:id="@+id/venueTextField"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.025" >

                <requestFocus />
            </EditText>

            <FrameLayout
                Android:id="@+id/middleCenterFrameLayout"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.05" >
            </FrameLayout>

            <TextView
                Android:id="@+id/locationLabel"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.025"
                Android:text="Where?"
                Android:textAppearance="?android:attr/textAppearanceMedium"
                Android:textColor="#000000" />

            <AutoCompleteTextView
                Android:id="@+id/locationTextField"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.025"
                Android:text="" />

            <LinearLayout
                Android:id="@+id/buttonLinearLayout"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.05"
                Android:background="#f3f3f3"
                Android:orientation="horizontal" >

                <FrameLayout
                    Android:id="@+id/leftButtonLinearLayout"
                    Android:layout_width="wrap_content"
                    Android:layout_height="fill_parent"
                    Android:layout_weight="0.1" >
                </FrameLayout>

                <Button
                    Android:id="@+id/searchButton"
                    Android:layout_width="wrap_content"
                    Android:layout_height="fill_parent"
                    Android:layout_weight="0.8"
                    Android:background="#6fa8dc"
                    Android:text="Search" />

                <FrameLayout
                    Android:id="@+id/rightButtonLinearLayout"
                    Android:layout_width="wrap_content"
                    Android:layout_height="fill_parent"
                    Android:layout_weight="0.1" >
                </FrameLayout>
            </LinearLayout>

            <FrameLayout
                Android:id="@+id/bottomCenterFrameLayout"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight="0.35" >
            </FrameLayout>
        </LinearLayout>

        <FrameLayout
            Android:id="@+id/rightBlankFrameLayout"
            Android:layout_width="wrap_content"
            Android:layout_height="fill_parent"
            Android:layout_weight="0.15"
            Android:background="#f3f3f3" >
        </FrameLayout>
    </LinearLayout>

    <FrameLayout
        Android:id="@+id/footerFrameLayout"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.15"
        Android:background="#7ba1d1" >
    </FrameLayout>

</LinearLayout>
64
Alex B

つまり、ビューはonCreate()、onStart()、またはonResume()でまだ構築されていません。技術的には存在しないため(ViewGroupに関する限り)、ディメンションは0です。

長い間、あなたはそれを処理する方法についてのより良い説明のためにここに行くことができます。

ビューの寸法を取得する方法?

40
DeeV

OnCreateとonStartの両方で、ビューが実際にまだ描画されていないため、0です。ビューが実際に描画されるタイミングを聞いて、これを回避できます。

final TextView tv = (TextView)findViewById(R.id.venueLabel);
final ViewTreeObserver observer= tv.getViewTreeObserver();
       observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
              tv.getHeight()
              observer.removeGlobalOnLayoutListener(this);
            }
        });

リスナーを削除するための呼び出しは、レイアウトの変更時にカスタムハンドラーが繰り返し呼び出されるのを防ぐためのものです...それらを取得したい場合は、省略することができます。

82
Chris

ビューの高さまたは幅を取得するには、この関数を使用します

private int getHeightOfView(View contentview) {
    contentview.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
    //contentview.getMeasuredWidth();
    return contentview.getMeasuredHeight();
}
11
Aditya Rohilla

私はこれに再び答えて、私のような人々が実装前にそれがどのように機能するかを完全に理解するようにします。

Q。ビューの高さが0になるのはなぜですか?
A。取得しようとしているビューの高さは、onCreate()、onStart()、またはonResume()にまだ組み込まれていないためです。

Q。ビューの高さを取得する場所と方法は?
A。ビューのパラメーターは、onCreate()、onStart()、またはonResume()のように、好きな場所で取得できます。以下のように:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

       TextView tv = (TextView)findViewById(R.id.textview1);

       ViewTreeObserver viewTreeObserver = tv.getViewTreeObserver();
       if (viewTreeObserver.isAlive()) {
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                viewHeight = tv.getHeight();

            }
        });
      }
   }

ただし、今回は、ビューの高さが得られるまで待ってからオブザーバーを削除します。

tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

Q。では、このリスナーを削除する前に何を確認する必要がありますか?
** A。** treeObserverを削除する前にif条件を設定するだけで、

 if (viewHeight != 0)                     
 tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

最終コード:

ViewTreeObserver viewTreeObserver = tv.getViewTreeObserver();
        if (viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    int viewHeight = tv.getHeight();
                    if (viewHeight != 0)
                        tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                }
            });
        }

これがgetHeightが0を返す理由と、それを適切に取得する方法を説明することを願っています。ありがとう。

3
Vijay E

ビューでボタンを取得すると、その高さなどを簡単に取得できます。次のようにonClickListenerを定義できます。

Button b=(Button) findViewById(R.id.searchButton);
b.setOnClickListener(ButtonClick);
Android.view.View.OnClickListener ButtonClick= new Android.view.View.OnClickListener() {
    public void onClick(View v) { 
 v.getHeight();
}};

お役に立てれば。

1
Abhilab Das