【问题标题】:Full width button material dialogs全宽按钮材质对话框
【发布时间】:2015-05-23 23:12:08
【问题描述】:

我正在尝试查找示例代码来实现带有全宽按钮的材质对话框,如下面的屏幕截图所示。

有人可以通过分享如何复制此设计的示例代码来提供帮助吗?

【问题讨论】:

  • 查看此页面Here

标签: android material-design android-5.0-lollipop android-dialog


【解决方案1】:

您可以通过仅使用 AppCompat 来实现,查看我的解决方法:

代码

    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>

结果

【讨论】:

  • 这不是一个好主意。首先,有一个对话框布局的假设,它是内部的并且可以改变。其次,appCompat 的实现表明 alertDialog.getButton 返回 null 因为按钮只设置在 show() 函数上,此时此逻辑不会影响对话框布局
  • 不是很好,是android sdk,没有提供api来根据材料指南修改警报对话框。当然,内部实现可以更改,但如果您要更新 appcompat 版本,您需要检查更新后对话框是否可以正常工作 - 但这是一种解决方法,它可能有限制。
  • 我正在使用appcompat v24.0.0.0,当文本很长时,它似乎会自动垂直堆叠按钮。
  • @Bruce 是的,似乎警报对话框中对堆栈按钮的支持已包含在最新版本的 appcompat 之一中
  • 我同意修改内部布局是有风险的。
【解决方案2】:

这是我在仅使用 AppCompat 库的应用中的表现 您可以选择任意数量

String[] mOptionsArray = new String[]{"Option 1", "Option 2"};
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setTitle("Cool! title");
    builder.setMessage("Cool! message");

    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.dialog_list_view, null);
    ListView listView = (ListView) view.findViewById(R.id.list_view);
    listView.setAdapter(new ArrayAdapter<>(
            getContext(),
            R.layout.dialog_list_item,
            R.id.button,
            mOptionsArray
    ));
    listView.setDivider(null);
    listView.setOnItemClickListener(mOnItemClickListener);
    builder.setView(view);

    return builder.create();
}

dialog_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="8dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp" />

dialog_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/button"
    style="@style/Widget.AppCompat.Button.Borderless.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@null"
    android:clickable="false"
    android:focusable="false"
    android:gravity="right|center_vertical"
    android:paddingRight="8dp"
    android:paddingLeft="8dp"
    android:text="Button"
    android:textAllCaps="true" />

参考:http://www.materialdoc.com/flat-button/https://material.io/guidelines/components/dialogs.html#dialogs-specshttps://material.io/guidelines/components/buttons.html#buttons-style

【讨论】:

    【解决方案3】:

    如果按钮有很长的消息文本,它是自动的。

    new MaterialAlertDialogBuilder(this)
                    .setTitle("Title")
                    .setMessage(R.string.lorem_inpsum)
                    .setPositiveButton(getResources().getString(R.string.long_positive), null)
                    .setNegativeButton(getResources().getString(R.string.long_negative), null)
                    .show();
    

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2021-11-26
      • 2020-03-20
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多