2012-03-06 2 views
0

У меня есть три вида в моей деятельности в линейной вертикальной компоновке. Верхний и нижний вид имеют фиксированные высоты, а средний вид принимает любую высоту. Это, как я установить размеры для просмотров:Как заставить перерисовать виды в Activity.onConfigurationChanged

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() и вызвать изменение размеров() внутри моей функции переопределены onMeasure(). Это хорошо работает в onCreate(). Однако, когда меняется ориентация телефона, он не работает. Я заметил, что после onCreate() функция onMeasure() вызывается дважды. После onConfigurationChanged() onMeasure() вызывается только один раз, и мой код изменения размера не имеет шансов вступить в силу. Мой Клюге решение установить таймер для вызова изменения размера() 20мс позже:

timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     activity.runOnUiThread(new UiTask()); 
    } 
}, 20); 

где UiTask будет просто вызвать изменение размера(). Это работает для меня, но я чувствую, что должно быть лучшее решение. Может кто-то пролить свет на это?

ответ

1

Почему не позволяют LinearLayout выполнять компоновку с помощью атрибута android:layout_weight? Таким образом, вам совсем не нужен какой-либо дополнительный код, все будет работать. Вот что ваш Рез/макет/main.xml может выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:text="Top" 
     android:layout_weight="0" 
     android:background="#ff0000" 
     /> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="Middle" 
     android:layout_weight="1" 
     android:background="#00ff00" 
     /> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="25dp" 
     android:text="Bottom" 
     android:layout_weight="0" 
     android:background="#0000ff" 
     /> 
</LinearLayout> 

И не больше коды, кроме регулярного

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

это будет выглядеть в портрете:

enter image description here

и тому подобное в ландшафте (автоматически ретранслируется и перерисовывается):

enter image description here

Это работает как с и без android:configChanges="orientation" для деятельности в манифесте. Вы также сможете настроить вышеуказанный макет, используя Java-код, если вам нужно.

+0

Идеальное решение. Спасибо! –

Смежные вопросы