Сделать детей от HorizontalScrollView размером с экран? - PullRequest
3 голосов
/ 14 сентября 2011

Я решил эту проблему путем создания настраиваемого представления для дочерних представлений, а затем переопределив onMeasure () для настраиваемого представления. Новый метод onMeasure () устанавливает максимально возможную ширину и высоту.

Проблема в том, что при показе программной клавиатуры и телефон поворачивается. С изменением ориентации и отображением клавиатуры onMeasure () устанавливает «наибольшую» доступную высоту как нечто смехотворно маленькое, поэтому, когда я скрываю клавиатуру, дочерние виды имеют неправильный размер.

Есть ли способ сказать представлениям пересчитать расположение, когда клавиатура исчезнет? Или я делаю onMeasure () неправильно? Вот код:

@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 () выполняется аналогичным образом.

1 Ответ

0 голосов
/ 14 сентября 2011

Ваш super.onMeasure (widthMeasureSpec, heightMeasureSpec) использует переданные значения. Я думаю, вы захотите, чтобы это были фактические измеренные ширина и высота:

super.onMeasure(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...