2013-03-14 49 views
12

我创建圆角与布局,不会填满整个屏幕宽度定制的片断对话框(如果它只是包裹内容,我宁愿)。定制FragmentDialog圆角,而不是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); 

最后,我将对话框组件的背景设置为另一个使角落变圆的自定义drawable。我有在顶部和TextView的底部与一个RelativeLayout的LinearLayout中,所以设置@null到母体的LinearLayout和设置两个不同的自定义可绘到两个部分,其中之一具有圆形bottomCorners并且另一个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

真棒哥们。谢谢 – 2016-09-24 01:07:16

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

更新:如果不设置标志Window.FEATURE_NO_TITLE,在对话框的顶部blue line appears在设备与Android 4.4≤。

+2

我相信这是更好的解决方案。感谢分享! – Sam 2017-12-28 08:31:10

+0

你在对话框中使用了什么字体? – 2018-01-29 20:41:09

+0

这是一个自定义字体(Maison Neue)。 – 2018-01-30 14:07:51