Styling titleDivider in Dialog

后端 未结 15 914
面向向阳花
面向向阳花 2020-12-06 05:27

I am wondering how it is possible to get rid of (or change color) titleDivider in Dialog. It is a blue line below dialog title shown on honeycomb+ devices.

相关标签:
15条回答
  • 2020-12-06 05:37

    Before write dialog.show(), write:

    int divierId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider",   null, null);
    View divider = dialog.findViewById(divierId);
    if(divider!=null){
    divider.setBackgroundColor(getResources().getColor(R.color.transparent));}
    

    In colors.xml:

    <color name="transparent">#00000000</color>
    
    0 讨论(0)
  • 2020-12-06 05:37

    If you don't want to use Default style, don't use AlertDialog. You could go with Activity(with your custom layout) with Dialog Theme.

    <activity android:theme="@android:style/Theme.Dialog">
    
    0 讨论(0)
  • 2020-12-06 05:39

    Here is how I resolved that (thanks to http://joerg-richter.fuyosoft.com/?p=181 ):

    MyDialogBuilder.class

    public class MyDialogBuilder extends android.app.AlertDialog.Builder {
    
    public MyDialogBuilder(Context context) {
        super(context);
    }
    
    @NonNull
    @Override
    public android.app.AlertDialog create() {
        final android.app.AlertDialog alertDialog = super.create();
    
        alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                int titleDividerId = getContext().getResources()
                        .getIdentifier("titleDivider", "id", "android");
    
                View titleDivider = alertDialog.findViewById(titleDividerId);
                if (titleDivider != null) {
                    titleDivider.setBackgroundColor(getContext().getResources()
                            .getColor(R.color.alert_dialog_divider));
                }
            }
        });
    
        return alertDialog;
    }
    }
    
    0 讨论(0)
  • 2020-12-06 05:44

    "Removing the blue line" if I guess correctly means dropping the border between the title of the dialog and it's body. That border come from the Holo theme, so it's not possible to drop it without using your custom layout.

    Create a file named custom-dialog.xml with the following content (it's just an example..modify it as you want):

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/general_dialog_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <ImageView
            android:id="@+id/dialogTopImage"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="0.12"
            android:padding="10dp" />
    
        <LinearLayout
            android:id="@+id/dialogLine"
            android:layout_width="fill_parent"
            android:layout_height="3dp"
            android:background="@drawable/green_btn"
            android:orientation="vertical" />
    
        <TextView
            android:id="@+id/dialogText"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="0.32"
            android:padding="5dp"
            android:text=""
             />
    
        <LinearLayout
            android:id="@+id/general_dialog_layout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_gravity="center"
            android:layout_marginBottom="5dp"
            android:layout_weight="0.11"
            android:gravity="center"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/dialogButton"
                android:layout_width="100dp"
                android:textSize="8pt"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:background="@drawable/green_btn"
                android:gravity="center"
                android:text="Ok" />
    
    </LinearLayout>
    

    As you see I'm using resources and stuff that won't be in your project, but you can remove them safely. The result in my case is more or less the following one, with an image at top that I'll programatically set in the code.

    simple screenshot

    To create the dialog then use something like:

    private Dialog createAndShowCustomDialog(String message, Boolean positive, Drawable d, View.OnClickListener cl, String text1) {
    
        final Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.general_dialog_layout);
        // BIND
        ImageView image = (ImageView) dialog.findViewById(R.id.dialogTopImage);
        TextView text = (TextView) dialog.findViewById(R.id.dialogText);
        Button button = (Button) dialog.findViewById(R.id.dialogButton);
        LinearLayout line = (LinearLayout) dialog.findViewById(R.id.dialogLine);
    
        // SET WIDTH AND HEIGHT
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int width = (int) (displaymetrics.widthPixels * 0.85);
        int height = (int) (displaymetrics.heightPixels * 0.60);
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.width = width;
        dialog.getWindow().setLayout(width, height);
    
    
        // SET TEXTS
        text.setText(message);
        button.setText(text1);
    
        // SET IMAGE
        if (d == null) {
            image.setImageDrawable(getResources().getDrawable(R.drawable.font_error_red));
        } else {
            image.setImageDrawable(d);
        }
    
        // SET ACTION
        if (cl == null) {
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        } else {
            button.setOnClickListener(cl);
        }
    
    
        // SHOW
        dialog.show();
        return dialog;
    }
    
    0 讨论(0)
  • 2020-12-06 05:44

    In order to hide the default blue line completely (assuming you're in DialogFragment):

        Dialog dialog = getDialog();
        if (dialog != null) {
            final int dividerId = dialog.getContext().getResources()
                    .getIdentifier("android:id/titleDivider", null, null);
            View divider = dialog.findViewById(dividerId);
            if  (divider != null) {
                divider.setBackground(null);
            }
        }
    
    0 讨论(0)
  • 2020-12-06 05:45

    I solved the issue by using DialogFragment.STYLE_NO_TITLE theme and then faking title bar in dialog layout.

    0 讨论(0)
提交回复
热议问题