web-dev-qa-db-ja.com

appCompat 23+でカスタムマテリアルダイアログを作成する正しい方法

最新のappcompat v23.0.1を使用してカスタムダイアログを適切に作成する方法について、ここでは本当に混乱しています。いくつかの方法があります。

最初の方法:

public class AddTipDialogFrag extends DialogFragment
{
 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        int title = getArguments().getInt("title");
        AppCompatDialog dialogCompat = new AppCompatDialog(getActivity(), R.style.MyAlertDialogStyle);
        dialogCompat.setTitle(title); //doesn't work btw
        dialogCompat.setContentView(R.layout.add_tip_fragment);
        return dialogCompat;
    }
}

2番目の方法:

public class AddTipDialogFrag extends AppCompatDialogFragment
{ 
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.add_tip_fragment,container, false);
        int title = getArguments().getInt("title");
        getDialog().setTitle(title);
        return view;
    }
}

どちらの方法でも同じ結果が得られるようです。個人的に私は1番目の方法を好みますが、下の図に示すように、システムビューの境界が終了すると切り取られるリップル効果の問題があります。

ripple effect fail

これはバグですか? (それはそうでなければなりません!)それを修正できますか、それとも2番目の方法に変換するだけですか? (これはリップル効果でうまく機能します)。ほとんどのマテリアルダイアログライブラリが最初の方法を使用していることを考慮して、これらの2つの方法の間の最良のアプローチは何ですか?

編集:最初の方法のリップルグリッチはもう発生していないようですので、どちらがこれらの2つの正しい方法であるかはまだわかりません。

20
ThanosFisherman

2番目のアプローチは、AppCompatDialogFragmentDialogFragmentを拡張し、すべての面倒な作業を行うので、より良いようです。また、不必要な詳細を抽象化して(OOPとインラインで)見栄えを良くしています。

また、望ましい効果を与える;)

13
Rahul Tiwari

第2のアプローチは、プラットフォームスタイルのダイアログの代わりにAppCompatDialogを使用するDialogFragmentの特別なバージョンであるため、より優れています。 AppCompatDialogFragmentDialogFragmentのサブクラスであり、DialogFragmentのすべてのプロパティを継承します。

3
swetabh suman