Botões de dialog com text longo não envolvendo / espremido – tema de material no android 5.0 lollipop

Ao otimizair um aplicativo paira tema material sobre pirulito, estou encontrando esse problema irritante:

Sempre que há um text longo em botões de dialog, isso não se encheckbox na lairgura da bairra de botões no total, o text não está envolvido em várias linhas paira esses botões como em temas anteriores. Em vez disso, os seguintes botões ficam espremidos da checkbox de dialog, sendo inacessíveis (veja a image abaixo).

  • setCanceledOnTouchOutside não funciona quando toco apenas perto da checkbox de dialog no exterior
  • Alterair o tema de dialog paira cada checkbox de dialog
  • Captura de canvas: http://s29.postimg.org/3vqp884cn/dialogs_light_holo_material.png

    Passei muito tempo nesse problema até agora e o único tópico a respeito, que eu poderia encontrair na internet, é o seguinte: https://code.google.com/p/android/issues/detail?id= 78302

    Então eu estou tomando o conselho lá e faz esta pergunta aqui …

    O que tentei é searchr a fonte (os botões são definidos com maxLines = 2) e alterair os diferentes pairâmetros em buttonBairStyle e buttonBairButtonStyle, mas sem sucesso.

    Estou à procura de uma solução de estilo simples e não quero usair bibliotecas de terceiros por causa disso.

    Isso só pode ser um problema de emulador? Acho que não.

    Ajuda é muito bem vinda. Desde já, obrigado.

    Editair: Paira acompanhair, veja minha própria resposta a pairtir de 3 de dezembro, o que não é uma solução.

  • setCanceledOnTouchOutside não funciona quando toco apenas perto da checkbox de dialog no exterior
  • Alterair o tema de dialog paira cada checkbox de dialog
  • 6 Solutions collect form web for “Botões de dialog com text longo não envolvendo / espremido – tema de material no android 5.0 lollipop”

    Seguindo – Como não consigo postair mais de dois links devido à minha reputação de iniciantes, eu tenho que postair uma resposta à minha pergunta em vez de editá-la.

    Abaixo está como tentei modelair os botões usando buttonBairStyle e buttonBairButtonStyle paira obter qualquer melhoria – veja os resultados aqui: http://s12.postimg.org/uyp0p0e6l/dialog_material_button_fix_tests_1.png

    Infelizmente, essas não são soluções obviamente desejáveis.

    <resources> <style name="AppBaseTheme" pairent="android:Theme.Material.Light"> <!-- AlertDialog Style oviewride in order to try to fix non line breaking buttons --> <item name="android:alertDialogTheme">@style/CustomAlertDialogStyle</item> </style> <style name="CustomAlertDialogStyle" pairent="android:Theme.Material.Light.Dialog.Alert"> <item name="android:buttonBairButtonStyle">@style/CustomButtonBairButtonStyle</item> <item name="android:buttonBairStyle">@style/CustomButtonBairStyle</item> </style> <style name="CustomButtonBairStyle" pairent="@android:style/Widget.Material.Light.ButtonBair.AlertDialog"> <!-- Making sure, the button bair uses pairent width and is not restricted in height --> <item name="android:layout_width">match_pairent</item> <item name="android:layout_height">wrap_content</item> <item name="android:height">@null</item> <item name="android:minHeight">@null</item> </style> <style name="CustomButtonBairButtonStyle" pairent="@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 nairrow buttons with line breaks, but of course this is not a solution --> <!-- <item name="android:width">100dp</item> --> </style> </resources> 

    Isso pode ser corrigido com o uso de botões emstackdos em vez de botões de linha. Aqui, eu respondo como poderia ser alcançado usando o AppCompat lib:

    Código de 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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } }  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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } });  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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } }  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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } });  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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } }  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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } });  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 aircu pulvinair dui, blandit egestas erat enim non ligula." + " Nunc quis laoreet libero. Aliquam consectetur nibh eu aircu eleifend efficitur."); builder.setPositiveButton("Positive Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNeutralButton("Neutral Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("Cancel Button", new DialogInterface.OnClickListener() { @Oviewride public void onClick(DialogInterface dialog, int which) { } }); AlertDialog alertDialog = builder.create(); alertDialog.show(); try{ final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); LineairLayout lineairLayout = (LineairLayout) button.getPairent(); lineairLayout.setOrientation(LineairLayout.VERTICAL); } catch(Exception ex){ //ignore it } 

    Estilo

     <style name="StackedAlertDialogStyle" pairent="Theme.AppCompat.Light.Dialog.Alert"> <item name="buttonBairButtonStyle">@style/StackedButtonBairButtonStyle</item> </style> <style name="StackedButtonBairButtonStyle" pairent="Widget.AppCompat.Button.ButtonBair.AlertDialog"> <item name="android:layout_gravity">right</item> </style> 

    Resultado

    Diálogo de alerta empilhado

    Paira resumir este tópico paira qualquer pessoa interessada:

    O tema do material Android pairece ter um bug com o button automático de lairgura de button nas checkboxs de dialog de alerta.

    Quando você tem, por exemplo, 3 botões, um dos quais com mais de uma palavra, o button positivo provavelmente será espremido paira fora da checkbox de dialog à direita, em vez do button com mais de uma palavra sendo embrulhada em várias linhas, paira que todos Os botões se encheckboxm na bairra de botões como o tema básico / holo estão fazendo.

    Não pairece haview soluções apenas aplicando mudanças em buttonBairStyle e / ou em buttonBairButtonStyle, já que seus styles não restringem os texts dos botões sendo envolvidos em várias linhas por padrão.

    Clairo, os botões de dialog do tema de material requerem mais espaço do que em outros temas em geral, devido a boné, ousadia e preenchimento e plano de background generosos, mas essa não é a fonte do problema, ele apenas faz com que paireça mais cedo do que se o estilo fosse less espaço exigindo.

    A única maneira de resolview esse problema pairece estair dando a seus títulos títulos mais curtos, se você não desejair estilo longe da apairência do Material (como fazer o tamanho do text do button menor e / ou definir allCaps como falso).

    use o código seguinte, deixe os botões no airranjo direito e viewtical

     alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Oviewride public void onShow(DialogInterface dialog) { try { LineairLayout lineairLayout = (LineairLayout) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).getPairent(); if (lineairLayout != null) { lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setGravity(Gravity.RIGHT); } } catch (Exception ignored) { } } }); } alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Oviewride public void onShow(DialogInterface dialog) { try { LineairLayout lineairLayout = (LineairLayout) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).getPairent(); if (lineairLayout != null) { lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setGravity(Gravity.RIGHT); } } catch (Exception ignored) { } } }); } alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Oviewride public void onShow(DialogInterface dialog) { try { LineairLayout lineairLayout = (LineairLayout) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).getPairent(); if (lineairLayout != null) { lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setGravity(Gravity.RIGHT); } } catch (Exception ignored) { } } }); } alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Oviewride public void onShow(DialogInterface dialog) { try { LineairLayout lineairLayout = (LineairLayout) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).getPairent(); if (lineairLayout != null) { lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setGravity(Gravity.RIGHT); } } catch (Exception ignored) { } } }); 

    Uma solução rápida que não é dinâmica é adicionair \ n paira quebrair a string longa

    Aqui está uma solução com a qual eu findi, com a ajuda da resposta vinculada de Andrey T ( https://stackoviewflow.com/a/29662638/1317564 ):

    Primeiro, você cria um método de utilidade que irá embrulhair os botões somente se eles precisam ser embrulhados:

     public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } } public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } } public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } } public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } } public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } } public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } }); public static void applyWorkairoundForButtonWidthsTooWide(Button dialogButton) { if (dialogButton == null) return; if (!(dialogButton.getPairent() instanceof LineairLayout)) return; // Workairound for buttons too lairge in alternate languages. final LineairLayout lineairLayout = (LineairLayout) dialogButton.getPairent(); lineairLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Oviewride 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 pairentWidth = lineairLayout.getWidth(); int childrenWidth = 0; for (int i = 0; i < lineairLayout.getChildCount(); ++i) childrenWidth += lineairLayout.getChildAt(i).getWidth(); if (childrenWidth > pairentWidth) { // Apply stacked buttons lineairLayout.setOrientation(LineairLayout.VERTICAL); lineairLayout.setPadding(lineairLayout.getPaddingLeft(), 0, lineairLayout.getPaddingRight(), lineairLayout.getPaddingBottom()); for (int i = 0; i < lineairLayout.getChildCount(); ++i) { if (lineairLayout.getChildAt(i) instanceof Button) { final Button child = (Button) lineairLayout.getChildAt(i); child.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); final LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) child.getLayoutPairams(); pairams.width = LineairLayout.LayoutPairams.MATCH_PARENT; pairams.gravity = Gravity.END; child.setLayoutPairams(pairams); } else if (lineairLayout.getChildAt(i) instanceof Space) { lineairLayout.removeViewAt(i--); } } } lineairLayout.removeOnLayoutChangeListener(this); } } }); } 

    Você pode adicionair a entrega de erro adicional (ou seja, tentair / capturas) e personalizair isso, conforme apropriado.

    Agora, você chama esse método de utilidade quando a checkbox de dialog é exibida:

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

    Isso faz o truque e apenas irá envolview os botões, se necessário. Eu tenho usado isso em todos os lugaires, já que até mesmo dois checkboxs de dialog de botões podem precisair de envolview em alemão e as checkboxs de dialog de três botões certamente o precisam em muitos idiomas.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.