Androidアプリ開発

キーボード表示でレイアウトが崩れる

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

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

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

この記事のテーマ


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

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

ダイアログ領域外のタップでも画面項目が切れる現象が発生します。回避する方法はこちら↓↓↓

画面項目が切れる現象を回避する実装

Androidスマホのアプリ開発でキーボードを閉じずに
処理を継続すると画面項目が切れる現象が発生します。
処理を継続する前にキーボードを閉じるコードを追加すると
画面項目が切れる現象を回避することが可能です。

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

getSystemService InputMethodManager を取得します。
取得した InputMethodManager hideSoftInputFromWindow を使用します。

import android.view.inputmethod.InputMethodManager;
	:
 private InputMethodManager      inputMethodManager;
  inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
	:
 //画面のクリックでキーボードを消す
  View dialog = dialog.findViewById(R.id.dialog);
  dialog.setOnClickListener(view -> {
      inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
  });
 :

Keyboardクラス

キーボードが表示されているかの判定は、
標準では実装されていないため、個別でクラスを作成 する必要があります。
クラス内部の処理は、GlobalLayoutListenerで親のビューの高さの変化を検知、
キーボードの表示・非表示を判定します。
判定結果はインタフェースを使用して、イベント通知 します。

import android.app.Activity;
import android.graphics.Rect;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
public class Keyboard {
    private final Activity  activity;
    private boolean         prev;
    private final Rect      rect = new Rect();
    public interface OnVisibilityListener {
        void onVisibilityChanged(boolean visible);
    }
    public Keyboard(Activity activity) {
        this.activity = activity;
    }
    public void setVisibilityListener(final OnVisibilityListener onVisibilityListener){
        final View parentView = ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
        parentView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
            int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 148, parentView.getResources().getDisplayMetrics());
            parentView.getWindowVisibleDisplayFrame(rect);
            int diff = parentView.getRootView().getHeight() - (rect.bottom - rect.top);
            boolean isShown = diff >= height;
            if (isShown != prev) {
                prev = isShown;
                onVisibilityListener.onVisibilityChanged(isShown);
            }
        });
    }
}

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

ダイアログを継承したカスタムダイアログに 画面項目が切れる現象の回避 を実装します。
キーボードが表示されているの判定するクラスをインポートし、インタフェースを実装します。
インタフェースで通知されるイベントで処理を継続するかの判定フラグとして更新します。
キーボードが表示されている場合は、キーボードを消す処理を実行するようにします。

import android.view.inputmethod.InputMethodManager;
import Keyboard;
	:

public class CustomDialogEdit extends DialogFragment implements Keyboard.OnVisibilityListener {
	:
    private InputMethodManager      inputMethodManager;
    private boolean               isExecute = true;
	:

    @Override
    public void onVisibilityChanged(boolean visible) { 
	isExecute = !visible;
  }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Keyboard keyboard = new Keyboard(getActivity());
        keyboard.setVisibilityListener(this);
        inputMethodManager = (InputMethodManager)context1.getSystemService(Context.INPUT_METHOD_SERVICE);
	:

        View view1 = dialog.findViewById(R.id.dialog);
        view1.setOnClickListener(view -> {
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        });
	:

        dialog.findViewById(R.id.dialog_ok).setOnClickListener(view -> {
            dialog.findViewById(R.id.dialog_ok).requestFocus();
            if (isExecute) {
		:

            } else
                inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
        });
キーボードを表示した状態でOKボタンを押した場合にキーボードを消すことで、
画面が隠れている部分が切れて表示されることを回避します。

今回は、ここまでです。

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

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

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

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

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

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

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

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

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

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

スポンサーリンク
msakiをフォローする
スポンサーリンク