پشتیبانی از صفحهکلیدهای جداشدنی به حداکثر رساندن بهرهوری کاربر در دستگاههای دارای صفحهنمایش بزرگ کمک میکند. Android هربار که صفحهکلیدی به دستگاه متصل یا از آن جدا میشود، تغییر پیکربندی را راهاندازی میکند که میتواند باعث ازدست رفتن وضعیت میانای کاربر شود. برنامه شما میتواند وضعیت خود را ذخیره و بازیابی کند و به سیستم اجازه دهد بازآفرینی فعالیت را مدیریت کند، یا بازآفرینی فعالیت را برای تغییرات پیکربندی صفحهکلید محدود کند.
در همه موارد، همه دادههای مربوط به صفحهکلید در شیء Configuration ذخیره میشود. فیلدهای keyboard و keyboardHidden شیء پیکربندی حاوی اطلاعاتی درباره نوع صفحهکلید و دردسترس بودن آن است.
روالهای مطلوب
برنامههای بهینهسازیشده برای صفحهنمایشهای بزرگ از هر نوع دستگاه ورودی، از صفحهکلیدهای نرمافزاری و سختافزاری گرفته تا قلم، موشواره، پد لمسی، و سایر دستگاههای جانبی پشتیبانی میکنند.
پشتیبانی از صفحهکلیدهای خارجی شامل تغییرات پیکربندی است که میتوانید آن را به یکی از دو روش زیر مدیریت کنید:
- اجازه دهید سیستم فعالیت درحال اجرا را بازسازی کند و شما مدیریت وضعیت برنامهتان را برعهده بگیرید.
- خودتان تغییر پیکربندی را مدیریت کنید (فعالیت دوباره ایجاد نخواهد شد):
- اعلام همه مقادیر پیکربندی مرتبط با صفحهکلید
- ایجاد کردن گرداننده تغییر پیکربندی
برنامههای بهرهوری که اغلب برای وارد کردن نوشتار و ورودیهای دیگر به کنترل دقیق واسط کاربر نیاز دارند، میتوانند از رویکرد خودانجام برای مدیریت تغییرات پیکربندی بهرهمند شوند.
در موارد خاص، ممکن است بخواهید چیدمان برنامهتان را هنگام متصل یا جدا شدن صفحهکلید سختافزاری تغییر دهید، برای مثال، برای ایجاد فضای بیشتر برای ابزارها یا پنجرههای ویرایش.
در Jetpack Compose، میتوانید به دو روش به تغییرات پیکربندی صفحهکلید واکنش نشان دهید:
- رابط کاربری واکنشی: وضعیت پیکربندی فعلی را مستقیماً در
Composables بااستفاده از
LocalConfiguration.currentبخوانید. وقتی صفحهکلید متصل یا جدا میشود، واسط کاربر بهطور خودکار بازترکیب میشود تا با وضعیت جدید سازگار شود. - فراخوانی عوارض جانبی: از
DisposableEffectآگاه از چرخه حیات برای ثبت شنونده تغییر پیکربندی در «فعالیت» میزبان استفاده کنید، که به شما امکان میدهد رویدادهای غیررابط کاربری (مانند گزارشگیری یا تجزیهوتحلیل) را بدون بازآفرینی فعالیت یا نمونهسازی عناصر نمای ساختگی راهاندازی کنید.
مواد تشکیلدهنده
android:configChanges: مشخصه عنصر<activity>در مانیفست برنامه. تغییرات پیکربندی را که برنامه مدیریت میکند به سیستم اطلاع میدهد.LocalConfiguration: ارائهدهنده محلی Composable کهConfigurationدستگاه فعلی را نشان میدهد.DisposableEffect: Compose side-effect API که بلوکی از کد را اجرا میکند وقتی Composable وارد ترکیببندی میشود، و وقتی خارج میشود پاکسازی میکند.
قدمها
مشخصه configChanges را اعلام کنید و مقادیر مربوط به صفحهکلید را اضافه کنید تا از بازسازی فعالیت جلوگیری شود. سپس، از LocalConfiguration.current برای
تطبیق پویا کردن چیدمان Composable خود استفاده کنید، یا بااستفاده از DisposableEffect،
شنونده پیکربندی ثبت کنید.
۱. اعلام کردن مشخصه configChanges
عنصر <activity> را در مانیفست برنامه با افزودن مقادیر keyboard|keyboardHidden به فهرست تغییرات پیکربندی که ازقبل مدیریت شدهاند بهروز کنید:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
۲. پاسخ دادن به تغییرات پیکربندی صفحهکلید
برای مدیریت تغییرات پیکربندی در Jetpack Compose، بسته به اینکه درحال بهروزرسانی میانای کاربر هستید یا درحال اجرای بازخوانی عارضه جانبی، از یکی از گزینههای زیر استفاده کنید:
گزینه الف: میانای کاربر واکنشی (توصیهشده)
نوع صفحهکلید را مستقیماً از
LocalConfiguration.currentبخوانید. وقتی صفحهکلید سختافزاری متصل یا جدا میشود، این مقدار تغییر میکند و Compose بهطور خودکار واسط کاربر شما را بازترکیب میکند.val configuration = LocalConfiguration.current val isPhysicalKeyboardAttached = configuration.keyboard == Configuration.KEYBOARD_QWERTY if (isPhysicalKeyboardAttached) { // Render layout optimized for physical keyboard } else { // Render default layout }
گزینه ب: شنونده عوارض جانبی
اگر لازم است هنگام تغییر پیکربندی، عارضه جانبیای (مثل ثبت کردن، بهروزرسانی پایگاه داده محلی، یا راهاندازی تجزیهوتحلیل) اجرا کنید، از
DisposableEffectبرای ثبت کردن شنونده تغییر پیکربندی در میزبانComponentActivityاستفاده کنید.val context = LocalActivity.current DisposableEffect(context) { val activity = context as? ComponentActivity val listener = Consumer<Configuration> { newConfig -> val hasKeyboard = newConfig.keyboard == Configuration.KEYBOARD_QWERTY // Trigger non-UI actions, analytics, etc. } activity?.addOnConfigurationChangedListener(listener) onDispose { activity?.removeOnConfigurationChangedListener(listener) } }
نتایج
اکنون برنامهتان به متصل یا جدا شدن صفحهکلید خارجی پاسخ میدهد بدون اینکه فعالیت درحال اجرا را دوباره ایجاد کند.
منابع بیشتر
برای آشنایی با نحوه ذخیره کردن وضعیت میانای کاربر برنامه درطول تغییرات پیکربندی مثل متصل کردن یا جدا کردن صفحهکلید، به ذخیره کردن وضعیتهای میانای کاربر مراجعه کنید.