Подтвердить что ты не робот

Custom FragmentDialog с круглыми углами, а не 100% шириной экрана

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

это моя rounded_dialog.xml в папке с возможностью переноса, которая вызывается моим Custom 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% ширину экрана, он предпочтительно должен обернуть его содержимое. Пожалуйста, пожалуйста, мне нужна помощь, я действительно в отчаянии об этом, я пробую это в течение нескольких дней!

4b9b3361

Ответ 1

Ну, я только нашел решение, но я не очень доволен этим.

Я устанавливаю фон (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, который делает углы круглыми. У меня есть 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>

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

Ответ 2

Фон диалога: 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, в верхней части диалогового окна на устройствах с Android ≤ 4.4 появится синяя линия.

Ответ 3

Другой способ:
Используйте setStyle() в методе onCreate(), чтобы применить стиль к вашему DialogFragment.
Затем вы можете использовать android:background так же, как всегда, в корневом представлении из Файл your_layout.xml.


Этапы:

  1. файл style.xml (в папке res):
<style name="DialogTheme_transparent" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--You can set other style items also, such as animations and etc-->
</style>
  1. Создайте файл your_layout.xml в папке макета:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="8dp"
    android:background="@drawable/bg_corner_dialog">
    ...
</LinearLayout>
  1. Создайте файл bg_corner_dialog.xml в папке для рисования:
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    android:dither="true">
    <solid android:color="#ffffff"/>
    <corners android:radius="16dp"/>
</shape>
  1. Наконец примените style и layout к вашему DialogFragment:
public class CustomDialogFragment extends DialogFragment {
    ...

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

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.your_layout, container, false);
        ButterKnife.bind(this, v);
        //init UI Elements...
        return v;
    }

}

Я надеюсь, что это поможет вам.
С наилучшими пожеланиями