В моей деятельности три вида в линейном вертикальном расположении. Вид сверху и снизу имеют фиксированную высоту, а средний вид принимает любую высоту, доступную. Вот как я устанавливаю размеры для видов:
void resize(int clientHeight)
{
int heightMiddle = clientHeight - heightTop - heightBottom;
topView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, heightTop));
middleView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, heightMiddle));
bottomView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
}
Чтобы получить clientHeight, я переопределил функцию onMeasure () и вызвал resize () внутри переопределенной функции onMeasure (). Это хорошо работает в onCreate (). Однако, когда ориентация телефона меняется, он не работает. Я заметил, что после onCreate () onMeasure () вызывается дважды. После onConfigurationChanged () onMeasure () вызывается только один раз, и мой код изменения размера не получает возможности вступить в силу. Мое решение kluge - установить таймер для вызова resize () через 20 мс:
timer.schedule(new TimerTask()
{
@Override
public void run()
{
activity.runOnUiThread(new UiTask());
}
}, 20);
, где UiTask просто вызовет resize (). Это работает для меня, но я чувствую, что должно быть лучшее решение. Может кто-нибудь пролить свет на это?