Ich habe dieses Problem gelöst, indem ich eine benutzerdefinierte Ansicht für die untergeordneten Ansichten erstellt und dann onMeasure() für die benutzerdefinierte Ansicht außer Kraft gesetzt habe. Die neue onMeasure() setzt die Breite und Höhe so groß wie möglich sein.
Das Problem ist, wenn Sie die Soft-Tastatur anzeigen y Drehen Sie das Telefon. Mit der Ausrichtung ändern und die Tastatur zeigen, onMeasure() setzt die "größte" verfügbare Höhe etwas lächerlich klein zu sein, so dass, wenn ich die Tastatur ausblenden, das Kind Ansichten die falsche Größe haben.
Gibt es eine Möglichkeit, die Ansichten anzuweisen, das Layout neu zu berechnen, wenn die Tastatur nicht mehr vorhanden ist? Oder mache ich onMeasure() falsch? Hier ist der Code:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
setLayoutParams(new LinearLayout.LayoutParams(
measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec))
);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
Display display = ( (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int screenWidth = display.getWidth();
if (specMode == MeasureSpec.EXACTLY) {
// We were told how big to be
result = specSize;
} else {
// Measure the view
result = screenWidth;
if (specMode == MeasureSpec.AT_MOST) {
// Respect AT_MOST value if that was what is called for by measureSpec
result = Math.min(result, specSize);
}
}
Log.d(TAG, "Width: "+String.valueOf(result));
return result;
}
measureHeight() wird auf die gleiche Weise ausgeführt.