带有圆角而不是 100% 屏幕宽度的自定义 FragmentDialog [英] Custom FragmentDialog with round corners and not 100% screen width

查看:31
本文介绍了带有圆角而不是 100% 屏幕宽度的自定义 FragmentDialog的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个带有圆角和布局的自定义片段对话框,该对话框不会填充屏幕宽度(我更喜欢它只是包装其内容).

I am creating a custom fragment dialog with round corners and with layout that would not fill the screen width (I would prefer if it just wrapped its content).

这是我在 drawable 文件夹中的 rounded_dialog.xml,它被我的自定义 ThemeWithCorners 调用作为对话框的背景.我还尝试将其设置为线性布局的背景,以创建其内容,但没有任何效果.

this is my rounded_dialog.xml in drawable folder, which is called by my Custom ThemeWithCorners as a background for the dialog. I also tried to set it as background to the linear layout which creates its content but nothing works.

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

这就是我调用对话框的方式:

and this is how i call the dialog:

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 方法中,我设置了样式和主题:

In onCreate method of the dialog I set the style and theme:

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

这是 onCreateView 方法:

This is the onCreateView method:

@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 方法中,因为建议其他答案,但也没有奏效:

I also tried to add this to onCreateDialog method as other answers on SO suggested but did not work either:

@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% 宽度,它最好应该包裹其内容.拜托,拜托,我需要一些帮助,我真的很绝望,我已经尝试了好几天了!

So to sum it up, I want round corners, not 100% width of the screen, it preferably should wrap its content. Please, please, I need some help, I am really desperate about this, I´v ebeen trying it for days!

推荐答案

好吧,我刚刚找到了一个解决方案,但我对此并不满意.

Well, I just found a solution, I am not really happy with it though.

我为对话框设置了背景(rounded_dialog.xml),如下所示:

I set the background (rounded_dialog.xml) for the dialog like this:

<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"方法中将其设置为我的对话框.在这段代码中,圆角并不是真正必要的,因为背景是透明的,但填充很重要,因为对话框实际上仍然和屏幕一样宽,但填充使它看起来不是.

Then I set this to my dialog in its ´onCreateView´ method this way below. The rounded corners are not really necessary in this piece of code as the background is transparent, but the padding is important, because the dialog is still in fact as wide as the screen, but the padding makes it look like it is not.

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

最后,我将对话框组件的背景设置为另一个自定义可绘制对象,使角变圆.我有一个 LinearLayout,顶部带有RelativeLayout,底部带有TextView,所以我将@null 设置为父LinearLayout 并将两个不同的自定义drawable 设置为两个部分,其中一个具有圆形bottomCorners,另一个具有topCorners.

And in the end I set background of the dialog´s components to another custom drawable which makes the corners round. I have a LinearLayout with RelativeLayout at the top and TextView at the bottom, so I set @null to the parent LinearLayout and set two different custom drawables to the two parts, one of which has rounded bottomCorners and the other one 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>

我相信有一个更合适的解决方案,因为这在视觉上是正确的,不是真正的功能,但对于这种情况已经足够了.

I believe there is a more proper solution to this as this is correct just visually, not really functionally, but enough correct for this case.

这篇关于带有圆角而不是 100% 屏幕宽度的自定义 FragmentDialog的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