18

DialogでtitleDividerを削除(または色変更)する方法を考えています。これは、ハニカム+デバイスに表示されるダイアログタイトルの下の青い線です。

迷惑な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

色を変更するためのの参照を取得するにtitleDividerは: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

実装する必要があります

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

これは、いくつかの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

あなたの考えは正しかった。ただし、探していたdialogTitleDecorLayoutはプライベートリソースであるため、通常の方法でアクセスすることはできません。ただし、*構文を使用してアクセスできます。

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

これを自分のスタイルに追加し、dialog_title.xmlをアプリにコピーして変更するだけで、私の場合の問題はわずかに解決しました。

于 2013-12-17T15:58:07.470 に答える
0

あなたはこれを見ますか、そしてそのための特別な図書館があります、あなたはそこでそれを見ることできます。そして最後のリンクはあなたの問題を解決します

于 2013-12-31T08:09:58.947 に答える
0

これらはコントロールブラザによってそれを隠す方法ではありません..私は同じ問題を抱えていました。あなたができる唯一のことはあなた自身のCustomDialogを作成することです

これがサンプルアプリです

ダウンロードしてデザインパターンを見てみると、簡単になります

これがカスタムダイアログの作成に関する1つのチュートリアルです

重要な部分は、DialogObjectを作成した後、setTitle()でタイトルを設定しないことです。CustomLayout内にTextViewを作成し、findViewByID()から呼び出して、タイトルを設定します。

于 2013-12-31T08:12:28.927 に答える
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

colors.xmlの場合:

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

ダイアログ内:

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

ビューディバイダー=d.findViewById(divierId); 仕切り.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 に答える