چجوری بفهمیم کیبورد باز شده ؟ | Keyboard Listener

سلام دوستان تو این مطلب قصد دارم یه KeyboardListener اموزش بدم که وقتی کیبورد باز شد همیشه گوش به زنگ باشه و بهتون اعلام کنه ViewTreeObserverA view tree observer is used to register listeners that can be notified of global changes in the view treeبرای اعلام هرگونه تغییر بر روی View استفاده میشودو زیر مجموعه های خیلی زیادی دارد که ما از اینترفیس OnGlobalLayoutListener استفاده خواهیم کرد به این دلیل که اگر شما از ViewTreeObserver استفاده نکنید ، و از mainLayout.getRootView (). getHeight()استفاده کنید به سادگی 0px را برمی گرداند ، زیرا هنوز تنظیم نشده است. پس شما منتظر میمانید View اندازه گیری شود , نمایش داده شود و بعد عرض و ارتفاع ان را میگیرید.برای شروع تابع زیر را مینویسیم و Activity را به عنوان پارامتر به تابع میدهیم تا از طریق اون بتوانیم بدون نیاز به دانستن ایدی به Root آن Activity دسترسی داشته باشیم :public static void OnkeyBoardShowListener(final Activity activity) { final View activityRootView = activity.findViewById(android.R.id.content); }بعد از گرفتن Root اکتیویتی مورد نظر حال با استفاده از آن میتوانیم ViewTreeObserver را صدا زده :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() { } }); }در تابع onGlobalLayout میتوانیم ارتفاع و عرض Root را بگیریم و از آن استفاده بکنیم ولی مشکل اینجاست که چطور بفهمیم کیبورد باز شده است ؟ از طریق Rect میتوانیم یک مستطیل بسازیم و با استفاده از root.getWindowVisibleDisplayFrame(Rect rect);میتوانیم فضای خالی 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() { Rect rect = new Rect(); activityRootView.getWindowVisibleDisplayFrame(rect); } }); } باید ارتفاع Root را بگیریم و با استفاده از Rect اختلاف فضای خالی Root وقتی کیبورد باز میشود را اندازه گیری کنیم و با در اختیار داشتن اختلاف ارتفاع میشود تقریبا متوجه باز شدن کیبورد شد .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(); nt heightDiff = heightRoot - rect.bottom; } }); }heightRoot : ارتفاع کلheightDiff : اختلاف ارتفاعاز این به بعد دیگه بستگی به استفاده خودتان داره که به چه نحوی میخواهید استفاده کنید توجه داشته باشید که heightRoot و heightDiff خروجی px به شما میدهند پس : 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(); nt heightDiff = heightRoot - rect.bottom; if (heightDiff > dpToPx(activity, 200)) { // ادامه کد بستگی به نوع استفاده شما داره } else if (heightDiff < dpToPx(activity, 200)) { // ادامه کد بستگی به نوع استفاده شما داره } } }); }تابع برای تبدیل Dp به Px private static float dpToPx(Context context, int dp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics); }امیداورم کمک کوچیکی کرده باشم به شما دوستای عزیزم 3> IG : www.instagram.com/behnamnasehiGmail : behnammnasehi@gmail.comما برنامه نمی نویسیم , ما آینده مینویسیم :) https://virgool.io/@behnamnasehi/custom-snack-bar-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%D8%B3%D9%86%DA%A9-%D8%A8%D8%A7%D8%B1-rtm98vrjegmt