【问题标题】:Add rounded corner to Alert Dialog向警报对话框添加圆角
【发布时间】:2019-12-11 16:25:37
【问题描述】:

我正在尝试为AlertDialog 添加圆角,但我不了解形状文件的逻辑(不起作用)。我在AlertDialog 的RelativeLayout 中使用它作为背景,但它似乎被忽略了。这是形状文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@android:color/transparent"/>
    <corners android:radius="10dp" />
    <padding android:left="10dp" android:right="10dp"/>
</shape>

这是警告对话框 xml:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/dialog_rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    tools:context=".UserList"
    android:background="@drawable/shape_dialog">
    <TextView
        android:id="@+id/dialog_titile"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Scegli un'operazione"
        android:textAlignment="center"
        android:padding="5dp"
        android:textColor="@android:color/black"
        android:background="#D3D3D3"
        android:textSize="26dp" />

    <TextView
        android:id="@+id/dialog_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Vuoi aprire o eliminare il test?"
        android:textAlignment="center"
        android:padding="15dp"
        android:textSize="26dp"
        android:layout_marginLeft="80dp"
        android:background="@android:color/white"
        android:textColor="@android:color/black"
        android:layout_below="@id/dialog_titile" />
    <Button
        android:id="@+id/dialog_neutral_btn"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="Indietro"
        android:layout_below="@id/dialog_tv"
        android:textColor="@android:color/black"
        android:background="@drawable/button_bg_3" />
    <Button
        android:id="@+id/dialog_positive_btn"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:text="Apri"
        android:layout_alignBaseline="@id/dialog_neutral_btn"
        android:layout_alignParentRight="true"
        android:background="@drawable/button_bg_3"
        android:layout_marginRight="20dp"/>
    <Button
        android:id="@+id/dialog_negative_btn"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:text="Elimina"
        android:layout_toLeftOf="@id/dialog_positive_btn"
        android:layout_alignBaseline="@id/dialog_neutral_btn"
        android:background="@drawable/button_bg_3"
        android:layout_marginRight="10dp" />
</RelativeLayout>

And this is the result 我错过了什么?

【问题讨论】:

标签: java android android-alertdialog android-dialog material-components-android


【解决方案1】:

只需使用官方 Material Components for Android 库中包含的官方 Material AlertDialog。

new MaterialAlertDialogBuilder(context)
            .setTitle("Title")
            .setMessage("Message")
            .setPositiveButton("Ok", null)
            .show();

并使用主题

<item name="materialAlertDialogTheme">@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog</item>

它遵循指南:

您可以使用 shapeAppearanceOverlay 属性对您的组件进行customize the shape。

类似:

  <!-- Alert Dialog -->
  <style name="MyThemeOverlayAlertDialog" parent="@style/ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.MyApp.Dialog.Rounded</item>
  </style>

  <style name="ShapeAppearanceOverlay.MyApp.Dialog.Rounded" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">8dp</item>
  </style>

【讨论】:

  • 您知道是否可以使用MaterialAlertDialogBuilder 自定义圆角半径吗?
  • @TamirAbutbul 您可以使用shapeAppearanceOverlay 属性定义样式(可以传递给MaterialAlertDialogBuilder)。答案已更新。
【解决方案2】:

我检查了你的形状,它在我的手机上看起来不错,我的这个形状工作方式相同 + 有渐变:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
    android:angle="-90"
    android:centerColor="#F2F2F2"
    android:endColor="#ADA996"
    android:startColor="#DBDBDB" />
<stroke
    android:width="2dp"
    android:color="#000000" />
<corners android:radius="8dp" />

<padding
    android:bottom="4dp"
    android:left="4dp"
    android:right="4dp"
    android:top="4dp" />
</shape>
  • 尝试使用上面的形状,如果无论如何都不起作用,请尝试在单个按钮上使用您的形状 - 如果您看到您的形状正常工作,您就会知道您的问题来自您的布局文件。

  • 也许您需要做的只是Invalidate Caches/Restart,您可能没有错误,但您的应用正在使用来自缓存的旧形状

【讨论】:

  • 我认为 AlertDialogBu​​ilder 的行为因不同版本而异。这就是我的想法,如果无效工作室有帮助,那就完美了,反正从来没有尝试过
【解决方案3】:

你的 shape_dialog.xml 应该是这样的

<?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
   <solid
     android:color="@color/white"/>
   <corners
      android:radius="30dp" />
   <padding
    android:left="10dp"
    android:top="10dp"
    android:right="10dp"
    android:bottom="10dp" />
</shape>

你需要设置对话框的透明背景。

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

