Androidアプリ開発

ダイアログ領域外のタップを検知する

この記事は約14分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事は Android スマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML 構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


 入力キーボードを閉じずにダイアログ領域外をタップすると
 画面項目が切れる現象を回避する


キーボードを表示した状態で枠外をタップすると、
入力キーボードで画面が隠れている部分が切れて表示されます。

入力キーボードを閉じずに処理を継続すると画面項目が切れる現象を回避する方法↓↓↓

枠外のタップで画面項目が切れる現象を回避する実装

入力キーボードを閉じずにダイアログの枠外タップして、ダイアログを閉じると、画面項目が切れる現象が発生します。ダイアログの枠外タップを検知して、ダイアログを閉じる前にキーボードを閉じるコードを追加することで、画面項目が切れる現象を回避することが可能です。

枠外のタップでダイアログを閉じる

ダイアログ領域外のタップでダイアログを閉じたい場合は、setCanceledOnTouchOutside true を指定します。閉じたくない場合は、false を指定します。

    : 
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        dialog = new Dialog(getActivity());
        :
        dialog.setCanceledOnTouchOutside(true);
       :

キーボードを閉じるコード

ダイアログ領域外のタップを検知したい場合は、Dialog をインスタンス化する際に、cancel をオーバライドします。キーボードが表示されているか判定する Keyboardクラスを使用して、キーボードが表示されている場合は、キーボードを非表示にします。
キーボードが表示されていない場合は、ダイアログを閉じる操作を performClick で呼び出します。

public class CustomDialogEdit extends DialogFragment implements Keyboard.OnVisibilityListener {
    private boolean                 isExecute = true;
    :
    @Override
    public void onVisibilityChanged(boolean visible) {
        isExecute = !visible;
    }
    : 
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Keyboard keyboard = new Keyboard(getActivity());
        keyboard.setVisibilityListener(this);
        inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
        :
        dialog = new Dialog(getActivity()) {
            @Override public void cancel() {
                if (getActivity() != null) {
                    if (isExecute) {
                        if (customDialogListener != null) dialog.findViewById(R.id.dialog_close).performClick();
                    } else {
                        inputMethodManager.hideSoftInputFromWindow(dialog.findViewById(R.id.dialog_close).getWindowToken(), 0);
                    }
                }
            }};
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
        dialog.setContentView(layout[customDialogParcels.length]);
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setCanceledOnTouchOutside(true);
       :

画面項目が切れる現象を回避するコード

入力キーボードの表示で画面項目が切れた状態であるため、ダイアログ画面の OK ボタン、閉じる操作ともに画面の再描画が必要です。
ダイアログ呼び出し時に入力があった場合はその文字列、ダイアログで入力があった場合はその文字列のいずれかを使って、画面の再描画を行っています。
ダイアログ領域外をタップした場合は、doCloseClick を呼び出します。

    : 
    // 検索ダイアログ表示 //
    private void showItemsDialogEdit(Bundle bundle, String keyword) {
        CustomDialogEdit customDialogEdit = new CustomDialogEdit(context);
        customDialogEdit.setCustomDialogListener(new CustomDialogListener() {
            @Override
            public void doOkClick(View view) {
                Bundle newBundle;
                newBundle = customDialogEdit.getArguments();
                customDialogParcels = (CustomDialogParcel[]) Objects.requireNonNull(newBundle).getParcelableArray("PAC");
                keywords = customDialogParcels[0].getValue();
                filter.setText(keywords.length() > 0 ? String.format(context.getString(R.string.stock_filter),keywords) : context.getString(R.string.stock_noFilter));
                stockView.initialize(context);
                mainActivity.stockerDatabaseHelper.getStockTranList(keywords);
            }
            @Override
            public void doCloseClick(View view) {
                stockView.initialize(context);
                mainActivity.stockerDatabaseHelper.getStockTranList(keyword);
            }
        });
        customDialogEdit.setArguments(bundle);
        customDialogEdit.show(getParentFragmentManager(), context.getString(R.string.search1));
    }
    :
枠外のタップを検知して閉じる操作(×ボタン)を呼び出すことで、
画面が隠れている部分が切れて表示されることを回避します。

今回は、ここまでです。
参考:キーボード表示でレイアウトが崩れる

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

IPX7防水なので、お風呂で音楽を聞くのに使ってます♪

この記事で紹介している実装は、下記の無料アプリ↓↓↓で動作を確認できます♪

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めての Android のアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

未経験者からプログラマーを目指すのに最適かと、
まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、
お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、
まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク
The Challenge of Second Life

コメント欄