Enthält View.getHeight/getWidth Auffüllung?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Enthält View.getHeight/getWidth Auffüllung?

Post by Anonymous »

Ich hatte den Eindruck, dass der von View.getWidth() zurückgegebene Wert Auffüllungen enthält. Ich glaube nicht, dass ich Dinge halluziniere – eine häufige Codezeile, die Android-Entwickler schreiben, ist so etwas wie myView.run { width - (paddingLeft + paddingRight) , deren Ziel darin besteht, die Breite einer Ansicht ohne die Auffüllung (sozusagen die „Basisbreite“) zu erhalten.
Das habe ich persönlich bei meinen früheren Jobs getan und wird auch durch zahlreiche andere Beispiele online bestätigt (siehe: SourceGraph-Codesuche).
Nachdem ich heute versucht habe, dieses Muster zu verwenden, war ich schockiert, als ich sah, dass der zurückgegebene Wert View.getWidth() keine Auffüllung enthält. Zur Veranschaulichung habe ich zwei Experimente durchgeführt:
Experiment 1: Programmgesteuert hinzugefügte Polsterung
activity_main.xml:

Code: Select all


[*]        android:id="@+id/inner"
android:background="#ffffc0cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" />

MainActivity.kt:

Code: Select all

myList.forEach { s ->
val squareItemView = SquareItemView(this)
// irrelevant boilerplate omitted
innerContents.addView(squareItemView)
innerContents.post {
val baseWidth = innerContents.run { width - (paddingLeft + paddingRight) }
Log.i(
"TAG",
"innerContents.measuredWidth=${innerContents.measuredWidth}, " +
"innerContents.width=${innerContents.width}, " +
"baseWidth=${baseWidth}, " +
"innerContents.paddingLeft=${innerContents.paddingLeft}"
)
Log.i("TAG", "will add 10px px on either side")
innerContents.apply { setPadding(paddingLeft + 10, paddingTop, paddingRight + 10, paddingBottom) }
}
}
Hier ist die Protokollausgabe:

Code: Select all

23:42:49.923  I  innerContents.measuredWidth=693, innerContents.width=693, baseWidth=693, innerContents.paddingLeft=0
23:42:49.923  I  will add 10px px on either side
23:42:49.924  I  innerContents.measuredWidth=693, innerContents.width=693, baseWidth=673, innerContents.paddingLeft=10
23:42:49.924  I  will add 10px px on either side
23:42:49.924  I  innerContents.measuredWidth=693, innerContents.width=693, baseWidth=653, innerContents.paddingLeft=20
23:42:49.924  I  will add 10px px on either side
Beachten Sie in dieser Demo, dass jedes Mal, wenn wir 10 Pixel Abstand links und rechts hinzufügen:
  • die einfachen getMeasuredWidth- und getWidth-Zahlen identisch sind und konstant bleiben
  • die Berechnung der „Basisbreite“ verringert sich um den Betrag des Abstands
Experiment 2: hartcodiert Polsterung (weniger Variablen, über die man nachdenken muss)
activity_main.xml: MainActivity.kt:

Code: Select all

findViewById(R.id.texty).let {
it.doOnNextLayout {
Log.i("TAG", "texty.height=${it.height}, texty.paddingTop=${it.paddingTop}")
Log.i("TAG", "texty.width=${it.width}, texty.paddingLeft=${it.paddingLeft}")
}
}
Protokollausgabe, wenn die Auffüllung weggelassen wird:

Code: Select all

16:49:57.414  I  texty.height=788, texty.paddingTop=0
16:49:57.414  I  texty.width=788, texty.paddingLeft=0
Protokollausgabe, wenn der Abstand auf 10 dp eingestellt ist:

Code: Select all

16:50:39.012  I  texty.height=788, texty.paddingTop=26
16:50:39.012  I  texty.width=788, texty.paddingLeft=26
Dieses Ergebnis steht im Widerspruch zu unseren Erwartungen. Wie gesagt, ich kann mich nicht erinnern, dass dies vor ein paar Monaten (Wochen?) der Fall gewesen wäre, aber anscheinend ist es so. Hat Google dieses Verhalten auf Bibliotheksebene oder sogar auf Betriebssystemebene geändert? Was ist los? :(

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post