角が丸く、レイアウトが画面幅いっぱいにならないカスタムフラグメントダイアログを作成しています(コンテンツをラップするだけのほうがいいです)。
これは、ダイアログの背景としてカスタムThemeWithCorners
によって呼び出される、ドローアブルフォルダー内のrounded_dialog.xml
です。また、コンテンツを作成する線形レイアウトの背景として設定しようとしましたが、何も機能しません。
<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;
}
SOに関する他の回答が提案されたため、これもonCreateDialogメソッドに追加しようとしましたが、どちらも機能しませんでした。
@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%の幅ではなく、丸い角が必要です。コンテンツをラップすることが望ましいです。お願い、私、助けが必要です、私はこれについて本当に必死です、私は何日もそれを試してみました!
まあ、私は解決策を見つけたばかりですが、それでも本当に満足していません。
ダイアログの背景(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);
そして最後に、ダイアログのコンポーネントの背景を、角を丸くする別のカスタムドローアブルに設定しました。上部にRelativeLayout、下部にTextViewを持つLinearLayoutがあるため、@ nullを親のLinearLayoutに設定し、2つの異なるカスタムドローアブルを2つのパーツに設定します。
<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>
これは視覚的には正しく、実際には機能的ではなく、この場合は十分に正しいため、これにはより適切な解決策があると思います。
ダイアログの背景: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;
}
...
}
更新:フラグWindow.FEATURE_NO_TITLE
を設定しない場合、 青い線が表示されるデバイスのダイアログの上に 青い線が表示されますAndroid≤4.4。
- 別の方法:setStyle()
メソッドでonCreate()
を使用してスタイルを適用をDialogFragment
に適用します。
その後、Android:background
常に同じルートビューのyour_layout.xml
ファイル。
手順:
<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
drawable folder内のファイル:<?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;
}
}
これがお役に立てば幸いです。
ご多幸を祈る