2015-03-17 5 views
1

КонтекстРазмер в AlertDialog с ImageView слишком большой

Я хотел бы иметь AlertDialog с размером изображения квадрата. Мои изображения имеют размер 800x800 пикселей, что больше экрана устройства (800x480). Изображение автоматически масштабируется до размера AlertDialog. Однако сам диалог становится слишком большим: это полная высота приложения.

Проблема

Я хотел бы иметь диалог только занимают пространство изображения (плюс кнопки диалога). Почему этого не происходит? Я думал, что 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(); 

Edited Код:

  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(); 
+0

строну уменьшения изображения. Это вариант? –

+0

Это работает (я уже тестировал это), но это не отличное решение, поскольку на экранах с большим количеством пикселей (например, планшеты) вы хотели бы иметь более высокое разрешение изображения (поскольку диалог может быть больше). – Peter

+0

... Который вы также можете решить путем программного поиска ширины устройства. Я надеялся, что это будет возможно решить более элегантно. Я думаю, что эта проблема может быть связана с тем, что Dialog создается сначала с учетом полного размера изображения, и изображение затем масштабируется, чтобы вписаться в диалог, но сам размер диалога не обновляется ... – Peter

ответ

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

Советую с использованием макета progrmatically, потому что вы можете сделать макет XML, который имеет ImageView, который имеет свою layout_width и layout_height был в фиксированном дп, как и выше, и что будет делать точное поведение, как это делать программно, как упомянуто выше. Я думаю, что xml-макеты - хорошая практика, потому что у вас будут все ваши макеты в одном месте, и это более читаемо, а также вы можете иметь разные макеты для разных разрешений экрана (mdpi, hdpi, xhdpi) и другую конфигурацию устройства (портрет, пейзаж) и многие другие преимущества

+0

Настройка фиксированный размер для ImageView перед построением Dialog звучит как хорошее решение. Однако это не сработало для меня, как ожидалось: см. Отредактированный код выше. Это все еще заставляет диалог расширяться по всей высоте, а изображение не занимает этого места. Я установил 200x200 пикселей, поскольку это дало хороший результат, когда я уменьшил изображение до такого размера. – Peter

+0

Извините, см. Мой отредактированный ответ. Я пробовал это с успехом. –

+0

Теперь он работает! Большое спасибо за вашу помощь. Почему вы на самом деле не советуете программировать? Поскольку я не создал XML для этого диалога, мне легче не использовать XML, когда это не нужно. – Peter

1

Я думаю, что вы можете сделать:

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

Обратите внимание, что LayoutParams класс вложен в нескольких классы представлений, так что это зависит от ваших потребностей, например. если ваш ImageView находится внутри линейного Layout вы должны сделать что-то вроде этого:

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; 
+0

Спасибо, я использовал код, чтобы найти ширину устройства. Теперь работает отлично вместе с кодом в другом ответе. – Peter

Смежные вопросы