カスタムDialogFragmentが表示されているときにキーボードを非表示にしないようにする方法

チョクヤンチェン

を介してカスタムダイアログを作成する方法は2つありますDialogFragment

  1. onCreateDialogを使用してダイアログを上書きして返しAlertDialog.Builderます。
  2. 上書きしonCreateViewます。

を上書きしてonCreateDialogも、前に表示されていたソフトキーボードは非表示になりません。

ただし、を上書きするonCreateView、前に表示されていたソフトキーボードは非表示になります。

onCreateDialogはソフトキーボードを非表示にしません

ここに画像の説明を入力してください


onCreateViewはソフトキーボードを非表示にします

ここに画像の説明を入力してください


ソフトキーボードを非表示にすることは、私たちの望ましい動作ではありません。ソフトキーボードはそのままにしておきたい。

However, we are not able to use onCreateDialog way, due to the limitation mentioned ViewPager in DialogFragment - IllegalStateException: Fragment does not have a view . In nutshell, if you need ViewPager to work well in dialog, you cannot implement custom dialog using onCreateDialog.

If we use onCreateView, we can achieve everything desired, except "not hiding soft keyboard".

Do you have any idea why overwrite onCreateView to create custom dialog, will hide the keyboard? How can we prevent such behavior?


Code

My dialog style is:

<style name="CustomDialog" parent="@style/Theme.AppCompat.Light.Dialog">
    <item name="android:windowNoTitle">false</item>
</style>

ColorDialogFragment.java:

public class ColorDialogFragment extends DialogFragment {
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private ColorFragmentPagerAdapter colorFragmentPagerAdapter;

    public static ColorDialogFragment newInstance() {
        ColorDialogFragment colorDialogFragment = new ColorDialogFragment();
        // We provide custom style, because we need title.
        colorDialogFragment.setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
        return colorDialogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    private View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container) {
        View view = inflater.inflate(R.layout.color_dialog_fragment, container, false);

        this.tabLayout = view.findViewById(R.id.tab_layout);
        this.viewPager = view.findViewById(R.id.view_pager);
        this.colorFragmentPagerAdapter = new ColorFragmentPagerAdapter(this.getChildFragmentManager());
        this.viewPager.setAdapter(this.colorFragmentPagerAdapter);
        this.tabLayout.setupWithViewPager(this.viewPager);

        return view;
    }

    // We overwrite onCreateView because ViewPager in DialogFragment, can hardly play well with
    // onCreateDialog + AlertDialog.Builder.
    //
    // https://stackoverflow.com/questions/20303865/viewpager-in-dialogfragment-illegalstateexception-fragment-does-not-have-a-vi
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return onCreateView(inflater, container);
    }

    // We overwrite onCreateDialog, because we need title.
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.setTitle(R.string.select_a_color);
        return dialog;
    }
}
Cheok Yan Cheng

After day of experiment, I found out a solution!

との両方onCreateDialog上書きonCreateViewます。で作成されonCreateDialogビューをメンバー変数に格納し、onCreateViewそのメンバー変数を返します。

参照:https//stackoverflow.com/a/51530917/72437

これが完全なコードです。

public class ColorDialogFragment extends DialogFragment {
    private View view;
    private TabLayout tabLayout;
    private ViewPager viewPager;
    private ColorFragmentPagerAdapter colorFragmentPagerAdapter;

    public static ColorDialogFragment newInstance() {
        ColorDialogFragment colorDialogFragment = new ColorDialogFragment();
        return colorDialogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);


