2013-03-14 2 views
12

Я создаю диалог пользовательских фрагментов с круглыми углами и с макетом, который не заполняет ширину экрана (я бы предпочел, чтобы он просто обернул его содержимое).Пользовательский фрагментDialog с круглыми углами, а не 100% ширина экрана

это мой rounded_dialog.xml в папке с выделением, которую мой пользовательский ThemeWithCorners вызывается в качестве фона для диалога. Я также попытался установить его как фон для линейного макета, который создает его контент, но ничего не работает.

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

и это, как я вызвать диалог:

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

В OnCreate метод диалога я создал стиль и тему:

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

Это метод 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; 
} 

Я также попытался добавьте в метод onCreateDialog, как и другие ответы на SO предложил, но не получилось:

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

Так, чтобы подвести итог, я хочу, круглые углы, ширина экрана не 100%, предпочтительно он должен обернуть его содержание. Пожалуйста, пожалуйста, мне нужна помощь, я действительно в отчаянии об этом, я пробовал это в течение нескольких дней!

ответ

26

Ну, я просто нашел решение, но я не очень доволен.

я установить фон (rounded_dialog.xml) для диалога, как это:

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

Затем я поставил это диалоговое окно моего в методе'onCreateView' так далее. Округлые углы на самом деле не нужны в этом фрагменте кода, поскольку фон прозрачен, но прокладка важна, потому что диалог по-прежнему на самом деле такой же широкий, как экран, но отступы делают его похожим на то, что нет.

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

И в конце концов я поставил фон из dialog's компонентов для другого пользовательского Drawable, что делает углы круглые. У меня есть LinearLayout с RelativeLayout вверху и TextView внизу, поэтому я устанавливаю @null в родительский LinearLayout и устанавливаю два разных пользовательских чертежа для двух частей, один из которых имеет закругленные нижние углы и другой topCorners.

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

Я считаю, что более правильным решением этой проблемы, как это правильно только визуально, на самом деле не функционально, но достаточно правильно для этого случая.

+0

удивительный приятель. Спасибо –

11

Диалог фон: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 раскладка: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> 

Диалог фрагмент: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

Update: Если не установлен флаг Window.FEATURE_NO_TITLE, blue line appears на верхней части диалогового окна в устройствах с Android ≤ 4.4.

+2

Я считаю, что это лучшее решение. Спасибо, что поделился! – Sam

+0

Какой шрифт вы использовали в диалоговом окне? –

+0

Это специальный шрифт (Maison Neue). –

Смежные вопросы