2012-06-11 19 views
18

Zastanawiam się, jak można pozbyć się (lub zmienić kolor) titleDivider w oknie dialogowym. Jest to niebieska linia pod tytułem okna dialogowego wyświetlana na urządzeniach typu plaster miodu +.Tytuł tytułuDivider w oknie dialogowym

Annoying titleDivider line

Chyba jest to istotne kawałek układ z SDK, ale ponieważ nie ma atrybutu stylu nie wiem jak go tytułować. Gdy próbuję z findViewById nie ma 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> 

Próbowałem przesłonić dialogTitleDecorLayout który jest tylko odniesienie do dialog_title_holo.xml w moim theme.xml, ale bez powodzenia. Błąd jest:

error: Error: No resource found that matches the given name: attr 'dialogTitleDecorLayout'.

+1

jeśli chcesz pozbyć się jakiejś części domyślnego stylu, należy usunąć go całkowicie, ponieważ różni między urządzeniami i wersjami OS –

+1

Po zrzucie ekranu @Sharad Mhaske – GrIsHu

+0

@GrlsHu: opublikowałem zrzut ekranu –

Odpowiedz

9

I rozwiązać problem przy użyciu DialogFragment.STYLE_NO_TITLE motywu, a następnie udaje pasek tytułowy w układzie dialogowego.

+1

Świetny pomysł. Zmagałem się z DOKŁADNYM samym problemem, dopóki nie znalazłem twojej odpowiedzi. Obawiałem się, że będę musiał skopiować układ okna alertu i dostosować go do moich potrzeb, ale twoje rozwiązanie jest o wiele, dużo lepsze. To głupie, jak Android czasami sprawia, że ​​tak proste zadania są tak trudne ... – Paul

+0

@Andraz: Wiem, że zrobiłeś tę pracę jakiś czas temu, ale miałeś nadzieję, że możesz podzielić się większą ilością szczegółów. Na przykład, jak ustawiłeś motyw? Czy ma to wpływ na całą aplikację, czy możesz ograniczyć go do samych okien dialogowych? Ponadto, w jaki sposób "podrobiłeś" pasek tytułu? – PeteH

+0

setStyle (SherlockDialogFragment.STYLE_NO_TITLE, R.style.Your_Style) - Używałem SherlockActionBar. Następnie sfałszowałem go obrazem (faktycznie chciałem, aby pasek podziału był tego samego koloru co pasek tytułu - pomarańczowy). Naprawdę nie pamiętam wszystkich szczegółów, całkiem dawno temu. – Andraz

2

użycie

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

Opublikowany przeze mnie xml jest częścią źródła Androida, więc naprawdę nie mogę tego zmienić – Andraz

0

Ten jeden jest testowany na niektórych urządzeniach 4.x:

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

przyniosło to NPE. Czy celem było wyeliminowanie separatora tytułu zgodnie z pierwotnym pytaniem? Albo coś innego? – PeteH

0

Twój pomysł był prawidłowy. Jednak szukany przez ciebie dialogTitleDecorLayout jest zasobem prywatnym, więc nie możesz uzyskać do niego dostępu w normalny sposób. Ale nadal można do niego dostęp za pomocą składni *:

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

Dodając to do mojego własnego stylu i po prostu kopiując dialog_title.xml do mojej aplikacji i zmieniając go nieznacznie rozwiązał problem w moim przypadku.

+1

Witam, czy możesz nieco więcej o tym powiedzieć? dzięki! – dentex

1

Jeśli nie chcesz używać stylu domyślnego, nie używaj AlertDialog. Możesz przejść z Aktywnością (z niestandardowym układem) za pomocą Motywu Dialog.

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

Lubisz oglądać this i jest pcecial biblioteka, że ​​można go there oglądać. I ostatni link rozwiąże ci problem

0

To nie jest sposób na ukrycie go przez brotha kontrolne .. Miałem ten sam problem. Jedyne, co można zrobić, to stworzyć swój własny CustomDialog

Here is a sample App

pobierania i mieć spojrzenie na wzór projektu, to będzie łatwe

Here is one Tutorial O co dialogowym Własne

Ważne jest to po tworzenie obiektu DialogObject nie ustawia tytułu przez setTitle() tworzenie TextView wewnątrz CustomLayout i wywoływanie go z findViewByID() i ustawianie tytułu

0

można dokonać niestandardowego okna dialogowego takiego:

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

Ustaw tytuł zwyczaj w układzie nie używać android

 dialog.setTitle(); 

i swoją 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> 
0

„Zdejmowanie niebieską linię”, jeśli Chyba prawidłowo oznacza opuszczenie granicy między tytułem okna i to ciało. Ta granica pochodzi z motywu Holo, więc nie można go upuścić bez użycia własnego układu.

Utwórz plik o nazwie zlecenie dialog.xml o następującej treści (to tylko example..modify go jak chcesz):

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

Jak widać używam zasobów i rzeczy, które wygrały nie będą w twoim projekcie, ale możesz je bezpiecznie usunąć. Wynik w moim przypadku jest mniej więcej następujący, z obrazem na górze, który programowo ustawię w kodzie.

simple screenshot

Aby utworzyć okno potem użyć czegoś takiego:

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

thanku All ale mam rozwiązanie, aby uzyskać odniesienie do titledivider z alertdialog zmienić jego kolor za pomocą poniższego code.Hope to pomaga ktoś.

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

podając wyjątek wskaźnik null ... divider is null – test

+0

świetna odpowiedź, wielkie dzięki za to. dla rzeczy o pustych wskaźnikach, musisz sprawdzić framework/base/core/res/res/layout/alert_dialog.xml lub po prostu w HierarchyViewer, jakie są dokładne nazwy zasobów –

+0

dzielnik jest pusty. to samo do dialog.findViewById (android.R.id.message) dla niestandardowej wiadomości. dlaczego? – Dagon

13

Trzeba wdrożyć

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"); 
     } 
    } 
} 
+0

Dobrze. nie wiem, dlaczego ta metoda nie została jeszcze awansowana – chhameed

+0

czy możesz powiedzieć identyfikator dla dzielników przycisków? – khunshan

3

Oto jak postanowiłem, że (dzięki 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; 
} 
} 
-1
int divierId = dialog.getContext().getResources() 
    .getIdentifier("android:id/titleDivider", null, null); 
View divider = dialog.findViewById(divierId); 
divider.setVisibility(View.INVISIBLE); 
2

zanim napiszesz dialog.show(), napisać:

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

W colors.xml:

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

To działa dla mnie, ale powinieneś umieścić wskaźnik zerowy na dzielniku. To nie zadziała w wersji 5.0 i wyższej. –

0

W colors.xml:

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

W oknie dialogowym:

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

Wyświetl dzielnik = d.findViewById (divierId); divider.setBackgroundColor (getResources(). GetColor (R.color.transparent));

0

W celu ukrycia domyślny niebieską linię całkowicie (zakładając, że jesteś w 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); 
     } 
    } 
Powiązane problemy