Как отключить DialogFragment для изменения размера после отображения диалогового окна?

Я использую список в DialogFragment, содержащемся в LinearLayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/dialog_main_margin" >

<com.modelmakertools.simplemind.DragSortListView
    android:id="@+id/drag_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

где DragSortListView основан на потомке ListView стороннего производителя, который позволяет переупорядочивать элементы с помощью изображения ручки перетаскивания.

Все работает нормально, когда этот код используется в (полноэкранном) действии, но при использовании в android.support.v4.app.DialogFragment перетаскивание элемента приводит к тому, что комбинация диалога + списка постоянно обновляет размер диалога. Это приводит к тому, что перетаскивание происходит очень медленно, и я вижу много сообщений LogCat:

06-06 15:37:07.833: I/Choreographer(17281): Skipped 166 frames!  The application may be doing too much work on its main thread.

Чтобы найти источник проблемы, я изменил ширину и высоту списка на фиксированные 400dp (вместо match_parent/wrap_content). Фиксация размера полностью устраняет проблему. Отсюда мой вопрос: есть ли способ избежать того, чтобы фрагмент диалога регулировал его размер после того, как он был выложен один раз?


person Gerrit Beuze    schedule 06.06.2013    source источник


Ответы (2)


Я нашел способ остановить отображение списка, обновляющего размер диалогового окна, с помощью приведенного ниже кода. Однако, оказывается, это решает только часть проблемы: пока список не «зафиксирован», загрузка все еще очень медленная. Но у этого есть другая причина, которая выходит за рамки этого вопроса/ответа.

@Override
public void onResume() {
    super.onResume();
    // Fixate the listview height once the listview has been measured rather than keeping it at "wrap_content"
    // This drastically improves rearrange performance.
    if (_listView != null) {
        _listView.postDelayed(new Runnable() {
            @Override
            public void run() {
                fixateListViewHeight();
            }
        }, 500);
    }
}

private void fixateListViewHeight() {
    if (_listView != null) {
        int h = _listView.getMeasuredHeight();
        if (h != 0) {
            LayoutParams params = (LayoutParams) _listView.getLayoutParams();
            if (params != null)
                params.height = h;
        }
    }
}
person Gerrit Beuze    schedule 10.06.2013

Попробуйте установить для свойства windowSoftInputMode значение adjustNothing в AndroidManifest.xml действий, использующих фрагмент диалога.

<activity
    ...
    android:windowSoftInputMode="adjustNothing">
...
person Daniel De León    schedule 25.06.2013
comment
Это не сработает, так как мне нужна начальная настройка для автоматического изменения размера диалогового окна. Кроме того, это отключит автоматическое изменение размера для всех других диалогов. - person Gerrit Beuze; 01.07.2013
comment
Эта настройка предназначена для программной клавиатуры, тогда при отображении она будет перекрывать текущий вид. - person Daniel De León; 01.07.2013
comment
Ах, я не могу использовать это, так как мне нужна программная клавиатура, чтобы уменьшить представление содержимого активности. - person Gerrit Beuze; 02.07.2013