Как принудительно перерисовать представления в Activity.onConfigurationChanged - PullRequest
0 голосов
/ 07 марта 2012

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

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 (). Это работает для меня, но я чувствую, что должно быть лучшее решение. Может кто-нибудь пролить свет на это?

1 Ответ

1 голос
/ 07 марта 2012

Почему бы не позволить LinearLayout делать разметку с помощью атрибута android:layout_weight? Таким образом, вам не нужно никакого дополнительного кода вообще, все будет просто работать. Вот как может выглядеть ваш res / layout / 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, если вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...