3 Stimmen

Kinder von HorizontalScrollView so groß wie der Bildschirm machen?

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.

0voto

JPM Punkte 8701

Ihre super.onMeasure(widthMeasureSpec, heightMeasureSpec) verwendet die übergebenen Werte, ich würde denken, Sie würden wollen, dass diese die tatsächliche gemessene Breite und Höhe sein:

super.onMeasure(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X