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% ширину экрана, он предпочтительно должен обернуть его содержимое. Пожалуйста, пожалуйста, мне нужна помощь, я действительно в отчаянии об этом, я пробую это в течение нескольких дней!
Ответы
Ответ 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
.
Этапы:
- файл 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>
- Создайте файл
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>
- Создайте файл
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>
- Наконец примените
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;
}
}
Я надеюсь, что это поможет вам.
С наилучшими пожеланиями