带有 ImageView 的 AlertDialog 的大小太大

Size of an AlertDialog with an ImageView is too large

上下文

我想要一个带有正方形图像的 AlertDialog。我的图像大小为 800x800 像素,大于设备屏幕 (800x480)。图像会自动缩放到 AlertDialog 的大小。但是,对话框本身变得太大:它是应用程序的完整高度。

问题

我想让对话框只占据图像的 space(加上对话框按钮)。为什么这不会发生?我认为对话框的标准设置为 WRAP_CONTENT.

代码:

ImageView photo = new ImageView(getApplicationContext());
photo.setImageResource(R.drawable.imageof800x800pixels)
AlertDialog.Builder builder =
new AlertDialog.Builder(HangboardActivity.this).
      //setMessage(R.string.nextgrip). // this is quite ugly
      setPositiveButton("OK", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
           dialog.dismiss();
      }
      }).
      setView(photo);
final AlertDialog alert = builder.create();
alert.show();

已编辑代码:

            ImageView photo = findPhotoForExercise();

            int widthPX = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, getResources().getDisplayMetrics());
            int heightPX = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, getResources().getDisplayMetrics());
            LinearLayout.LayoutParams layoutParams  = new LinearLayout.LayoutParams(widthPX, heightPX);
            photo.setLayoutParams(layoutParams);

            AlertDialog.Builder builder =
                    new AlertDialog.Builder(HangboardActivity.this).
                            setMessage(R.string.nextgrip). // this is quite ugly
                            setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            }).
                            setView(photo);
            final AlertDialog alert = builder.create();
            alert.show();

我认为您的第一个镜头应该是将图像缩小到足够小以适合您的对话框,但如果这还不够好,您可以设置它的高度和宽度(以密度像素为单位)以符合所有屏幕尺寸固定尺寸。

LinearLayout layout = new LinearLayout(this);
LinearLayout.LayoutParams layoutParamsL = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layout.setLayoutParams(layoutParamsL);
layout.setGravity(Gravity.CENTER);
int widthPX = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
int heightPX = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
LinearLayout.LayoutParams layoutParams  = new LinearLayout.LayoutParams(widthPX, heightPX);
imageView.setLayoutParams(layoutParams);
layout.addView(photo);

我建议不要以编程方式使用布局,因为你可以做一个 xml 布局,它有一个图像视图,它的 layout_width 和 layout_height 像上面一样在固定 dp 中,那会像上面提到的那样以编程方式执行确切的行为。 我认为 xml 布局是一种很好的做法,因为您会将所有布局放在一个地方并且它更具可读性,而且您可以针对不同的屏幕分辨率(mdpi、hdpi、xhdpi)和不同的设备配置使用不同的布局(纵向、横向)以及更多优势

我认为你可以做到:

ImageView photo = new ImageView(getApplicationContext());
photo.setImageResource(R.drawable.imageof800x800pixels);
photo.setLayoutParams(new LayoutParams(DESIRED_WIDTH,DESIRED_HEIGHT));

请注意 class LayoutParams 嵌套在多个 View 类 中,因此这取决于您的需要,例如。如果您的 ImageView 在线性布局中,您应该这样做:

photo.setLayoutParams(new LinearLayout.LayoutParams(DESIRED_WIDTH,DESIRED_HEIGHT));

现在,对于所需的宽度和高度,您可以通过编程方式进行设置:

WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
int DESIRED_WIDTH = (int) diplay.getWidth() * PERCENTAGE;
int DESIRED_HEIGHT = (int) display.getHeight() * PERCENTAGE;