带有ImageView的AlertDialog的大小太大

时间:2015-03-17 20:33:20

标签: android alertdialog android-alertdialog

上下文

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

问题

我想让对话框只占用图像的空间(加上对话框按钮)。为什么这不会发生?我认为Dialogs是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();

2 个答案:

答案 0 :(得分:2)

我认为你的第一张镜头会缩小到适合你的对话框的尺寸,但是如果它不够好你可以设置它的密度像素的高度和宽度为尊重所有尺寸固定的屏幕尺寸。

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布局,它有一个imageview,它的layout_width和layout_height一直是固定的dp,就像上面那样,这样做会像上面提到的那样以编程的方式完成。 我认为xml布局是一个很好的做法,因为你将所有布局放在一个地方并且它更具可读性,并且你可以针对不同的屏幕分辨率(mdpi,hdpi,xhdpi)和不同的设备配置设置不同的布局(肖像,风景)和更多的优势

答案 1 :(得分:1)

我认为你可以做到:

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

请注意,LayoutParams类嵌套在多个View Classes中,因此它取决于您的需要,例如。如果您的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;