Показать 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" />
Это сработало!