如何在 Android 中捕获虚拟键盘的显示/隐藏事件?

androidmobile developmentapps/applications

简介

在 Android 应用中,用户点击任何文本输入字段时,键盘经常会弹出。在某些情况下,我们必须限制用户通过菜单在文本输入字段中输入数据。在这种情况下,我们必须明确隐藏该文本输入字段的键盘。在本文中,我们将了解如何在 Android 应用中捕获虚拟键盘的显示/隐藏事件。

实现

我们将创建一个简单的应用,其中显示一个简单的文本视图,用于显示应用的标题。在此文本视图之后,我们将创建一个编辑文本,用于在应用中打开虚拟键盘。打开和关闭键盘时,我们将显示提示消息。我们将按照分步指南来实现这一点。

步骤 1:在 Android Studio 中创建新项目

如下图所示,导航到 Android Studio。在下方屏幕中,点击"新建项目"以创建一个新的 Android Studio 项目。

点击"新建项目"后,您将看到以下屏幕。

在此屏幕中,我们只需选择"空活动"并点击"下一步"。点击"下一步"后,您将看到以下屏幕。

在此屏幕中,我们只需指定项目名称。然后包名称将自动生成。

注意 - 确保选择 Java 作为语言。

指定所有详细信息后,点击"完成"以创建一个新的 Android Studio 项目。

项目创建完成后,我们将看到两个打开的文件,即 activity_main.xml 和 MainActivity.java 文件。

步骤 3:使用 activity_main.xml。

导航到 activity_main.xml。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>activity_main.xml 并打开此文件。打开此文件后,添加以下代码。代码中添加了注释,以便您详细了解。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/idCLayout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">

   <!-- text view for displaying  heading of the application -->
   <TextView
      android:id="@+id/idTVHeading"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_above="@id/idEdtMessage"
      android:layout_margin="10dp"
      android:padding="5dp"
      android:text="Detect Show/Hide events for Virtual Keyboard"
      android:textAlignment="center"
      android:textAllCaps="false"
      android:textColor="@color/black"
      android:textSize="18sp"
      android:textStyle="bold" />

   <!-- creating an edit text to open and close virtual keyboard -->
   <EditText
      android:id="@+id/idEdtMessage"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_centerInParent="true"
      android:layout_margin="10dp"
      android:hint="Enter your message" />
</RelativeLayout>

说明 - 在上面的代码中,我们创建了一个相对布局作为根布局,并在其中创建了 TextView,用于显示应用程序的标题。在此文本视图之后,我们将创建一个编辑文本,触摸此编辑文本时将打开键盘。

步骤 4:使用 MainActivity.java 文件

导航到 MainActivity.java。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>MainActivity.java 以打开此文件。打开此文件后,将以下代码添加到其中。代码中添加了注释,以便您详细了解。

package com.example.androidjavaapp;

import android.graphics.Rect;
import android.os.Bundle;
import android.view.ViewTreeObserver;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

   // 在下面的行中为按钮创建一个变量并编辑文本。
   private RelativeLayout relativeLayout;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      // 下面一行我们正在初始化相对布局的变量。
      relativeLayout = findViewById(R.id.idCLayout);
      
      // 下面我们调用树观察器来获取树。
      relativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
         @Override
         public void onGlobalLayout() {
                        
            // 下面一行我们为 rect 创建了一个变量。
            Rect rect = new Rect();
            
            // 下面一行获取相对布局的框架。
            relativeLayout.getWindowVisibleDisplayFrame(rect);
            
            // 下面一行获取相对布局的屏幕高度。
            int screenHeight = relativeLayout.getRootView().getHeight();
            
            // 下面一行获取键盘高度。
            int keypadHeight = screenHeight - rect.bottom;
            
            // 下面一行我们检查键盘高度是否大于屏幕高度。
            if (keypadHeight > screenHeight * 0.15) {
            
            // 显示键盘时显示 toast 消息。
            Toast.makeText(MainActivity.this, "Keyboard is showing", Toast.LENGTH_LONG).show();
            } else {
               
               // 键盘关闭时显示 toast 消息。
               Toast.makeText(MainActivity.this, "keyboard closed", Toast.LENGTH_LONG).show();
            }
         }
      });
   }
}

说明 - 在上面的代码中,我们首先为相对布局创建变量。在 onCreate 方法中,我们使用在 activity_main.xml 文件中指定的 id 初始化 listview 变量。

之后,我们为相对布局添加一个全局布局监听器。在全局布局方法中,我们为 rect 创建一个变量。然后,我们添加一个条件来检查键盘高度是否大于屏幕高度。如果大于,则表示键盘可见,在这种情况下,我们会显示一条消息,表示键盘可见。在 else 条件中,我们将在键盘隐藏时显示一条 Toast 消息。

添加上述代码后,现在只需点击顶部栏中的绿色图标即可在移动设备上运行我们的应用程序。

注意 - 确保您已连接到真实设备或模拟器。

输出

结论

在上面的教程中,我们了解了如何在 Android 应用程序中捕获虚拟键盘的显示和隐藏。


相关文章