Показать AlertDialog с ImageView без каких-либо дополнений

РЕДАКТИРОВАТЬ - РЕШЕНИЕ:

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

enter image description here

Это окончательный рабочий код:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositiveButton("Get Pro", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        }).setNegativeButton("No thanks", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        final AlertDialog dialog = builder.create();
        LayoutInflater inflater = getLayoutInflater();
        View dialogLayout = inflater.inflate(R.layout.go_pro_dialog_layout, null);
        dialog.setView(dialogLayout);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        dialog.show();

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface d) {
                ImageView image = (ImageView) dialog.findViewById(R.id.goProDialogImage);
                Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
                        R.drawable.whygoprodialogimage);
                float imageWidthInPX = (float)image.getWidth();

                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(Math.round(imageWidthInPX),
                        Math.round(imageWidthInPX * (float)icon.getHeight() / (float)icon.getWidth()));
                image.setLayoutParams(layoutParams);


            }
        });

И XML:

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

    <ImageView
        android:id="@+id/goProDialogImage"
        android:layout_width="wrap_content"
        android:layout_height="350dp"
        android:src="@drawable/whygoprodialogimage"/>

</LinearLayout>

ОРИГИНАЛЬНЫЙ ВОПРОС:

Моя цель - иметь AlertDialog, который имеет ImageView, который обрабатывает весь диалог, сохраняя его размеры и две кнопки. Внедряя его стандартными методами, он выглядит следующим образом:

enter image description here

Я пытаюсь устранить это дополнение над и под ним. Вот код для его настройки:

Разметка:

<?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="wrap_content">

    <ImageView
        android:id="@+id/goProDialogImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/whygoprodialogimage"/>

</LinearLayout>

код:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositiveButton("Get Pro", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        }).setNegativeButton("No thanks", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        AlertDialog dialog = builder.create();
        LayoutInflater inflater = getLayoutInflater();
        View dialogLayout = inflater.inflate(R.layout.go_pro_dialog_layout, null);
        dialog.setView(dialogLayout);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        dialog.show();

Посмотрев этот ответ StackOverflow, я попытался реализовать это решение, потому что их проблема показалась схожей, но, хотя она ближе к тому, что я хочу, результат выглядит это:

enter image description here

Таким образом, он удалил прокладку, но изображение выглядело смятым. Вот код для реализации этого потенциального исправления:

// Get screen size
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int screenWidth = size.x;
        int screenHeight = size.y;

        // Get target image size
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.whygoprodialogimage);
        int bitmapHeight = bitmap.getHeight();
        int bitmapWidth = bitmap.getWidth();

        // Scale the image down to fit perfectly into the screen
        // The value (250 in this case) must be adjusted for phone/tables displays
        while(bitmapHeight > (screenHeight - 250) || bitmapWidth > (screenWidth - 250)) {
            bitmapHeight = bitmapHeight / 2;
            bitmapWidth = bitmapWidth / 2;
        }

        // Create resized bitmap image
        BitmapDrawable resizedDialogImage = new BitmapDrawable(context.getResources(), Bitmap.createScaledBitmap(bitmap, bitmapWidth, bitmapHeight, false));

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositiveButton("Get Pro", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        }).setNegativeButton("No thanks", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        AlertDialog dialog = builder.create();
        LayoutInflater inflater = getLayoutInflater();
        View dialogLayout = inflater.inflate(R.layout.go_pro_dialog_layout, null);
        dialog.setView(dialogLayout);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Without this line there is a very small border around the image (1px)
        dialog.getWindow().setBackgroundDrawable(null);

        dialog.show();
        ImageView image = (ImageView) dialog.findViewById(R.id.goProDialogImage);
        image.setBackground(resizedDialogImage);

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

Ответы

Ответ 1

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

enter image description here

Это окончательный рабочий код:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositiveButton("Get Pro", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        }).setNegativeButton("No thanks", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        final AlertDialog dialog = builder.create();
        LayoutInflater inflater = getLayoutInflater();
        View dialogLayout = inflater.inflate(R.layout.go_pro_dialog_layout, null);
        dialog.setView(dialogLayout);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        dialog.show();

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface d) {
                ImageView image = (ImageView) dialog.findViewById(R.id.goProDialogImage);
                Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
                        R.drawable.whygoprodialogimage);
                float imageWidthInPX = (float)image.getWidth();

                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(Math.round(imageWidthInPX),
                        Math.round(imageWidthInPX * (float)icon.getHeight() / (float)icon.getWidth()));
                image.setLayoutParams(layoutParams);


            }
        });

И XML:

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

    <ImageView
        android:id="@+id/goProDialogImage"
        android:layout_width="wrap_content"
        android:layout_height="350dp"
        android:src="@drawable/whygoprodialogimage"/>

</LinearLayout>

Ответ 2

Возможно, будет поздно, но я думаю, что настройка android:adjustViewBounds = "true" в ImageView может помочь. Кроме того, я обычно устанавливаю android:scaleType = "centerInside" или android:scaleType = "centerCrop"

Ответ 3

Пользовательская панель AlertDialog имеет верхнее и нижнее дополнение 5dp. Вы можете переопределить их, используя:

замените эту строку

dialog.setView(dialogLayout);

в

dialog.setView(dialogLayout, 0, 0, 0, 0);

Для получения дополнительной информации обратитесь к этим ссылкам,

Невозможно получить правильный пользовательский AlertDialog

Ответ 4

Укажите свой атрибут LinearLayout, т.е. android:layout_height="match_parent". Надеюсь, что это сработает.

Ответ 5

Оба вида макета и изображения имеют layout_width="match_parent". Это говорит, что представление (либо макет, либо изображение) растягивается так, что оно заполняет родительский контейнер. Попробуйте изменить это свойство на wrap_content. Вы можете найти подробное объяснение собственности в официальной документации - здесь

Настройка на wrap_content должна иметь тот же эффект, что и на высоте - она ​​должна быть достаточно широкой, чтобы рисовать содержимое (изображение в этом случае) вместо того, чтобы фиксировать его размер (до размера родительского/контейнера)

Ответ 6

Вот несколько вещей, которые вы можете попробовать. Вы попробуете варианты этого, чтобы увидеть, исправляет ли он коэффициент представления. Описание

imageView.setScaleType(ScaleType.FIT_CENTER);

или, возможно, вручную настроить размер ImageView вручную.

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(bitmapWidth, bitmapHeight);
image.setLayoutParams(layoutParams);

Если нет, есть еще несколько способов, это были только первые, которые приходят на ум.

Ответ 7

Я не совсем уверен, но я думаю, что его тип диалога, который вы показываете, добавляет дополнение. Этот тип диалога не скрывает всю активность. Я использую для скрытия всей активности:

/**
 * Show the overlay using the WindowManager class.
 * @param overlay The overlay that needs to be shown.
 */
public void showOverlay(View overlay) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                    WindowManager.LayoutParams.FLAG_FULLSCREEN,
            PixelFormat.TRANSLUCENT);

    getWindowManager().addView(overlay, params);
}

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

Проверьте параметры: http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

Ответ 8

Я добавляю эти атрибуты в свой ImageView.

<ImageView
  (...)
  android:adjustViewBounds="true" />

Это сработало!