2013-03-14 15 views
12

Tworzę niestandardowe okno dialogowe fragmentów z zaokrąglonymi rogami iz układem, który nie wypełniałby szerokości ekranu (wolałabym, gdyby po prostu zawinął jego zawartość).Własny FragmentDialog z zaokrąglonymi narożnikami, a nie 100% szerokości ekranu

To jest mój rounded_dialog.xml w folderze do rysowania, który jest wywoływany przez mój Custom ThemeWithCorners jako tło dla okna dialogowego. Próbowałem również ustawić go jako tło dla układu liniowego, który tworzy jego zawartość, ale nic nie działa.

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle" 
> 
<solid android:color="@android:color/white"/> 
<corners android:radius="20dp" 
/> 
</shape> 

i to jest jak wywołać okno dialogowe:

final String FTAG = "TAG_FRAGMENT_DIALOG_CALENDAR"; 
    dialog = (CalendarDialog) fm.findFragmentByTag(FTAG); 
    ft = fm.beginTransaction(); 
    if (dialog != null) 
    { 
     ft.remove(dialog); 
    } 
    dialog = CalendarDialog.newInstance(this);  
    dialog.setCancelable(true); 

    ft.add(dialog, FTAG); 
    ft.show(dialog); 
    ft.commit(); 

W onCreate metody oknie ustawić styl i tematyka:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.ThemeWithCorners);  
} 

Jest to metoda onCreateView:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
getDialog().setCanceledOnTouchOutside(true); 
v = (MyCalendar)inflater.inflate(R.layout.calendar_dialog, container, true) 
    return v; 
} 

Próbowałem również dodać do tego sposobu onCreateDialog jak inne odpowiedzi na SO zasugerował, ale nie działa albo:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) 
{ 
    Dialog d = super.onCreateDialog(savedInstanceState); 
    LayoutParams lp=d.getWindow().getAttributes(); 
    d.getWindow().setBackgroundDrawable(new ColorDrawable(0)); 
    lp.width=-2;lp.height=-2;lp.gravity=Gravity.CENTER; 
    lp.dimAmount=0;    
    lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS | LayoutParams.FLAG_NOT_TOUCH_MODAL; 

    return d; 
} 

Więc Podsumowując, chcę zakręty, a nie 100% szerokości ekranu, to korzystnie powinien zawinąć jego treść. Proszę, potrzebuję pomocy, naprawdę jestem zrozpaczony tym, próbuję to od wielu dni!

Odpowiedz

26

Po prostu znalazłem rozwiązanie, ale nie jestem z niego zadowolony.

ustawić tło (rounded_dialog.xml) dla okna tak:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
<solid android:color="@android:color/transparent"/> 
<corners android:radius="10dp" /> 
<padding android:left="10dp" android:right="10dp"/> 
</shape> 

Potem ustawić to do mojego okna w jego metodzie'onCreateView' ten sposób poniżej. Zaokrąglone rogi nie są tak naprawdę potrzebne w tym kodzie, ponieważ tło jest przezroczyste, ale dopełnienie jest ważne, ponieważ okno dialogowe jest w rzeczywistości tak szerokie jak ekran, ale dopełnienie sprawia, że ​​wygląda tak, jak nie jest.

getDialog().getWindow().setBackgroundDrawableResource(R.drawable.rounded_dialog); 

I na koniec ustawiam tło komponentów okna dialogowego na inny niestandardowy ciągany, który sprawia, że ​​rogi są zaokrąglone. Mam LinearLayout z RelativeLayout na górze i TextView na dole, więc ustawiłem @null na rodzica LinearLayout i ustawiłem dwa różne niestandardowe rysunki na dwie części, z których jedna zaokrąglona jest od dołu do góry, a druga do topcornerów.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:background="@drawable/title_round" 
> 

<RelativeLayout 
    android:id="@+id/title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"   
    android:orientation="horizontal" 
    android:background="@drawable/blue_title_round_top" 
    android:paddingTop="4dp" 
    android:paddingBottom="4dp" 
    > 
<TextView 
    android:id="@+id/calendarHint" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/rounded_bottom" 
    android:layout_gravity="center" 
    android:gravity="center" 
     /> 
</LinearLayout> 

Wierzę, że jest to lepsze rozwiązanie do tego, jak to jest poprawne tylko wizualnie, nie bardzo funkcjonalnie, ale wystarczająco poprawne dla tej sprawy.

+0

wspaniały kumpel. Dziękuję –

11

Dialog background:dialog_rounded_bg.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="@android:color/white" /> 
    <corners android:radius="12dp" /> 
</shape> 

Dialog układ:dialog_rounded.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/dialog_rounded_bg" 
    android:minWidth="260dp" 
    android:orientation="vertical" 
    android:padding="24dp"> 
    ... 
</LinearLayout> 

Dialog fragment:RoundedDialog.java

public class RoundedDialog extends DialogFragment { 
    ... 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dialog_rounded, container, false); 
     // Set transparent background and no title 
     if (getDialog() != null && getDialog().getWindow() != null) { 
      getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
     } 
     return view; 
    } 
    ... 
} 

Rounded dialog

Aktualizacja: Jeśli nie ustawić flagę Window.FEATURE_NO_TITLE, A blue line appears na górnej części okna dialogowego w urządzeniach z Androidem ≤ 4,4.

+2

Uważam, że to lepsze rozwiązanie. Dzięki za udostępnienie! – Sam

+0

Jaką czcionkę użyłeś w oknie dialogowym? –

+0

To niestandardowa czcionka (Maison Neue). –

Powiązane problemy