【讨论】:

    【解决方案4】:

    使用Dialog 类而不是AlertDialogBuilder。

    代码片段

    使用 Dialog 类而不是 AlertBuilder 定义此方法 showDialog()

    public void showDialog() {
    
        final Dialog dialog = new Dialog(this);
        dialog.setContentView(R.layout.your_xml);
    
        Button dialog_neutral_btn = dialog.findViewById(R.id.dialog_neutral_btn);
        Button dialog_positive_btn = dialog.findViewById(R.id.dialog_positive_btn);
        Button dialog_negative_btn=dialog.findViewById(R.id.dialog_negative_btn);
        TextView dialog_titile = dialog.findViewById(R.id.dialog_titile);
        TextView dialog_tv = dialog.findViewById(R.id.dialog_tv);
    
    
       // do you stuff here , define click listeners
    
        dialog.show();
    }
    

    用法

     yourButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               showDialog();
            }
        });
    

    注意:-

    android.support.v7.app.AlertDialog
    

    而不是

    android.app.AlertDialog
    

    如果您想使用 AlertDialogBu​​ilder

    【讨论】:

    • 我认为您的回答不是很相关,他在这里问的是如何制作圆角而不是如何显示对话框。如有错误欢迎指正
    • 就像我提到的使用对话框类“代替”AlertDilogBu​​ilder”是我已经回答的问题的解决方案
    • 那是我的误会。你得到了我的支持
    • 只有当我的答案有效时,你的支持才对我很重要。在这里帮助提供对他们有用的答案。我不是最好的,但我正在学习 :)
    • 我在不同版本上遇到了 AlertDialogBu​​ilder 行为的问题,所以我选择了 Dialog 类
    【解决方案5】:

    您可以通过以下步骤来实现。

    您必须为 Textview 和主布局创建两个可绘制形状的 xml

    1. border_no_white_bg.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/white" />
    <stroke
        android:width="1dp"
        android:color="@color/white" />
    
      <corners android:radius="6dp" />
    </shape>
    
    
    
    2. shape_button_orange_bg_with_radius.xml
    
    <?xml version="1.0" encoding="utf-8"?>
     <shape xmlns:android="http://schemas.android.com/apk/res/android">
    
    <stroke
        android:width="1dp"
        android:color="@color/black" />
      <corners android:radius="15dp" />
    </shape>
    
    3. Now in main_popup.xml, replace by below code
    <?xml version="1.0" encoding="utf-8"?>
    

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="15dp"
        android:background="@drawable/border_no_white_bg"
        android:orientation="vertical">
    
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_margin="10dp"
            android:background="#CCCCCC"
            android:baselineAligned="false"
            android:gravity="center"
            android:padding="10dp"
            android:text="Scegli un'operazione"
            android:textColor="#000"
            android:textSize="18sp" />
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_margin="10dp"
            android:baselineAligned="false"
            android:gravity="center"
            android:padding="10dp"
            android:text="Vuoi aprire o eliminare il test?"
            android:textColor="#000"
            android:textSize="18sp" />
    
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dp"
            android:orientation="horizontal">
    
    
            <Button
                android:layout_width="wrap_content"
                android:layout_height="40dp"
                android:layout_marginLeft="15dp"
                android:layout_marginRight="15dp"
                android:background="@drawable/shape_button_orange_bg_with_radius"
                android:text="Indietro"
                android:textColor="#000"
                android:textSize="14sp" />
    
    
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:orientation="horizontal">
    
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="40dp"
                    android:layout_marginLeft="5dp"
                    android:layout_marginRight="5dp"
                    android:background="@drawable/shape_button_orange_bg_with_radius"
                    android:text="Apri"
                    android:textColor="#000"
                    android:textSize="14sp" />
    
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="40dp"
                    android:layout_marginLeft="5dp"
                    android:layout_marginRight="15dp"
                    android:background="@drawable/shape_button_orange_bg_with_radius"
                    android:text="Elimina"
                    android:textColor="#000"
                    android:textSize="14sp" />
            </LinearLayout>
    
        </RelativeLayout>
    
    
         </LinearLayout>
    
     </RelativeLayout>
    
    
    4. popup_window_animation
       Inside res->values->style.xml, add this code
    
    
    
    <style name="popup_window_animation">
        <item name="android:windowEnterAnimation">@anim/fade_in</item>
        <item name="android:windowExitAnimation">@anim/fade_out</item>
    </style>
    

    现在创建一个方法来调用这个布局

    public void showPopup(View anchorView) {
    
        final View popupView = getLayoutInflater().inflate(R.layout.main_popup, null);
    
        RelativeLayout layout_close;
        // Declare your views here
    
        final PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        popupWindow.setAnimationStyle(R.style.popup_window_animation);
    
        layout_feedback_close = (RelativeLayout) popupView.findViewById(R.id.layout_feedback_close);
        // Here find view by ids
    
        layout_feedback_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
            }
        });
    
        popupWindow.setFocusable(true);
        popupWindow.setBackgroundDrawable(new ColorDrawable());
        int location[] = new int[2];
        anchorView.getLocationOnScreen(location);
        popupWindow.showAtLocation(anchorView, Gravity.CENTER, location[0], location[1] + anchorView.getHeight());
         }
    

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2017-06-02
      • 2020-11-14
      • 2020-11-13
      相关资源
      最近更新 更多