Размер диалогового окна не соответствует фону
Я использую Android SDK для создания игры. По пути мне нужно отобразить всплывающее окно/диалог, как любая другая игра, которую пользователь может обновить или что-то еще. У меня проблема с размером диалога. Я использую RelativeLayout, и я устанавливаю фон для изображения, которое у меня есть с "wrap_content".
Проблема, заключающаяся в том, что в диалоговом окне принимается размер представлений внутри (или минимальный размер диалогового окна по умолчанию, установленный Android, в зависимости от того, что больше) НЕ фоновое изображение. Если я использую fill_parent, то он растягивает его. Я часами и часами вращал свое время, и я не могу найти эффективный способ, которым размер окна соответствует размеру фонового изображения.
Любые предложения? Это очень распространенный случай использования, и должен быть способ!
Благодаря
Вот некоторые из содержимого макета
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/popup"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageButton
android:id="@+id/ibCloseDialog"
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/close" />
<Button
android:id="@+id/b1"
android:background="@drawable/blue_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/b2"
android:text="b1" />
<Button
android:id="@+id/b2"
android:background="@drawable/blue_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="b2" />
<Button
android:id="@+id/b3"
android:background="@drawable/blue_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/b2"
android:text="b2" />
</RelativeLayout>
Ответы
Ответ 1
Однажды я столкнулся с проблемой отображения диалога в полноэкранном режиме. Я использовал собственный стиль, чтобы удалить стиль по умолчанию для диалогов (размер/margin/padding). Поэтому, возможно, вы можете использовать это, чтобы обернуть свой контент, игнорируя значения по умолчанию. Поэтому, пожалуйста, попробуйте следующее:
1) Добавьте пользовательскую тему диалога в свои styles.xml:
<style name="YourDialogTheme" parent="android:Theme.Dialog">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:windowBackground">@null</item>
<item name="android:windowNoTitle">false</item>
</style>
Я думаю, что здесь важны такие аспекты, как высота, ширина и фон. Возможно, вам придется играть со значениями.
2) Создайте свой диалог с помощью этого фрагмента:
Dialog dialog = new Dialog(context, R.style.YourDialogTheme)
Ответ 2
Используете ли вы атрибут "андроид: фон" в вашем RelativeLayout? Если это так, вы можете попытаться сделать это:
<RelativeLayout
.
.
.
>
<ImageView
android:layout_width="MATCH_PARENT"
android:layout_height="MATCH_PARENT"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/yourDrawable" />
</RelativeLayout>
- Поместите ImageView внутри своей относительной компоновки.
- Удалите фоновое изображение вашего RelativeLayout
- Установите src ImageView на фоновое изображение.
также:
- сделайте правильно оформленные изображения вашего фона и сохраните их в разных папках.
- Укажите размер представления, не используя константы, но в dp
Ответ 3
поместите одно большое изображение в папку и используйте следующую рамку. добавить в imgView
android:scaleType = "centerCrop"
Ответ 4
Я не уверен, что это эффективное решение, но поскольку фон диалога является файлом ресурсов, вы можете получить высоту и ширину фона и динамически установить ту же высоту и ширину на Dialog
. Что-то вроде этого
//get the dialog background drawable
Drawable popUpDrawable = getResources().getDrawable(R.drawable.popup);
//get height and width of drawable
int drawableWidth = popUpDrawable.getIntrinsicWidth();
int drawableHeight = popUpDrawable.getIntrinsicHeight();
//creating dialog
Dialog dialog = new Dialog (context);
...
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialogWindow.getAttributes());
//set the height and width of drawable as height and width of dialog
lp.width = drawableWidth;
lp.height = drawableHeight;
dialog.show();
//set the attributes to dialog
dialog.getWindow().setAttributes(lp);
Ответ 5
Вы устанавливаете изображение с помощью атрибута src. Я предлагаю вам установить фоновый рисунок.
<ImageButton
android:id="@+id/ibCloseDialog"
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
scaltype:centerInside
android:background="@drawable/close" />
Ответ 6
У меня возникла аналогичная проблема. Android не любит RelativeLayout для размера, основанного на его дочерних элементах, когда его дети выравниваются справа или снизу. Это считается "циркулярной ссылкой", хотя я согласен с тем, что для этого были бы обоснованные варианты использования. Я работал над этим, используя FrameLayout
:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="..." />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
[ other views with their relative layout parameters]
</RelativeLayout>
</FrameLayout>
в этом макете, FrameLayout должен получить свой размер от изображения, тогда RelativeLayout будет соответствовать этому.