
پشتیبانی از کیبوردهای جداشدنی به حداکثر رساندن بهرهوری کاربر در دستگاههای صفحه نمایش بزرگ کمک میکند. اندروید هر بار که کیبورد به دستگاهی متصل یا از آن جدا میشود، یک تغییر پیکربندی ایجاد میکند که میتواند باعث از دست رفتن وضعیت رابط کاربری شود. برنامه شما میتواند وضعیت خود را ذخیره و بازیابی کند و به سیستم اجازه دهد تا بازآفرینی فعالیت را مدیریت کند، یا بازآفرینی فعالیت را برای تغییرات پیکربندی کیبورد محدود کند .
در تمام موارد، تمام دادههای مربوط به صفحهکلید در یک شیء Configuration ذخیره میشوند. فیلدهای keyboard و keyboardHidden از شیء پیکربندی حاوی اطلاعاتی در مورد نوع صفحهکلید و در دسترس بودن آن هستند.
بهترین شیوهها
برنامههایی که برای صفحه نمایشهای بزرگ بهینه شدهاند، از هر نوع دستگاه ورودی، از صفحه کلیدهای نرمافزاری و سختافزاری گرفته تا قلم، ماوس، ترکپد و سایر دستگاههای جانبی، پشتیبانی میکنند.
پشتیبانی از صفحهکلیدهای خارجی شامل تغییرات پیکربندی است که میتوانید از دو طریق آن را مدیریت کنید:
- بگذارید سیستم، اکتیویتی در حال اجرا را از نو بسازد و شما مدیریت وضعیت برنامهتان را بر عهده بگیرید.
- خودتان تغییرات پیکربندی را مدیریت کنید (فعالیت دوباره ایجاد نخواهد شد):
- تمام مقادیر پیکربندی مربوط به صفحه کلید را اعلان کنید
- ایجاد یک کنترلکننده تغییر پیکربندی
برنامههای کاربردی که اغلب برای ورود متن و سایر ورودیها به کنترل دقیق رابط کاربری نیاز دارند، میتوانند از رویکرد «خودت انجام بده» برای مدیریت تغییرات پیکربندی بهرهمند شوند.
در موارد خاص، ممکن است بخواهید طرحبندی برنامه خود را هنگام اتصال یا جدا کردن صفحهکلید سختافزاری تغییر دهید، برای مثال، برای ایجاد فضای بیشتر برای ابزارها یا پنجرههای ویرایش.
در Jetpack Compose، میتوانید به دو روش به تغییرات پیکربندی صفحهکلید واکنش نشان دهید:
- رابط کاربری واکنشگرا: وضعیت پیکربندی فعلی را مستقیماً در Composables خود با استفاده از
LocalConfiguration.currentبخوانید. رابط کاربری به طور خودکار برای تطبیق با وضعیت جدید هنگام اتصال یا جدا شدن صفحه کلید، دوباره ترکیب میشود. - فراخوانی اثر جانبی: از یک
DisposableEffectآگاه از چرخه حیات برای ثبت یک شنونده تغییر پیکربندی در Activity میزبان استفاده کنید، که به شما امکان میدهد رویدادهای غیر UI (مانند ثبت وقایع یا تجزیه و تحلیل) را بدون ایجاد مجدد activity یا نمونهسازی هیچ عنصر view ساختگی، فعال کنید.
مواد لازم
-
android:configChanges: ویژگی عنصر<activity>در فایل manifest برنامه. سیستم را در مورد تغییرات پیکربندی که برنامه مدیریت میکند، مطلع میکند. -
LocalConfiguration: ارائهدهنده محلی قابل ترکیب کهConfigurationدستگاه فعلی را نمایش میدهد. -
DisposableEffect: یک API با اثرات جانبی Compose که وقتی یک 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) } }
نتایج
اکنون برنامه شما بدون ایجاد مجدد اکتیویتی در حال اجرا، به اتصال یا جدا شدن یک کیبورد خارجی پاسخ خواهد داد.
منابع اضافی
برای یادگیری نحوه ذخیره وضعیت رابط کاربری برنامه خود در حین تغییرات پیکربندی مانند اتصال یا جدا کردن صفحه کلید، به بخش ذخیره وضعیتهای رابط کاربری مراجعه کنید.