web-dev-qa-db-ja.com

100%画面幅ではなく、角が丸いカスタムFragmentDialog

角が丸く、レイアウトが画面幅いっぱいにならないカスタムフラグメントダイアログを作成しています(コンテンツをラップするだけのほうがいいです)。

これは、ダイアログの背景としてカスタム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%の幅ではなく、丸い角が必要です。コンテンツをラップすることが望ましいです。お願い、私、助けが必要です、私はこれについて本当に必死です、私は何日もそれを試してみました!

39
vandus

まあ、私は解決策を見つけたばかりですが、それでも本当に満足していません。

ダイアログの背景(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>

これは視覚的には正しく、実際には機能的ではなく、この場合は十分に正しいため、これにはより適切な解決策があると思います。

44
vandus

ダイアログの背景: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。

76
David Miguel

- 別の方法:
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.xmldrawable 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>
  1. 最後にstylelayoutDialogFragmentに適用します。
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;
    }

}

これがお役に立てば幸いです。
ご多幸を祈る

0
Ghasem Sadeghi