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


简介

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

实现

我们将创建一个简单的应用程序,其中我们将显示一个简单的TextView,用于显示应用程序的标题。在这个TextView之后,我们将创建一个EditText,用于在我们的应用程序中打开虚拟键盘。在打开和关闭键盘时,我们将显示吐司消息。我们将遵循分步指南来实现这一点。

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

导航到Android Studio,如下图所示。在下面的屏幕中,单击“新建项目”以创建一个新的Android Studio项目。

单击“新建项目”后,您将看到下面的屏幕。

在这个屏幕中,我们只需选择“Empty Activity”,然后单击“Next”。单击“Next”后,您将看到下面的屏幕。

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

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

指定所有详细信息后,单击“Finish”以创建一个新的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>

说明 - 在上面的代码中,我们创建了一个RelativeLayout作为根布局,并在其中创建了我们的TextView,用于显示应用程序的标题。在这个TextView之后,我们将创建一个EditText,点击此EditText将打开键盘。

步骤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 {

   // on below line creating a variable for button and edit text.
   private RelativeLayout relativeLayout;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      // on below line we are initializing variables for relative layout.
      relativeLayout = findViewById(R.id.idCLayout);
      
      // on below line we are calling tree observer to get the tree.
      relativeLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
         @Override
         public void onGlobalLayout() {
            
            // on below line we are creating a variable for rect
            Rect rect = new Rect();
            
            // on below line getting frame for our relative layout.
            relativeLayout.getWindowVisibleDisplayFrame(rect);
            
            // on below line getting screen height for relative layout.
            int screenHeight = relativeLayout.getRootView().getHeight();
            
            // on below line getting keypad height.
            int keypadHeight = screenHeight - rect.bottom;
            
            // on below line we are checking if keypad height is greater than screen height.
            if (keypadHeight > screenHeight * 0.15) {
            
            // displaying toast message as keyboard showing.
            Toast.makeText(MainActivity.this, "Keyboard is showing", Toast.LENGTH_LONG).show();
            } else {
               
               // displaying toast message as keyboard closed.
               Toast.makeText(MainActivity.this, "keyboard closed", Toast.LENGTH_LONG).show();
            }
         }
      });
   }
}

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

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

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

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

输出

结论

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

更新于:2023年3月30日

1K+ 次浏览

启动你的职业生涯

完成课程获得认证

开始
广告