        // TODO: Read from WeNoteOptions.
        final int position = 0;
        this.viewPager.setCurrentItem(position);
        updateButtonVisibility(position);
    }

    private View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container) {
        View view = inflater.inflate(R.layout.color_dialog_fragment, container, false);

        this.tabLayout = view.findViewById(R.id.tab_layout);
        this.viewPager = view.findViewById(R.id.view_pager);
        this.colorFragmentPagerAdapter = new ColorFragmentPagerAdapter(this.getChildFragmentManager());
        this.viewPager.setAdapter(this.colorFragmentPagerAdapter);
        this.tabLayout.setupWithViewPager(this.viewPager);

        this.viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                updateButtonVisibility(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        return view;
    }

    private void updateButtonVisibility(int position) {
        if (position == 1) {
            ((AlertDialog)getDialog()).getButton(DialogInterface.BUTTON_POSITIVE).setVisibility(View.VISIBLE);
        } else {
            ((AlertDialog)getDialog()).getButton(DialogInterface.BUTTON_POSITIVE).setVisibility(View.INVISIBLE);
        }
    }

    // https://stackoverflow.com/questions/20303865/viewpager-in-dialogfragment-illegalstateexception-fragment-does-not-have-a-vi
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return this.view;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();
        this.view = onCreateView(layoutInflater, null);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity())
                .setTitle(R.string.select_a_color)
                .setView(this.view)
                .setPositiveButton(R.string.select_color, (dialogInterface, i) -> {

                });
        return alertDialogBuilder.create();
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

キーボードがSwiftUIに表示されているときに完全なリストを表示する方法

分類Dev

キーボードがSwiftUIに表示されているときに完全なリストを表示する方法

分類Dev

キーボードが表示されたときにEditTextが上に移動しないようにする方法

分類Dev

親が表示されているときに子にキーボードフォーカスを設定するにはどうすればよいですか?

分類Dev

キーボードが表示されているときにcupertinoTabBarを非表示にするにはどうすればよいですか?またはキーボードでバーを覆う方法は?または、タブバーを常に下部に保持しますか?

分類Dev

モバイルSafariでキーボードが表示されているときに画面が上にスクロールしないようにする

分類Dev

ダイアログウィンドウでSOFT_INPUT_ADJUST_RESIZEを使用していても、キーボードが表示されているときにカスタムビューのDialogFragmentのサイズが変更されません

分類Dev

kotlinでキーボードが開いているときに下部ボタンを非表示にする方法は?

分類Dev

仮想キーボードが非表示になっているときにLWUITテキストフィールドからフォーカスを削除し、フォームのサイズを正しく変更するにはどうすればよいですか?

分類Dev

ボタンをクリックして入力にフォーカスしたときに、USB HIDデバイスが接続されたWebビューにソフトキーボードを表示するにはどうすればよいですか?

分類Dev

キーボードが表示されたときにtableViewがスクロールしないようにするにはどうすればよいですか?

分類Dev

アプリで画面がタップされたときに数字キーボードを非表示にするにはどうすればよいですか?(Java)

分類Dev

ロック画面が表示されているときにホームボタンがホーム画面に移動しないようにする

分類Dev

背景がクリックされたときにカスタムモーダルが非表示にならないようにする

分類Dev

Xcode 6でキーボードが表示されたときに表示されないビューを修正するにはどうすればよいですか?

分類Dev

ノードが表示されていないときに自分のテキストを表示するにはどうすればよいですか

分類Dev

検索バーを非表示にして、ボタンが押されたときに表示されるようにする方法

分類Dev

フレックスボックス内のテキストを非表示にして、フレックスボックスアイテムにカーソルを合わせたときに表示するにはどうすればよいですか?

分類Dev

仮想キーボードが入力要素をカバーしているときに、ページに入力要素をスクロールして表示させるにはどうすればよいですか?

分類Dev

キーボードが表示されているときにビューを移動しようとしています-いくつかのバグ

分類Dev

入力フィールドがフォーカスされているときにCSSで送信ボタンを非表示にする

分類Dev

UITextFieldでリターンキーを押したときにキーボードを非表示にするにはどうすればよいですか?

分類Dev

android edittextは、キーボードを開いたときに部分的に表示されるようになります

分類Dev

特定のテキストフィールドがキーボードで非表示になっているときに、テーブルビューを上に移動するにはどうすればよいですか?

分類Dev

リターンキーが押されたときにキーボードを非表示にする方法-Swift

分類Dev

