Intereting Posts
Как получить прозрачный фон версии webView for 4.0 Почему путь, нарисованный на масштабированной GLES20RecordingCanvas и простой холст, имеет разные качества? Android ZBar Exception только с созданием Jenkins Как получить список записей фрагмента backstack в android? SetExactAndAllowWhileIdle – не является точным по ссылке разработчика Robolectric includeAndroidResources не найден Добавление динамического представления в элемент RecyclerView Выполнение паузы активности, которая не возобновляется после воссоздания метода Как использовать намерение выбора файлового браузера для выбора файла Установите баннер AdMob в соответствии с шириной родителя по XML Keytool не запрашивает пароль (используя Facebook lib с Android) View.onDraw () – когда он вызван? Программно вернуться к предыдущему фрагменту в стопке Удалить значок / логотип из панели действий на Android Как отправить большой файл или несколько файлов в другие приложения и знать, когда их удалять?

Кнопки Dialog с длинным текстом, не обертывающим / выжатым – материальная тема на android 5.0 lollipop

Оптимизируя приложение для материальной темы на леденец, я сталкиваюсь с этой неприятной проблемой:

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

Скриншот: http://s29.postimg.org/3vqp884cn/dialogs_light_holo_material.png

До сих пор я потратил много времени на эту проблему, и единственной темой, которую я смог найти в Интернете, является следующее: https://code.google.com/p/android/issues/detail?id= 78302

Поэтому я беру там совет и задаю этот вопрос здесь.

То, что я пробовал, смотрит в исходный код (кнопки определяются с maxLines = 2) и меняют разные параметры на buttonBarStyle и buttonBarButtonStyle, но без успеха.

Из-за этого я ищу простой стиль-решение и не хочу использовать сторонние библиотеки.

Может быть, это только проблема эмулятора? Я так не думаю.

Помощь очень ценится. Заранее спасибо.

Изменить: Чтобы следить, см. Мой собственный ответ от 3 декабря, который не является решением.

Solutions Collecting From Web of "Кнопки Dialog с длинным текстом, не обертывающим / выжатым – материальная тема на android 5.0 lollipop"

После этого – поскольку я не могу опубликовать более двух ссылок из-за репутации моих новичков, я должен опубликовать ответ на свой вопрос, а не редактировать его.

Ниже я попытался стилизовать кнопки с помощью buttonBarStyle и buttonBarButtonStyle для достижения любого улучшения – см. Результаты здесь: http://s12.postimg.org/uyp0p0e6l/dialog_material_button_fix_tests_1.png

К сожалению, это явно нежелательные решения.

<resources> <style name="AppBaseTheme" parent="android:Theme.Material.Light"> <!-- AlertDialog Style override in order to try to fix non line breaking buttons --> <item name="android:alertDialogTheme">@style/CustomAlertDialogStyle</item> </style> <style name="CustomAlertDialogStyle" parent="android:Theme.Material.Light.Dialog.Alert"> <item name="android:buttonBarButtonStyle">@style/CustomButtonBarButtonStyle</item> <item name="android:buttonBarStyle">@style/CustomButtonBarStyle</item> </style> <style name="CustomButtonBarStyle" parent="@android:style/Widget.Material.Light.ButtonBar.AlertDialog"> <!-- Making sure, the button bar uses parent width and is not restricted in height --> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:height">@null</item> <item name="android:minHeight">@null</item> </style> <style name="CustomButtonBarButtonStyle" parent="@android:style/Widget.Material.Light.Button.Borderless.Colored"> <!-- Setting the weight as follows should result in equally wide buttons filling the alert dialog width, but instead they span further out of the dialog, breaking in multiple lines though --> <item name="android:layout_width">0dp</item> <item name="android:layout_weight">1</item> <!-- setting a fixed width as follows results in narrow buttons with line breaks, but of course this is not a solution --> <!-- <item name="android:width">100dp</item> --> </style> </resources> 

Это можно было бы исправить с помощью кнопок со стрелками вместо кнопок строк. Здесь мое обходное решение, как это можно сделать с помощью AppCompat lib:

