18

我想知道如何在对话框中摆脱(或更改颜色)titleDivider。它是蜂窝+设备上显示的对话框标题下方的蓝线。

烦人的标题分隔线

我想这是来自 SDK 的相关布局,但由于没有样式属性,我不知道如何设置它的样式。如果我尝试使用 findViewById 则没有 android.R.id.titleDivider

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:fitsSystemWindows="true">
    <TextView android:id="@android:id/title" style="?android:attr/windowTitleStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="@android:dimen/alert_dialog_title_height"
        android:paddingLeft="16dip"
        android:paddingRight="16dip"
        android:gravity="center_vertical|left" />
    <View android:id="@+id/titleDivider"
            android:layout_width="match_parent"
            android:layout_height="2dip"
            android:background="@android:color/holo_blue_light" />
    <FrameLayout
        android:layout_width="match_parent" android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:foreground="?android:attr/windowContentOverlay">
        <FrameLayout android:id="@android:id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </FrameLayout>
</LinearLayout>

我试图覆盖在我的 theme.xml 中仅引用 dialog_title_holo.xml 的 dialogTitleDecorLayout,但没有成功。错误是:

错误:错误:找不到与给定名称匹配的资源:attr 'dialogTitleDecorLayout'。

4

15 回答 15

23

要获得对titleDividerof的引用AlertDialog以更改其颜色:

int divierId = dialog.getContext().getResources()
                .getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
divider.setBackgroundColor(getResources().getColor(R.color.creamcolor));
于 2013-12-31T09:26:51.207 回答
13

You need to implement

myDialog = builder.create();
myDialog.setOnShowListener(new OnShowListenerMultiple());

//----------------------------
//Function to change the color of title and divider of AlertDialog
public static class OnShowListenerMultiple implements DialogInterface.OnShowListener {
    @Override
    public void onShow( DialogInterface dialog ) {
        if( !(dialog instanceof Dialog) )
            return;

        Dialog d = ((Dialog) dialog);
        final Resources resources = d.getContext().getResources();
        final int color = AppUtility.getColor( resources, R.color.defaultColor );

        try {
            int titleId = resources.getIdentifier( "android:id/alertTitle", null, null );
            TextView titleView = d.findViewById( titleId );
            titleView.setTextColor( color );
        }
        catch( Exception e ) {
            Log.e( "XXXXXX", "alertTitle could not change color" );
        }

        try {
            int divierId = resources.getIdentifier( "android:id/titleDivider", null, null );
            View divider = d.findViewById( divierId );
            divider.setBackgroundColor( color );
        }
        catch( Exception e ) {
            Log.e( "XXXXXX", "titleDivider could not change color" );
        }
    }
}
于 2014-04-12T00:44:25.887 回答
9

我通过使用 DialogFragment.STYLE_NO_TITLE 主题解决了这个问题,然后在对话框布局中伪造标题栏。

于 2012-06-11T11:29:13.157 回答
3

这是我解决这个问题的方法(感谢http://joerg-richter.fuyosoft.com/?p=181):

MyDialogBu​​ilder.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;
}
}
于 2015-01-20T18:51:15.417 回答
2

利用

 <View android:id="@+id/titleDivider"
        android:layout_width="match_parent"
        android:layout_height="2dip"
        android:background=#CC3232 />
于 2012-06-11T10:55:59.433 回答
2

在写之前dialog.show(),写:

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));}

colors.xml 中

<color name="transparent">#00000000</color>
于 2016-01-25T05:57:56.177 回答
1

如果您不想使用默认样式,请不要使用 AlertDialog。您可以使用带有对话框主题的活动(使用您的自定义布局)。

<activity android:theme="@android:style/Theme.Dialog">
于 2013-12-31T08:08:09.390 回答
0

你的想法是正确的。但是,您要查找的dialogTitleDecorLayout是私有资源,因此您无法以正常方式访问它。但是您仍然可以使用 * 语法访问它:

<item name="*android:dialogTitleDecorLayout">@layout/dialog_title</item>

将此添加到我自己的样式中,只需将 dialog_title.xml 复制到我的应用程序并稍作更改即可解决我的问题。

于 2013-12-17T15:58:07.470 回答
0

你可以像这样制作一个自定义对话框:

    Dialog dialog = new Dialog(this);
    dialog.setContentView(R.layout.custom_dialog);
    Button okay = (Button) dialog.findViewById(R.id.button1);
    okay.setOnClickListener(new OnClickListener() {

         public void onClick(View arg0) {

           // do your work
         }
    });

在布局中设置自定义标题不要使用android

     dialog.setTitle();

和你的 custom_dialog.xml

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:android1="http://schemas.android.com/apk/res/android"
   android:id="@+id/layout_root"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical"
   android:padding="10dp">

  <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textColor="#ffffff"
      android:textSize="40sp" 
      android:text="Hello"/>


    <Button
        android:id="@+id/button1"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="150dp"
        android:text="OK" />

    </RelativeLayout>
于 2013-12-31T08:14:57.717 回答
0

如果我猜对了,“删除蓝线”意味着删除对话框标题和正文之间的边框。该边框来自 Holo 主题,因此在不使用自定义布局的情况下无法删除它。

使用以下内容创建一个名为 custom-dialog.xml 的文件(这只是一个示例..根据需要修改它):

<?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>

如您所见,我使用的资源和东西不在您的项目中,但您可以安全地删除它们。在我的情况下,结果或多或少是以下一个,顶部有一个图像,我将以编程方式在代码中设置。

简单截图

要创建对话框,请使用以下内容:

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;
}
于 2013-12-31T08:16:34.073 回答
0

你看这个吗,有一个 pcecial 图书馆,你可以在那里看。最后一个链接会解决你的问题

于 2013-12-31T08:09:58.947 回答
0

这些是无法通过控制兄弟来隐藏的。我遇到了同样的问题。您唯一能做的就是创建自己的 CustomDialog

这是一个示例应用程序

下载看看设计模式,就很简单了

这是一个关于制作自定义对话框的教程

重要的部分是创建 DialogObject 后不要通过 setTitle() 设置标题在 CustomLayout 中创建 TextView 并从 findViewByID() 调用它并设置标题

于 2013-12-31T08:12:28.927 回答
0

这个在一些 4.x 设备上进行了测试:

    TextView title = (TextView)getWindow().getDecorView().findViewById(android.R.id.title);
    ((ViewGroup)title.getParent()).getChildAt(1).setVisibility(View.GONE);
于 2013-07-04T14:48:59.470 回答
0

在colors.xml中:

<color name="transparent">#00000000</color>

在对话框中:

int divierId = dialog.getContext().getResources().getIdentifier("android:id/titleDivider",null, null);

查看分隔符 = d.findViewById(divierId); divider.setBackgroundColor(getResources().getColor(R.color.transparent));

于 2016-01-25T06:02:04.993 回答
0

为了完全隐藏默认的蓝线(假设你在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);
        }
    }
于 2016-10-11T18:34:32.380 回答