Behnam Nasehi | بهنام ناصحی
Behnam Nasehi | بهنام ناصحی
خواندن ۴ دقیقه·۵ سال پیش

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

سلام دوستان
تو این مطلب قصد دارم یه KeyboardListener اموزش بدم که وقتی کیبورد باز شد همیشه گوش به زنگ باشه و بهتون اعلام کنه


ViewTreeObserver

A 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/behnamnasehi
Gmail : 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
androidprogrammingبرنامه نویسبرنامه نویسیکد
Android Application Developer https://behnamnasehi.ir
شاید از این پست‌ها خوشتان بیاید