Код import android.support.v7.app.AlertDialog;

  AlertDialog.Builder builder; builder = new AlertDialog.Builder(context, R.style.StackedAlertDialogStyle); builder.setTitle("Title"); builder.setMessage("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc dignissim purus eget gravida mollis. Integer in auctor turpis. Morbi auctor, diam eget vestibulum congue, quam arcu pulvinar dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu arcu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LinearLayout linearLayout = (LinearLayout) button.getParent(); linearLayout.setOrientation(LinearLayout.VERTICAL); } catch(Exception ex){ //ignore it } 

Стиль

 <style name="StackedAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"> <item name="buttonBarButtonStyle">@style/StackedButtonBarButtonStyle</item> </style> <style name="StackedButtonBarButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog"> <item name="android:layout_gravity">right</item> </style> 

результат

Диалоговое окно с установленным оповещением

Подвести итог этой теме всем, кто интересуется:

Тема Android Material, похоже, имеет ошибку с автоматическим диапазоном ширины кнопок в диалоговом окне предупреждений.

Когда у вас есть, например, 3 кнопки, одна из которых имеет более одного слова, положительная кнопка, скорее всего, будет выжата из диалогового окна справа, вместо кнопки с несколькими словами, обернутыми в несколько строк, чтобы все Кнопки вписываются в панель кнопок, как и основная тема / голо-тема.

Кажется, что не существует решений только путем внесения изменений в buttonBarStyle и / или buttonBarButtonStyle, так как их стили не ограничивают тексты кнопок, которые по умолчанию завернуты в несколько строк.

Конечно, диалоговые кнопки «Тематические темы» требуют больше места, чем в других темах в целом, из-за шапок, смелости и щедрых дополнений и фона, но это не является источником проблемы, она просто заставляет ее казаться раньше, чем если бы стиль был меньше места нуждающимся.

Единственный способ решить эту проблему, похоже, придает вашим кнопкам более короткие названия, если вы не хотите стираться в сторону от внешнего вида материала (например, уменьшать размер текста кнопки и / или устанавливать allCaps на false).

Быстрое soln, которое не является динамическим, состоит в том, чтобы добавить \ n, чтобы сломать длинную строку вверх

Вот обходной путь, который я придумал, с помощью связанного ответа от Andrey T ( https://stackoverflow.com/a/29662638/1317564 ):

Во-первых, вы создаете метод утилиты, который будет обертывать кнопки только в том случае, если их нужно обернуть:

 public static void applyWorkaroundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getParent() instanceof LinearLayout)) return; // Workaround for buttons too large in alternate languages. final LinearLayout linearLayout = (LinearLayout) dialogButton.getParent(); linearLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { if (right - left > 0) { final int parentWidth = linearLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < linearLayout.getChildCount(); ++i) childrenWidth += linearLayout.getChildAt(i).getWidth(); if (childrenWidth > parentWidth) { // Apply stacked buttons linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setPadding(linearLayout.getPaddingLeft(), 0, linearLayout.getPaddingRight(), linearLayout.getPaddingBottom()); for (int i = 0; i < linearLayout.getChildCount(); ++i) { if (linearLayout.getChildAt(i) instanceof Button) { final Button child = (Button) linearLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) child.getLayoutParams(); params.width = LinearLayout.LayoutParams.MATCH_PARENT; params.gravity = Gravity.END; child.setLayoutParams(params); } else if (linearLayout.getChildAt(i) instanceof Space) { linearLayout.removeViewAt(i--); } } } linearLayout.removeOnLayoutChangeListener(this); } } }); } 

Вы можете добавить дополнительную обработку ошибок (например, try / catch) и настроить ее по мере необходимости.

Теперь вы вызываете этот метод утилиты, когда отображается диалоговое окно:

 dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { MaterialAlertDialogUtils.applyWorkaroundForButtonWidthsTooWide(dialog.getButton(AlertDialog.BUTTON_POSITIVE)); } }); 

Это делает трюк и будет только обернуть кнопки, если это необходимо. Я использую его повсюду, так как даже диалоги с двумя кнопками могут потребоваться обертывание на немецком языке, и трехкнопочные диалоги наверняка нуждаются в нем на многих языках.

Используйте следующий код, позвольте кнопкам справа и по вертикали

 alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { try { LinearLayout linearLayout = (LinearLayout) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).getParent(); if (linearLayout != null) { linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setGravity(Gravity.RIGHT); } } catch (Exception ignored) { } } });