TextFormFieldがフォーカスされているときにエラーの外観を非表示にする方法

分類Dev

エディットテキストがフォーカスされているときにソフトキーボードを表示する方法

分類Dev

ifステートメントを使用してgetelement by idを記述し、1つのボタンをクリックすると、divが表示され、残りが非表示になるようにするにはどうすればよいですか?

分類Dev

XMLスキーマでassertを使用して、特定の条件を満たすときにノードが表示されないようにする

Related 関連記事

  1. 1

    キーボードがSwiftUIに表示されているときに完全なリストを表示する方法

  2. 2

    キーボードがSwiftUIに表示されているときに完全なリストを表示する方法

  3. 3

    キーボードが表示されたときにEditTextが上に移動しないようにする方法

  4. 4

    親が表示されているときに子にキーボードフォーカスを設定するにはどうすればよいですか?

  5. 5

    キーボードが表示されているときにcupertinoTabBarを非表示にするにはどうすればよいですか?またはキーボードでバーを覆う方法は?または、タブバーを常に下部に保持しますか?

  6. 6

    モバイルSafariでキーボードが表示されているときに画面が上にスクロールしないようにする

  7. 7

    ダイアログウィンドウでSOFT_INPUT_ADJUST_RESIZEを使用していても、キーボードが表示されているときにカスタムビューのDialogFragmentのサイズが変更されません

  8. 8

    kotlinでキーボードが開いているときに下部ボタンを非表示にする方法は?

  9. 9

    仮想キーボードが非表示になっているときにLWUITテキストフィールドからフォーカスを削除し、フォームのサイズを正しく変更するにはどうすればよいですか?

  10. 10

    ボタンをクリックして入力にフォーカスしたときに、USB HIDデバイスが接続されたWebビューにソフトキーボードを表示するにはどうすればよいですか?

  11. 11

    キーボードが表示されたときにtableViewがスクロールしないようにするにはどうすればよいですか?

  12. 12

    アプリで画面がタップされたときに数字キーボードを非表示にするにはどうすればよいですか?(Java)

  13. 13

    ロック画面が表示されているときにホームボタンがホーム画面に移動しないようにする

  14. 14

    背景がクリックされたときにカスタムモーダルが非表示にならないようにする

  15. 15

    Xcode 6でキーボードが表示されたときに表示されないビューを修正するにはどうすればよいですか?

  16. 16

    ノードが表示されていないときに自分のテキストを表示するにはどうすればよいですか

  17. 17

    検索バーを非表示にして、ボタンが押されたときに表示されるようにする方法

  18. 18

    フレックスボックス内のテキストを非表示にして、フレックスボックスアイテムにカーソルを合わせたときに表示するにはどうすればよいですか?

  19. 19

    仮想キーボードが入力要素をカバーしているときに、ページに入力要素をスクロールして表示させるにはどうすればよいですか?

  20. 20

    キーボードが表示されているときにビューを移動しようとしています-いくつかのバグ

  21. 21

    入力フィールドがフォーカスされているときにCSSで送信ボタンを非表示にする

  22. 22

    UITextFieldでリターンキーを押したときにキーボードを非表示にするにはどうすればよいですか?

  23. 23

    android edittextは、キーボードを開いたときに部分的に表示されるようになります

  24. 24

    特定のテキストフィールドがキーボードで非表示になっているときに、テーブルビューを上に移動するにはどうすればよいですか?

  25. 25

    リターンキーが押されたときにキーボードを非表示にする方法-Swift

  26. 26

    TextFormFieldがフォーカスされているときにエラーの外観を非表示にする方法

  27. 27

    エディットテキストがフォーカスされているときにソフトキーボードを表示する方法

  28. 28

    ifステートメントを使用してgetelement by idを記述し、1つのボタンをクリックすると、divが表示され、残りが非表示になるようにするにはどうすればよいですか?

  29. 29

    XMLスキーマでassertを使用して、特定の条件を満たすときにノードが表示されないようにする

ホットタグ

アーカイブ