سلام دوستان
تو این مطلب قصد دارم یه KeyboardListener اموزش بدم که وقتی کیبورد باز شد همیشه گوش به زنگ باشه و بهتون اعلام کنه
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)) { // ادامه کد بستگی به نوع استفاده شما داره } } }); }
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