Укладка titleDivider в диалоге

Мне интересно, как можно избавиться от (или изменить цвет) 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> 

Я попытался переопределить dialogTitleDecorLayout, который ссылается только на dialog_title_holo.xml в моем theme.xml, но безуспешно. Ошибка:

Error: Ошибка: ресурс не найден, который соответствует указанному имени: attr 'dialogTitleDecorLayout'.

Solutions Collecting From Web of "Укладка titleDivider в диалоге"

Спасибо, но я получил решение, чтобы получить ссылку на titedivider из alertdialog, чтобы изменить его цвет, используя нижеприведенный код. Надеюсь, это поможет кому-то.

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

Вам необходимо реализовать

 myDialog = builder.create(); myDialog.setOnShowListener(new OnShowListenerMultiple(activity)); //---------------------------- //Function to change the Color of title and divider of AlertDialog public static class OnShowListenerMultiple implements DialogInterface.OnShowListener { Activity activity; OnShowListenerMultiple(Activity activity ) { this.activity = activity; } @Override public void onShow(DialogInterface dialog) { try { // TODO Auto-generated method stub Dialog d = ((Dialog) dialog); int titleId = d.getContext().getResources().getIdentifier("android:id/alertTitle", null, null); TextView titleView = (TextView) d.findViewById(titleId); titleView.setTextColor(activity.getResources().getColor(R.color.defaultColor)); // earlier defined color-int } catch (Exception e) { Log.e("XXXXXX","alertTitle could not change color"); } try { // TODO Auto-generated method stub Dialog d = ((Dialog) dialog); int divierId = d.getContext().getResources().getIdentifier("android:id/titleDivider", null, null); View divider = d.findViewById(divierId); divider.setBackgroundColor(activity.getResources().getColor(R.color.defaultColor)); // earlier defined color-int } catch (Exception e) { Log.e("XXXXXX","titleDivider could not change color"); } } } 

Я решил проблему, используя тему DialogFragment.STYLE_NO_TITLE, а затем подделал строку заголовка в макете диалога.

Вот как я решил это (благодаря 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; } } 

использование

  <View android:id="@+id/titleDivider" android:layout_width="match_parent" android:layout_height="2dip" android:background=#CC3232 /> 

Прежде чем писать 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> 

Если вы не хотите использовать стиль по умолчанию, не используйте AlertDialog. Вы можете пойти с Activity (с вашим настраиваемым макетом) с помощью диалогового окна.

 <activity android:theme="@android:style/Theme.Dialog"> 

Этот тест тестируется на некоторых устройствах 4.x:

  TextView title = (TextView)getWindow().getDecorView().findViewById(android.R.id.title); ((ViewGroup)title.getParent()).getChildAt(1).setVisibility(View.GONE); 

Ваша идея была правильной. Однако dialogTitleDecorLayout , который вы искали, является частным ресурсом, поэтому вы не можете получить к нему доступ обычным способом. Но вы все равно можете получить к нему доступ, используя синтаксис:

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

Добавив это в свой стиль и просто скопировав dialog_title.xml в мое приложение и изменив его, я решил проблему в моем случае.

Вы смотрите это, и для этого есть библиотека pcecial, вы можете посмотреть ее там . И последняя ссылка решит вашу проблему

Вы можете создать настраиваемый диалог следующим образом:

  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> 

«Удаление синей линии», если я правильно предполагаю, означает падение границы между названием диалогового окна и его телом. Эта граница исходит из темы 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; } 

Это никоим образом не скрывает это от контрольного брота. У меня была та же проблема. Единственное, что вы можете сделать, это создать свой собственный CustomDialog

Вот пример приложения

Скачайте и посмотрите на шаблон дизайна, тогда это будет легко

Вот один учебник о создании пользовательского диалога

Важная часть – после создания DialogObject не устанавливайте Title by setTitle (), создайте TextView внутри своего CustomLayout и вызовите его из findViewByID () и установите заголовок

В colors.xml:

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

В диалоговом окне:

Int divierId = dialog.getContext (). GetResources (). GetIdentifier ("android: id / titleDivider", null, null);

Просмотреть divider = d.findViewById (divierId); divider.setBackgroundColor (. GetResources () GetColor (R.color.transparent));

Чтобы полностью скрыть синюю линию по умолчанию (если вы находитесь в 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); } } 
 int divierId = dialog.getContext().getResources() .getIdentifier("android:id/titleDivider", null, null); View divider = dialog.findViewById(divierId); divider.setVisibility(View.INVISIBLE);