Androidアプリ開発

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

この記事は約10分で読めます。
スポンサーリンク

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

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

◎テーマ
Androidスマホのアプリ開発で入力キーボードを閉じずに処理を継続すると画面項目が切れる現象を回避する

キーボードを表示した状態で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);
        });

◎キーボードが表示されているの判定

キーボードが表示されているかの判定は、標準では実装されていないため、個別でクラスを作成する必要があります。
クラス内部の処理は、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ボタンを押した場合にキーボードを消すことで、画面が隠れている部分が切れて表示されることを回避します。

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

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

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

コメント欄

タイトルとURLをコピーしました