Я собираюсь научить KeyboardListener предупреждать, когда клавиатура открывается. Например, иногда вы хотите скрыть представление при открытии клавиатуры, поэтому в этом случае вы должны знать, когда клавиатура открыта. Далее я научу вас, как создать OnKeyboardShowListener:

Шаг 1. Получите основную точку зрения

Прежде всего, вам нужно получить рут, вы можете получить к нему доступ из активности, поэтому я создаю функцию и помещаю действие в параметр, с помощью android.R.id.content вы можете получить доступ к корню не зная его id:

public static void OnkeyBoardShowListener(final Activity activity) {
final View activityRootView = 
        activity.findViewById(android.R.id.content);
}

теперь у нас есть корень в activityRootView.

Шаг 2: Измерьте высоту

Как мы можем получить высоту ?!
Если вы используете mainLayout.getRootView (). getHeight () он возвращает 0px, потому что он еще не установлен, ViewTreeObserver используется для регистрации слушателей, которые могут получать уведомления о глобальных изменениях в дереве представления. Чтобы упростить задачу, я Приведу вам пример:

уведомит вас, если вид скрыт или отображается.
если высота и ширина изменится, он уведомит вас. (Это то, что мы хотим)

getViewTreeObserver (). addOnGlobalLayoutListener подождите, пока View будет измерен, отобразится, а затем определите его ширину и высоту.

public static void OnkeyBoardShowListener(final Activity activity) {    final View activityRootView = activity.findViewById(android.R.id.content);    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new     ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
      public void onGlobalLayout() {
       }
     });
  }

Теперь мы можем взять и использовать высоту и ширину корня, но проблема в том, как определить, открыта ли клавиатура?

Шаг 3. Видимый размер дисплея

getWindowVisibleDisplayFrame (Rect rect): Получить общий размер видимого отображения, в котором было расположено окно, к которому прикреплено это представление.

public static void OnkeyBoardShowListener(final Activity activity) {    final View activityRootView = activity.findViewById(android.R.id.content);    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new     ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
      public void onGlobalLayout() {
         Rect rect = new Rect();
         activityRootView.getWindowVisibleDisplayFrame(rect);
         }
     });
  }

Нам нужно измерить высоту Root и использовать Rect, чтобы измерить разницу между высотой и прямоугольником, когда клавиатура открыта, она почти становится заметной.

public static void OnkeyBoardShowListener(final Activity activity) {    final View activityRootView = activity.findViewById(android.R.id.content);    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new     ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
      public void onGlobalLayout() {
        Rect rect = new Rect();
        activityRootView.getWindowVisibleDisplayFrame(rect);
        int heightRoot = activityRootView.getRootView().getHeight();
        int heightDiff = heightRoot - rect.bottom;
       }
     });
  }

Отныне зависит от вашего использования, что вы хотите использовать. Обратите внимание, что heightRoot и heightDiff дают вам вывод в пикселях, поэтому:

public static void OnkeyBoardShowListener(final Activity activity) {    final View activityRootView = activity.findViewById(android.R.id.content);    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new     ViewTreeObserver.OnGlobalLayoutListener() {
     @Override
      public void onGlobalLayout() {
        Rect rect = new Rect();
        activityRootView.getWindowVisibleDisplayFrame(rect);
        int heightRoot = activityRootView.getRootView().getHeight();
        int heightDiff = heightRoot - rect.bottom;
        if (heightDiff > dpToPx(activity, 200)) {
              //Keyboard is open
        }else if (heightDiff < dpToPx(activity, 200)) {
             //Keyboard is close
        }
       }
     });
  }

Шаг 4. Преобразуйте Dp в Px

private static float dpToPx(Context context, int dp) {
     DisplayMetrics metrics =  context.getResources().getDisplayMetrics();
     return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,     dp, metrics);
 }

Теперь вы мастера нового поколения. :)

Вы можете прочитать мою другую статью:



Мы не программируем программу, мы пишем будущее.

IG: www.instagram.com/behnamnasehi
Gmail: [email protected]
Telegram: @Behnamnasehii