Размер DialogFragment (ширина) игнорируется

Я использую DialogFragment и обнаружил, что ширина всегда становится полноэкранной, когда я создаю внутренний LinearLayout layout_width=match_parent, независимо от того, сколько ограничений я пытаюсь наложить на него, исправляя layout_width и minWidth родительского представления или устанавливая макет размеры в CreateView()

диалог.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dialog_width"
android:layout_height="@dimen/dialog_height"
android:minWidth="@dimen/dialog_width"
android:minHeight="@dimen/dialog_height"
android:orientation="vertical" 
android:paddingTop="5dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    ...
    </LinearLayout>
</LinearLayout>

Диалог.java

public class MyDialog extends DialogFragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ...
        Resources r = getActivity().getResources();
        getDialog().getWindow().setLayout( (int)r.getDimension(R.dimen.dialog_width), (int)r.getDimension(R.dimen.dialog_height));
        return view;
    }
}

Единственный способ, которым я могу это сделать, - установить внутренний LinearLayout layout_width="@dimen/dialog_width

взломанный диалог.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
... >

<LinearLayout
    android:layout_width="@dimen/dialog_width"
    android:layout_height="wrap_content">
    ...
    </LinearLayout>
...
</LinearLayout>

Что работает нормально, но имеет некоторые последствия для других частей диалога. Это баг андроида?


person nathanielwolf    schedule 29.11.2012    source источник
comment
Используйте RelativeLayout вместо Linear   -  person Tofeeq Ahmad    schedule 29.11.2013


Ответы (2)


Я не видел никакой документации по этому поводу, но где-то читал (вероятно, на SO), что параметры layout_width и layout_height корневого макета переопределяются с помощью «wrap_content» при создании диалога.

Я не уверен, так это на самом деле или нет, но поведение макета, которое я видел, предполагает, что это правда. Во всяком случае, я правильно расставил диалоги, предполагая, что это так.

Возможно, вы захотите попробовать wrap_content и во внутренних макетах, где это возможно. Жестко закодированные значения ширины, как правило, плохо работают на нескольких устройствах.

person GreyBeardedGeek    schedule 18.06.2013

Замените свой код этим

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dialog_width"
android:layout_height="@dimen/dialog_height"
android:minWidth="@dimen/dialog_width"
android:minHeight="@dimen/dialog_height"
android:orientation="vertical" 
android:paddingTop="5dp">
    ...
</LinearLayout> 

Используйте только один LinearLayout и поместите в него все вещи

person Kirit Vaghela    schedule 18.06.2013