Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách viết listener phát hiện bàn phím mềm mở/đóng trong Activity Android

Ví dụ này minh họa cách phát hiện trạng thái bàn phím mềm (SoftKeyboard) mở hay đóng trong Activity Android bằng ViewTreeObserver.

Bước 1: Tạo dự án mới

Tạo dự án mới trong Android Studio: File → New Project.

Bước 2: Cấu hình layout (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_margin="16dp"
        tools:ignore="MissingConstraints" />
    <Button
        android:id="@+id/btnButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ẩn bàn phím"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Bước 3: Code MainActivity (src/MainActivity.java)

package com.app.sample;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    ConstraintLayout constraintLayout;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button = findViewById(R.id.btnButton);
        EditText editText = findViewById(R.id.editText);
        editText.requestFocus();
        constraintLayout = findViewById(R.id.rootView);
        
        // Listener phát hiện thay đổi layout do bàn phím
        constraintLayout.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    constraintLayout.getWindowVisibleDisplayFrame(r);
                    int screenHeight = constraintLayout.getRootView().getHeight();
                    int keypadHeight = screenHeight - r.bottom;
                    
                    // Nếu chiều cao bàn phím > 15% màn hình => đang mở
                    if (keypadHeight > screenHeight * 0.15) {
                        Toast.makeText(MainActivity.this, "Bàn phím đang hiển thị", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "Bàn phím đã đóng", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        
        button.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btnButton) {
            hideSoftKeyboard(v);
        }
    }
    
    private void hideSoftKeyboard(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
}

Bước 4: Cấu hình Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.app.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

Chạy app, nhấn vào EditText để mở bàn phím, nhấn nút "Ẩn bàn phím" để đóng. Toast sẽ hiển thị trạng thái.

Cách viết listener phát hiện bàn phím mềm mở/đóng trong Activity Android