在没有任何填充的情况下使用 ImageView 显示 AlertDialog
Show AlertDialog with ImageView without any padding
编辑 - 解决方案:
我最终找到了解决这个问题的方法。因为手动更改 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();
在查看 this Whosebug answer 之后,我尝试实施该解决方案,因为他们的问题看起来很相似,但即使它更接近我现在想要的结果,结果如下所示:
所以它消除了填充,但图像看起来被压扁了。这是此潜在修复实施的代码:
// 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);
是什么导致图像现在看起来被压扁了?您可以看出它去掉了额外的填充,但图像尺寸发生了变化。
AlertDialog
的 CustomPanel 具有 5dp 的顶部和底部填充。您可以使用以下方法覆盖这些:
替换此行
dialog.setView(dialogLayout);
进入
dialog.setView(dialogLayout, 0, 0, 0, 0);
有关更多信息,请参阅这些链接,
Unable to get proper custom AlertDialog
请设置视图的 LinearLayout 属性,即 android:layout_height="match_parent"
。希望有用。
您的布局和图像视图都有 layout_width="match_parent"
。这告诉视图(布局或图像视图)伸展自身以填充父容器。尝试将此 属性 更改为 wrap_content
。您可以在官方文档中找到 属性 的详细解释 - here
将其设置为 wrap_content
应该与高度具有相同的效果 - 它应该足够宽以绘制内容(在本例中为图像)而不是固定其大小(与parent/container)
以下是您可以尝试的一些方法。你试试这个的变体,看看它是否修复了视图比率。 Description
imageView.setScaleType(ScaleType.FIT_CENTER);
或者可能手动设置 ImageView 大小会有所帮助。
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(bitmapWidth, bitmapHeight);
image.setLayoutParams(layoutParams);
如果没有,还有其他几种方法,这些只是第一个想到的。
我不太确定,但我认为您显示的对话框类型添加了填充。这种类型的对话框不会隐藏整个 activity。我用来隐藏整个activity的是:
/**
* 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
中设置 android:adjustViewBounds = "true"
可能会有所帮助。另外,我通常设置 android:scaleType = "centerInside"
或 android:scaleType = "centerCrop"
我最终找到了解决这个问题的方法。因为手动更改 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>
我将此属性添加到我的 ImageView。
<ImageView
(...)
android:adjustViewBounds="true" />
成功了!
编辑 - 解决方案:
我最终找到了解决这个问题的方法。因为手动更改 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();
在查看 this Whosebug answer 之后,我尝试实施该解决方案,因为他们的问题看起来很相似,但即使它更接近我现在想要的结果,结果如下所示:
所以它消除了填充,但图像看起来被压扁了。这是此潜在修复实施的代码:
// 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);
是什么导致图像现在看起来被压扁了?您可以看出它去掉了额外的填充,但图像尺寸发生了变化。
AlertDialog
的 CustomPanel 具有 5dp 的顶部和底部填充。您可以使用以下方法覆盖这些:
替换此行
dialog.setView(dialogLayout);
进入
dialog.setView(dialogLayout, 0, 0, 0, 0);
有关更多信息,请参阅这些链接,
Unable to get proper custom AlertDialog
请设置视图的 LinearLayout 属性,即 android:layout_height="match_parent"
。希望有用。
您的布局和图像视图都有 layout_width="match_parent"
。这告诉视图(布局或图像视图)伸展自身以填充父容器。尝试将此 属性 更改为 wrap_content
。您可以在官方文档中找到 属性 的详细解释 - here
将其设置为 wrap_content
应该与高度具有相同的效果 - 它应该足够宽以绘制内容(在本例中为图像)而不是固定其大小(与parent/container)
以下是您可以尝试的一些方法。你试试这个的变体,看看它是否修复了视图比率。 Description
imageView.setScaleType(ScaleType.FIT_CENTER);
或者可能手动设置 ImageView 大小会有所帮助。
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(bitmapWidth, bitmapHeight);
image.setLayoutParams(layoutParams);
如果没有,还有其他几种方法,这些只是第一个想到的。
我不太确定,但我认为您显示的对话框类型添加了填充。这种类型的对话框不会隐藏整个 activity。我用来隐藏整个activity的是:
/**
* 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
中设置 android:adjustViewBounds = "true"
可能会有所帮助。另外,我通常设置 android:scaleType = "centerInside"
或 android:scaleType = "centerCrop"
我最终找到了解决这个问题的方法。因为手动更改 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>
我将此属性添加到我的 ImageView。
<ImageView
(...)
android:adjustViewBounds="true" />
成功了!