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

EDIT – РЕШЕНИЕ:

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

Введите описание изображения здесь

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

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, который обрабатывает весь диалог, сохраняя его размеры, плюс две кнопки. Внедряя его стандартными методами, он выглядит следующим образом:

Введите описание изображения здесь

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

Планировка:

 <?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 , я попытался реализовать это решение, потому что их проблема показалась схожей, но, хотя она ближе к тому, что мне нужно, результат выглядит следующим образом:

Введите описание изображения здесь

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

 // 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); 

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

Solutions Collecting From Web of "Показать AlertDialog с ImageView без каких-либо дополнений"

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

Введите описание изображения здесь

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

 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> 

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

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

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

 dialog.setView(dialogLayout); 

в

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

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

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

Укажите атрибут LinearLayout вашего вида, например, android:layout_height="match_parent" . Надеюсь, он сработает.

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

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

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

 imageView.setScaleType(ScaleType.FIT_CENTER); 

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

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

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

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

 /** * 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

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

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

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