Размер диалогового окна не соответствует фону

Я использую 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 будет соответствовать этому.