it-swarm.com.de

getmeasuredheight () und getmeasuredwidth () werden nach View.measure () zurückgegeben

Nachdem ein Viewmit einer Konstantengröße mit view.measure() gemessen wurde, geben die getMeasuredHeight() und getMeasureWidth() 0 zurück.

layout_view.xml , Layout, das zum Erstellen der Ansicht aufgeblasen wird

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
    Android:layout_width="100dp"
    Android:layout_height="100dp">
</FrameLayout>

funktion, die die Abmessungen misst

public void measureView(Context context){
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.layout_view,null,false);

    view.measure( View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

    Log.d(TAG,"Error width : " + view.getMeasuredWidth());
    Log.d(TAG,"Error heeght : " + view.getMeasuredHeight());

}
11
SathMK

Wenn Sie view.getMeasuredWidth() in onCreate() oder onCreateView() aufrufen, wurde die view noch nicht gezeichnet. Sie müssen also einen Listener hinzufügen und erhalten einen Rückruf, wenn die view gezeichnet wird. Einfach so in meinem Code: 

final ViewTreeObserver vto = view.getViewTreeObserver();
if (vto.isAlive()) {
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int viewWidth = view.getMeasuredWidth();
            // handle viewWidth here...

            if (Build.VERSION.SDK_INT < 16) {
                vto.removeGlobalOnLayoutListener(this);
            } else {
                vto.removeOnGlobalLayoutListener(this);
            }
        }
    });
}

HINWEIS: Entfernen Sie den Hörer für eine bessere Leistung!

Rufen Sie nicht vto.removeOnGlobalLayoutListener(this) auf, um den Listener zu entfernen. Nenne es so: 

vto.getViewTreeObserver()
9
Francis Shi

Messen Sie die Ansicht in onCreate(). Die Ansicht ist noch nicht gezeichnet. Sie müssen erst nach dem Zeichnen der Ansicht warten, bevor Sie sie messen können.

Eine einfache Lösung hierfür besteht darin, ein Layout für das Layout zu erstellen. Das Runable wird ausgeführt, nachdem das Layout ausgeführt wurde.

Für weitere Informationen Siehe diesen Beitrag

Edit Versuchen Sie es zu ändern

view.measure( View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

zu

view.measure( View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY);
4
Giru Bhai

Versuchen Sie es auf diese Weise, ich hoffe, dies wird Ihnen helfen, Ihr Problem zu lösen.

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
   @Override
   public void onGlobalLayout() {
     int width = view.getMeasuredWidth();
     int height = view.getMeasuredHeight();

   }
});
3
Haresh Chhelana

wenn für die gemessene Ansicht die Sichtbarkeit auf "Vergessen" gesetzt ist, wird für die Messung 0 angezeigt. Sie können die Sichtbarkeit auf "Sichtbar", "Messen" und "Zurück" festlegen, und zwar alles aus dem Code.

1
Radu Simionescu

Sie können getViewTreeObserver in onCreate/onCreateView Und anderen Ereignissen verwenden.

fun setGlobalLayoutListener(view: View, method: () -> Unit) {
    val vto1 = view.viewTreeObserver
    if (vto1.isAlive) {
        vto1.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
            override fun onGlobalLayout() {
                val vto2 = view.viewTreeObserver
                if (vto2.isAlive) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        vto2.removeOnGlobalLayoutListener(this)
                    } else {
                        @Suppress("DEPRECATION")
                        vto2.removeGlobalOnLayoutListener(this)
                    }
                    // Your actions are here:
                    method()
                }
            }
        })
    }
}

Und nennen Sie es: setGlobalLayoutListener(view) {updateUI(view)}.

Ich habe es auch versucht

view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)

und dann in onCreateView()/onViewCreated()view.control.measuredWidth aufgerufen. In einigen Emulatoren (API 19) wurden jedoch falsche Ergebnisse zurückgegeben.

0
CoolMind

Nur für den Fall, dass jemand dieses Problem mit ImageView hatte:

Ich habe festgestellt, dass, wenn in ImageView nicht "Android: src" eingestellt ist (d. H. Sie es dynamisch ändern), es immer null von getMeasuredWidth/Height zurückgibt. 

Eine einfache Problemumgehung besteht darin, einen Platzhalter für die Ansicht festzulegen.

Sie können View.MeasureSpec.* nicht direkt in measure aufrufen. Stattdessen makeMeasureSpec() und dann verwenden Sie measure():

final int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED);
final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED);
view.measure(widthMeasureSpec, heightMeasureSpec);
0
M-WaJeEh