पांच स्टार वाले बड़ी स्क्रीन वाले ऐप्लिकेशन के लिए, Android सभी सुविधाएं देता है. इस कुकबुक में बताई गई रेसिपी को तैयार करने में आने वाली कुछ चीज़ों को चुना जाता है और इन्हें एक साथ मिलाकर, डेवलपमेंट से जुड़ी खास समस्याओं को हल किया जाता है. हर रेसिपी में, सबसे सही तरीके, अच्छी क्वालिटी के कोड सैंपल, और सिलसिलेवार निर्देश दिए गए हैं. इनकी मदद से, आप बड़ी स्क्रीन पर बेहतरीन शेफ़ बन सकते हैं.
स्टार रेटिंग
रेसिपी को इस आधार पर स्टार रेटिंग दी जाती है कि वे बड़ी स्क्रीन वाले ऐप्लिकेशन की क्वालिटी के दिशा-निर्देशों के मुताबिक हैं या नहीं.
वह टियर 1 की शर्तों को पूरा करता है, जो बड़ी स्क्रीन के हिसाब से है | |
यह सुविधा, टियर 2 की शर्तों को पूरा करती है. साथ ही, बड़ी स्क्रीन को ऑप्टिमाइज़ किया गया है | |
टियर 3 के लिए शर्तें पूरी करता है. बड़ी स्क्रीन के लिए तैयार है | |
बड़ी स्क्रीन की कुछ सुविधाएं देता है, लेकिन बड़ी स्क्रीन वाले ऐप्लिकेशन की क्वालिटी के लिए बने दिशा-निर्देशों का पालन नहीं करता | |
खास तरह के इस्तेमाल के उदाहरण की ज़रूरतों को पूरा करता है, लेकिन बड़ी स्क्रीन के साथ काम नहीं करता है |
Chromebook के कैमरे से जुड़ी सहायता
Chromebook का इस्तेमाल करने वाले लोग, Google Play पर लोगों की नज़र में आएं.
अगर आपका कैमरा ऐप्लिकेशन सिर्फ़ बुनियादी कैमरे की सुविधाओं के साथ काम कर सकता है, तो Chromebook उपयोगकर्ताओं को इस ऐप्लिकेशन को इंस्टॉल करने से न रोकें, क्योंकि आपने अनजाने में महंगे फ़ोन पर मिलने वाली ऐडवांस कैमरा सुविधाएं बता दी हैं.
Chromebook में सामने वाला कैमरा (उपयोगकर्ता के लिए) पहले से मौजूद होता है, जो वीडियो कॉन्फ़्रेंसिंग, स्नैपशॉट, और अन्य ऐप्लिकेशन के साथ अच्छी तरह काम करता है. हालांकि, सभी Chromebook में पीछे वाला कैमरा नहीं होता है. साथ ही, इस्तेमाल करने वाले ज़्यादातर कैमरों में ऑटोफ़ोकस या फ़्लैश की सुविधा काम नहीं करती.
सबसे सही तरीके
अलग-अलग तरह की सुविधाओं वाले कैमरा ऐप्लिकेशन, सभी डिवाइसों के साथ काम करते हैं. इस बात से कोई फ़र्क़ नहीं पड़ता कि उनका कैमरा कॉन्फ़िगर किया गया है या नहीं. इनमें, फ़्रंट कैमरे, बैक कैमरे, और यूएसबी से कनेक्ट किए गए बाहरी कैमरे वाले डिवाइस शामिल हैं.
यह पक्का करने के लिए कि ऐप्लिकेशन स्टोर आपके ऐप्लिकेशन को ज़्यादा से ज़्यादा डिवाइसों पर उपलब्ध कराएं, अपने ऐप्लिकेशन में इस्तेमाल की जाने वाली, कैमरे की सभी सुविधाओं के बारे में हमेशा जानकारी दें. साथ ही, यह भी बताएं कि इन सुविधाओं की ज़रूरत है या नहीं.
सामग्री
CAMERA
अनुमति: इससे आपके ऐप्लिकेशन को डिवाइस के कैमरे का ऐक्सेस मिलता है<uses-feature>
मेनिफ़ेस्ट एलिमेंट: इससे ऐप स्टोर में उन सुविधाओं के बारे में पता चलता है जिन्हें आपका ऐप्लिकेशन इस्तेमाल करता हैrequired
एट्रिब्यूट: इससे ऐप स्टोर पर पता चलता है कि आपका ऐप्लिकेशन किसी सुविधा के बिना काम कर सकता है या नहीं
तरीका
खास जानकारी
CAMERA
की अनुमति का एलान करें. कैमरे की उन सुविधाओं के बारे में बताएं जो कैमरे से जुड़ी बुनियादी सुविधाएं देती हैं. बताएं कि हर सुविधा की ज़रूरत है या नहीं.
1. CAMERA
की अनुमति का एलान करें
ऐप्लिकेशन मेनिफ़ेस्ट में ये अनुमति जोड़ें:
<uses-permission android:name="android.permission.CAMERA" />
2. कैमरे की बुनियादी सुविधाओं के बारे में बताना
ऐप्लिकेशन मेनिफ़ेस्ट में ये सुविधाएं जोड़ें:
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
3. बताएं कि हर सुविधा की ज़रूरत है या नहीं
android.hardware.camera.any
की सुविधा के लिए android:required="false"
सेट करें. इससे ऐप्लिकेशन को उन डिवाइसों के ज़रिए ऐक्सेस किया जा सकेगा जिनमें किसी भी तरह का कैमरा पहले से मौजूद है या जिनमें किसी भी तरह का कैमरा मौजूद नहीं है.
अन्य सुविधाओं के लिए, android:required="false"
को सेट करके पक्का करें कि इनमें बैक कैमरा, ऑटोफ़ोकस या फ़्लैश के बिना काम करने वाले Chromebook जैसे डिवाइस, ऐप स्टोर पर आपके ऐप्लिकेशन को ऐक्सेस कर सकें.
नतीजे
Chromebook इस्तेमाल करने वाले लोग, Google Play और अन्य ऐप स्टोर से आपके ऐप्लिकेशन को डाउनलोड और इंस्टॉल कर सकते हैं. साथ ही, जिन डिवाइसों में कैमरे की सभी सुविधाएं मिलती हैं उन पर उनके कैमरे से पाबंदी नहीं लगाई जाएगी, जैसे कि फ़ोन.
अपने ऐप्लिकेशन के साथ काम करने वाली कैमरा सुविधाओं को साफ़ तौर पर सेट करके और अपने ऐप्लिकेशन के लिए ज़रूरी सुविधाओं के बारे में बताकर, आपने अपने ऐप्लिकेशन को ज़्यादा से ज़्यादा डिवाइसों पर उपलब्ध करा दिया है.
अन्य संसाधन
ज़्यादा जानकारी के लिए, <uses-feature>
दस्तावेज़ में कैमरा हार्डवेयर की सुविधाएं देखें.
ऐप्लिकेशन ओरिएंटेशन फ़ोन के लिए प्रतिबंधित है, लेकिन बड़ी स्क्रीन वाले डिवाइसों पर नहीं
आपका ऐप्लिकेशन फ़ोन पर पोर्ट्रेट ओरिएंटेशन में अच्छी तरह काम करता है, इसलिए आपने ऐप्लिकेशन को सिर्फ़ पोर्ट्रेट मोड में सेट किया है. हालांकि, आपको बड़ी स्क्रीन पर लैंडस्केप ओरिएंटेशन में ज़्यादा काम करने का मौका मिलता है.
इन दोनों तरीकों को कैसे लागू किया जा सकता है: ऐप्लिकेशन को छोटी स्क्रीन पर पोर्ट्रेट ओरिएंटेशन में सीमित करें, लेकिन बड़े साइज़ पर लैंडस्केप मोड चालू करें?
सबसे सही तरीके
सबसे अच्छे ऐप्लिकेशन उपयोगकर्ता की प्राथमिकताओं, जैसे कि डिवाइस ओरिएंटेशन को ध्यान में रखते हैं.
बड़ी स्क्रीन वाले ऐप्लिकेशन की क्वालिटी से जुड़े दिशा-निर्देशों के मुताबिक, ऐप्लिकेशन पर हर तरह का डिवाइस कॉन्फ़िगरेशन काम करता है. इनमें पोर्ट्रेट और लैंडस्केप ओरिएंटेशन, मल्टी-विंडो मोड, और फ़ोल्ड किए जा सकने वाले डिवाइसों की फ़ोल्ड और अनफ़ोल्ड होने की स्थिति शामिल है. ऐप्लिकेशन को अलग-अलग कॉन्फ़िगरेशन के लिए, लेआउट और यूज़र इंटरफ़ेस को ऑप्टिमाइज़ करना चाहिए. साथ ही, कॉन्फ़िगरेशन में बदलाव होने पर ऐप्लिकेशन की स्थिति को सेव करके उसे पहले जैसा करना चाहिए.
यह रेसिपी सिर्फ़ कुछ समय के लिए है. बड़ी स्क्रीन पर काम करने की सुविधा का इस्तेमाल करें. रेसिपी का इस्तेमाल तब तक करें, जब तक कि आप अपने ऐप्लिकेशन को किसी भी डिवाइस कॉन्फ़िगरेशन के लिए पूरी सहायता देने के लिए बेहतर नहीं बना लेते.
सामग्री
screenOrientation
: ऐप्लिकेशन मेनिफ़ेस्ट सेटिंग की मदद से यह तय किया जा सकता है कि डिवाइस की स्क्रीन की दिशा में होने वाले बदलावों पर आपका ऐप्लिकेशन कैसे काम करे- Jetpack WindowManager: लाइब्रेरी के सेट की मदद से ऐप्लिकेशन विंडो का साइज़ और आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) तय किया जा सकता है; एपीआई लेवल 14 के साथ पुराने सिस्टम के साथ काम करने की सुविधा
Activity#setRequestedOrientation()
: रनटाइम के दौरान ऐप्लिकेशन का ओरिएंटेशन बदलने का तरीका
तरीका
खास जानकारी
ऐप्लिकेशन मेनिफ़ेस्ट में डिफ़ॉल्ट रूप से स्क्रीन की दिशा में बदलाव मैनेज करने के लिए ऐप्लिकेशन को चालू करें. रनटाइम के दौरान, ऐप्लिकेशन विंडो का साइज़ तय करें. अगर ऐप्लिकेशन विंडो छोटी है, तो मेनिफ़ेस्ट की स्क्रीन की दिशा की सेटिंग को ओवरराइड करके ऐप्लिकेशन का ओरिएंटेशन सीमित करें.
1. ऐप्लिकेशन मेनिफ़ेस्ट में स्क्रीन की दिशा तय करें
इस मामले में, ऐप्लिकेशन मेनिफ़ेस्ट के screenOrientation
एलिमेंट के बारे में जानकारी नहीं दी जा सकती. इस स्थिति में, ओरिएंटेशन डिफ़ॉल्ट रूप से unspecified
पर सेट होता है. इसके अलावा, स्क्रीन ओरिएंटेशन को fullUser
पर सेट किया जा सकता है. अगर उपयोगकर्ता ने सेंसर पर आधारित रोटेशन को लॉक नहीं किया है, तो आपका ऐप्लिकेशन सभी डिवाइस ओरिएंटेशन के साथ काम करेगा.
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
unspecified
और fullUser
का इस्तेमाल करने के बीच थोड़ा-बहुत अंतर है, लेकिन यह अहम है. अगर आपने screenOrientation
की वैल्यू का एलान नहीं किया है, तो सिस्टम ओरिएंटेशन चुनता है. साथ ही, ओरिएंटेशन तय करने के लिए, सिस्टम जिस नीति का इस्तेमाल करता है वह हर डिवाइस के लिए अलग हो सकती है. दूसरी ओर, fullUser
तय करने से, डिवाइस के लिए उपयोगकर्ता के तय किए गए व्यवहार से ज़्यादा मेल खाता है: अगर उपयोगकर्ता ने सेंसर पर आधारित रोटेशन को लॉक कर दिया है, तो ऐप्लिकेशन उपयोगकर्ता की पसंद को फ़ॉलो करता है; अगर ऐसा नहीं होता है, तो सिस्टम इन चारों में से किसी भी स्क्रीन ओरिएंटेशन (पोर्ट्रेट, लैंडस्केप, रिवर्स पोर्ट्रेट या रिवर्स लैंडस्केप) में से किसी की भी अनुमति देता है. android:screenOrientation
देखें.
2. स्क्रीन का साइज़ तय करना
अगर मेनिफ़ेस्ट को सभी उपयोगकर्ता की अनुमति वाले ओरिएंटेशन के साथ काम करने के लिए सेट किया गया है, तो स्क्रीन के साइज़ के आधार पर, ऐप्लिकेशन ओरिएंटेशन को प्रोग्राम के हिसाब से सेट किया जा सकता है.
मॉड्यूल की build.gradle
या build.gradle.kts
फ़ाइल में Jetpack WindowManager लाइब्रेरी जोड़ें:
Kotlin
implementation("androidx.window:window:version
") implementation("androidx.window:window-core:version
")
ग्रूवी
implementation 'androidx.window:window:version
' implementation 'androidx.window:window-core:version
'
WindowMetrics
ऑब्जेक्ट के तौर पर डिवाइस की स्क्रीन का साइज़ जानने के लिए, Jetpack WindowManager WindowMetricsCalculator#computeMaximumWindowMetrics()
तरीके का इस्तेमाल करें. ओरिएंटेशन को कब प्रतिबंधित करना है, यह तय करने के लिए विंडो मेट्रिक की तुलना विंडो साइज़ क्लास से की जा सकती है.
Windows साइज़ क्लास, छोटी और बड़ी स्क्रीन के बीच ब्रेकपॉइंट उपलब्ध कराती हैं.
स्क्रीन का साइज़ तय करने के लिए, WindowWidthSizeClass#COMPACT
और WindowHeightSizeClass#COMPACT
ब्रेकपॉइंट का इस्तेमाल करें:
Kotlin
/** Determines whether the device has a compact screen. **/ fun compactScreen() : Boolean { val metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this) val width = metrics.bounds.width() val height = metrics.bounds.height() val density = resources.displayMetrics.density val windowSizeClass = WindowSizeClass.compute(width/density, height/density) return windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.COMPACT || windowSizeClass.windowHeightSizeClass == WindowHeightSizeClass.COMPACT }
Java
/** Determines whether the device has a compact screen. **/ private boolean compactScreen() { WindowMetrics metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this); int width = metrics.getBounds().width(); int height = metrics.getBounds().height(); float density = getResources().getDisplayMetrics().density; WindowSizeClass windowSizeClass = WindowSizeClass.compute(width/density, height/density); return windowSizeClass.getWindowWidthSizeClass() == WindowWidthSizeClass.COMPACT || windowSizeClass.getWindowHeightSizeClass() == WindowHeightSizeClass.COMPACT; }
- ध्यान दें:
- ऊपर दिए गए उदाहरण, किसी गतिविधि के तरीकों के तौर पर लागू किए गए हैं; इसलिए,
computeMaximumWindowMetrics()
के तर्क में गतिविधि कोthis
के तौर पर दिखाया गया है. computeCurrentWindowMetrics()
की जगहcomputeMaximumWindowMetrics()
तरीके का इस्तेमाल किया जाता है, क्योंकि ऐप्लिकेशन को मल्टी-विंडो मोड में भी लॉन्च किया जा सकता है. हालांकि, स्क्रीन ओरिएंटेशन की सेटिंग का इस्तेमाल नहीं किया जाता. जब तक ऐप्लिकेशन विंडो डिवाइस की पूरी स्क्रीन नहीं दिखेगी, तब तक ऐप्लिकेशन विंडो का साइज़ तय करने और ओरिएंटेशन सेटिंग को बदलने का कोई मतलब नहीं है.
अपने ऐप्लिकेशन में computeMaximumWindowMetrics()
तरीका उपलब्ध कराने के लिए, डिपेंडेंसी का एलान करने से जुड़े निर्देशों के लिए, WindowManager देखें.
3. ऐप्लिकेशन मेनिफ़ेस्ट सेटिंग बदलें
जब आपको यह पता चल जाए कि डिवाइस की स्क्रीन का साइज़ छोटा है, तो मेनिफ़ेस्ट की screenOrientation
सेटिंग को बदलने के लिए Activity#setRequestedOrientation()
पर कॉल करें:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestedOrientation = if (compactScreen()) ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else ActivityInfo.SCREEN_ORIENTATION_FULL_USER ... // Replace with a known container that you can safely add a // view to where the view won't affect the layout and the view // won't be replaced. val container: ViewGroup = binding.container // Add a utility view to the container to hook into // View.onConfigurationChanged. This is required for all // activities, even those that don't handle configuration // changes. You can't use Activity.onConfigurationChanged, // since there are situations where that won't be called when // the configuration changes. View.onConfigurationChanged is // called in those scenarios. container.addView(object : View(this) { override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) requestedOrientation = if (compactScreen()) ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else ActivityInfo.SCREEN_ORIENTATION_FULL_USER } }) }
Java
@Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstanceState); if (compactScreen()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER); } ... // Replace with a known container that you can safely add a // view to where the view won't affect the layout and the view // won't be replaced. ViewGroup container = binding.container; // Add a utility view to the container to hook into // View.onConfigurationChanged. This is required for all // activities, even those that don't handle configuration // changes. You can't use Activity.onConfigurationChanged, // since there are situations where that won't be called when // the configuration changes. View.onConfigurationChanged is // called in those scenarios. container.addView(new View(this) { @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (compactScreen()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER); } } }); }
onCreate()
और View.onConfigurationChanged()
तरीकों में लॉजिक जोड़कर, विंडो की ज़्यादा से ज़्यादा मेट्रिक देखी जा सकती हैं. साथ ही, जब भी गतिविधि का साइज़ बदला जाता है या डिसप्ले के बीच स्विच किया जाता है, तब स्क्रीन की दिशा बदलने की सेटिंग में बदलाव किया जा सकता है. जैसे, डिवाइस को घुमाने के बाद या फ़ोल्ड किए जा सकने वाले डिवाइस को फ़ोल्ड या अनफ़ोल्ड करने पर.
कॉन्फ़िगरेशन में कब बदलाव होते हैं और इनकी वजह से गतिविधि फिर से कब बनती है, इस बारे में ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन में होने वाले बदलावों को मैनेज करना देखें
नतीजे
आपका ऐप्लिकेशन अब छोटी स्क्रीन पर पोर्ट्रेट ओरिएंटेशन में होना चाहिए, भले ही डिवाइस घुमाया गया हो. बड़ी स्क्रीन पर, ऐप्लिकेशन को लैंडस्केप और पोर्ट्रेट ओरिएंटेशन में काम करना चाहिए.
अन्य संसाधन
अपने ऐप्लिकेशन को हर समय सभी डिवाइस कॉन्फ़िगरेशन के साथ काम करने के लिए अपग्रेड करने में मदद पाने के लिए, इन्हें देखें:
- अलग-अलग साइज़ की स्क्रीन पर काम करना
- कॉन्फ़िगरेशन के बदलावों को मैनेज करना
- यूज़र इंटरफ़ेस (यूआई) की स्थितियां सेव करना
बाहरी कीबोर्ड स्पेसबार की मदद से, मीडिया को रोकें और फिर से चलाएं
बड़ी स्क्रीन ऑप्टिमाइज़ेशन में, कीबोर्ड के बाहरी इनपुट, जैसे कि Spacebar को दबाए जाने पर प्रतिक्रिया देना वीडियो और अन्य मीडिया का प्लेबैक रोकना या फिर से शुरू करना. यह खास तौर पर टैबलेट, जो अक्सर बाहरी कीबोर्ड, के साथ-साथ Chromebook डिवाइस भी हैं. आम तौर पर, इनमें बाहरी कीबोर्ड शामिल होते हैं, लेकिन इनका इस्तेमाल टैबलेट मोड में किया जा सकता है.
जब मीडिया ही सिर्फ़ एक ऐसा एलिमेंट होता है विंडो (जैसे कि फ़ुल-स्क्रीन में वीडियो चलाने की सुविधा), बटन दबाने पर मिलने वाले इवेंट का जवाब देती है गतिविधि के लेवल पर या Jetpack Compose में, स्क्रीन लेवल पर.
सबसे सही तरीके
जब भी आपका ऐप्लिकेशन कोई मीडिया फ़ाइल चलाता हो, तो उपयोगकर्ताओं के पास उसे रोकने और फिर से शुरू करने की सुविधा होनी चाहिए चलाने के लिए, किसी फ़िज़िकल कीबोर्ड पर Spacebar दबाएं.
सामग्री
KEYCODE_SPACE
: Spacebar के लिए की कोड कॉन्स्टेंट.
Compose
onPreviewKeyEvent
:Modifier
इसकी मदद से, कोई कॉम्पोनेंट (या उसके किसी चाइल्ड इवेंट) को फ़ोकस होने पर, हार्डवेयर के मुख्य इवेंट को रोकने में मदद मिलती है.onKeyEvent
:onPreviewKeyEvent
की तरह, यहModifier
एक कॉम्पोनेंट को (या उसके किसी चाइल्ड इवेंट) पर फ़ोकस होने पर, हार्डवेयर के मुख्य इवेंट को रोकने में मदद करता है.
व्यू
onKeyUp()
: इसे तब कॉल किया जाता है, जब कोई कुंजी रिलीज़ की जाती है और उसे किसी गतिविधि में मौजूद व्यू से हैंडल नहीं किया जाता.
तरीका
खास जानकारी
Jetpack Compose पर आधारित व्यू-आधारित ऐप्लिकेशन और ऐप्लिकेशन, कीबोर्ड के बटन दबाने पर मिलते-जुलते तरीकों से जवाब देते हैं: ऐप्लिकेशन को की-प्रेस इवेंट सुनने, इवेंट फ़िल्टर करने, और स्पेसबार कीप्रेस जैसे चुने गए बटन का जवाब देने के लिए कहा जाता है.
1. कीबोर्ड इवेंट सुनें
व्यू
अपने ऐप्लिकेशन में किसी गतिविधि के लिए, यह onKeyUp()
तरीका बदलें:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { ... }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { ... }
इस तरीके को हर बार तब लागू किया जाता है, जब कोई बटन दबाया जाता है, ताकि यह हर कीस्ट्रोक के लिए एक बार फ़ायर हो जाए.
Compose
Jetpack Compose की मदद से, स्क्रीन में मौजूद onPreviewKeyEvent
या onKeyEvent
मॉडिफ़ायर का इस्तेमाल किया जा सकता है. यह कीस्ट्रोक को मैनेज करता है:
Column(modifier = Modifier.onPreviewKeyEvent { event ->
if (event.type == KeyEventType.KeyUp) {
...
}
...
})
या
Column(modifier = Modifier.onKeyEvent { event ->
if (event.type == KeyEventType.KeyUp) {
...
}
...
})
2. स्पेसबार दबाने पर फ़िल्टर करें
onKeyUp()
तरीके या लिखें onPreviewKeyEvent
और onKeyEvent
कार्रवाई बदलने वाले तरीकों के अंदर, अपने मीडिया कॉम्पोनेंट को सही इवेंट भेजने के लिए KeyEvent.KEYCODE_SPACE
का फ़िल्टर लगाएं:
व्यू
Kotlin
if (keyCode == KeyEvent.KEYCODE_SPACE) { togglePlayback() return true } return false
Java
if (keyCode == KeyEvent.KEYCODE_SPACE) { togglePlayback(); return true; } return false;
Compose
Column(modifier = Modifier.onPreviewKeyEvent { event ->
if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
...
}
...
})
या
Column(modifier = Modifier.onKeyEvent { event ->
if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
...
}
...
})
नतीजे
अब आपका ऐप्लिकेशन, Spacebar के बटन दबाने पर किसी वीडियो या अन्य मीडिया को रोकने और फिर से चलाने के लिए जवाब दे सकता है.
अन्य संसाधन
कीबोर्ड इवेंट और उन्हें मैनेज करने के बारे में ज़्यादा जानने के लिए, कीबोर्ड हैंडल करना इनपुट.
स्टाइलस पाम अस्वीकार होना
बड़ी स्क्रीन पर स्टाइलस की मदद से, कई बेहतरीन और क्रिएटिव काम किए जा सकते हैं. हालांकि, जब उपयोगकर्ता स्टाइलस का इस्तेमाल करके किसी ऐप्लिकेशन पर कुछ बनाते हैं, लिखते हैं या उससे इंटरैक्ट करते हैं, तब वे कभी-कभी स्क्रीन को अपने हाथ की हथेली से टच करते हैं. आपके ऐप्लिकेशन को टच इवेंट की रिपोर्ट तब दी जा सकती है, जब सिस्टम गलती से हथेली के टच के रूप में इसकी पहचान करे और उसे खारिज कर दे.
सबसे सही तरीके
आपके ऐप्लिकेशन को बाहरी टच इवेंट की पहचान करनी चाहिए और उन्हें अनदेखा करना चाहिए. Android, MotionEvent
ऑब्जेक्ट को डिस्पैच करके, हथेली के टच को रद्द करता है. ऑब्जेक्ट को ACTION_CANCEL
या ACTION_POINTER_UP
और FLAG_CANCELED
के लिए देखें, ताकि यह पता चल सके कि हथेली के छूने की वजह से होने वाले जेस्चर को अस्वीकार करना है या नहीं.
सामग्री
MotionEvent
: इससे स्क्रीन पर टच और मूवमेंट के बारे में पता चलता है. इसमें वह जानकारी होती है जो यह तय करने के लिए ज़रूरी होती है कि किसी इवेंट को अनदेखा किया जाना चाहिए या नहीं.OnTouchListener#onTouch()
:MotionEvent
ऑब्जेक्ट मिलते हैं.MotionEvent#getActionMasked()
: यह किसी मोशन इवेंट से जुड़ी कार्रवाई दिखाता है.ACTION_CANCEL
:MotionEvent
कॉन्सटेंट जो यह बताता है कि हाथ के जेस्चर को पहले जैसा किया जाना चाहिए.ACTION_POINTER_UP
:MotionEvent
कॉन्सटेंट, जो पहले पॉइंटर के बजाय, किसी अन्य पॉइंटर के काम करने के बारे में बताता है (यानी कि डिवाइस की स्क्रीन से संपर्क छोड़ दिया गया है).FLAG_CANCELED
:MotionEvent
कॉन्सटेंट से पता चलता है कि पॉइंटर के ऊपर जाने की वजह से, अनजाने में टच हुआ है. Android 13 (एपीआई लेवल 33) और इसके बाद के वर्शन वालेACTION_POINTER_UP
औरACTION_CANCEL
इवेंट में जोड़ा गया.
तरीका
खास जानकारी
आपके ऐप्लिकेशन पर भेजे गए MotionEvent
ऑब्जेक्ट की जांच करें. इवेंट की विशेषताएं तय करने के लिए, MotionEvent
एपीआई का इस्तेमाल करें:
- सिंगल-पॉइंटर इवेंट —
ACTION_CANCEL
देखें. Android 13 और उसके बाद वाले वर्शन पर,FLAG_CANCELED
की जांच भी करें. - मल्टी-पॉइंटर इवेंट — Android 13 और उसके बाद के वर्शन पर,
ACTION_POINTER_UP
औरFLAG_CANCELED
देखें.
ACTION_CANCEL
और ACTION_POINTER_UP
/FLAG_CANCELED
इवेंट का जवाब दें.
1. मोशन इवेंट ऑब्जेक्ट पाएं
अपने ऐप्लिकेशन में OnTouchListener
जोड़ें:
Kotlin
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> // Process motion event. } }
Java
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { // Process motion event. });
2. इवेंट की कार्रवाई और फ़्लैग तय करें
ACTION_CANCEL
देखें. इससे सभी एपीआई लेवल पर सिंगल-पॉइंटर इवेंट के बारे में पता चलता है. Android 13 और उसके बाद वाले वर्शन पर, FLAG_CANCELED.
के लिए ACTION_POINTER_UP
देखें
Kotlin
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> when (event.actionMasked) { MotionEvent.ACTION_CANCEL -> { //Process canceled single-pointer motion event for all SDK versions. } MotionEvent.ACTION_POINTER_UP -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) { //Process canceled multi-pointer motion event for Android 13 and higher. } } } true } }
Java
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { switch (event.getActionMasked()) { case MotionEvent.ACTION_CANCEL: // Process canceled single-pointer motion event for all SDK versions. case MotionEvent.ACTION_UP: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) { //Process canceled multi-pointer motion event for Android 13 and higher. } } return true; });
3. हाथ के जेस्चर को पहले जैसा करें
हथेली को छूने की पहचान करने के बाद, हाथ के जेस्चर के ऑनस्क्रीन इफ़ेक्ट को पहले जैसा किया जा सकता है.
आपके ऐप्लिकेशन में, उपयोगकर्ता की कार्रवाइयों का इतिहास होना चाहिए, ताकि हथेली के छूने जैसे अनचाहे इनपुट वापस लाए जा सकें. उदाहरण के लिए, Android ऐप्लिकेशन में स्टाइलस के इस्तेमाल को बेहतर बनाएं कोडलैब में जाकर, बेसिक ड्रॉइंग ऐप्लिकेशन लागू करना लेख पढ़ें.
नतीजे
अब आपका ऐप्लिकेशन, Android 13 और उसके बाद के वर्शन वाले एपीआई लेवल पर मल्टी-पॉइंटर इवेंट और सभी एपीआई लेवल पर सिंगल-पॉइंटर इवेंट के लिए, हथेली के इशारे से किए जाने वाले इफ़ेक्ट को पहचान सकता है और अस्वीकार कर सकता है.
अन्य संसाधन
ज़्यादा जानकारी के लिए, यहां देखें:
- Android 13 की सुविधाएं और एपीआई — पाम के अस्वीकार होने की बेहतर प्रोसेस
- डेवलपर गाइड
- कोडलैब (कोड बनाना सीखना) — किसी Android ऐप्लिकेशन में स्टाइलस की सुविधा को बेहतर बनाना
वेबव्यू स्टेट मैनेजमेंट
WebView
आम तौर पर इस्तेमाल किया जाने वाला कॉम्पोनेंट है. यह स्टेट मैनेजमेंट के लिए ऐडवांस सिस्टम उपलब्ध कराता है. WebView
के लिए यह ज़रूरी है कि वह कॉन्फ़िगरेशन में हुए सभी बदलावों के लिए, अपनी स्थिति को बनाए रखे और उसे स्क्रोल करने की जगह पर रहे. जब उपयोगकर्ता डिवाइस को घुमाता है या फ़ोल्ड किए जा सकने वाले फ़ोन को अनफ़ोल्ड करता है, तो हो सकता है कि WebView
, स्क्रोल करने की पोज़िशन खो दे. इससे उपयोगकर्ता को WebView
पर ऊपर से पिछली स्क्रीन पर स्क्रोल करने के लिए दोबारा जाना पड़ेगा.
सबसे सही तरीके
WebView
को फिर से बनाए जाने की संख्या कम से कम करें. WebView
अपनी स्थिति को अच्छी तरह से मैनेज करता है. साथ ही, कॉन्फ़िगरेशन में किए गए ज़्यादा से ज़्यादा बदलावों को मैनेज करके, इस क्वालिटी का फ़ायदा पा सकता है. आपके ऐप्लिकेशन को कॉन्फ़िगरेशन में बदलाव मैनेज करने होंगे, क्योंकि Activity
मनोरंजन (कॉन्फ़िगरेशन में किए जाने वाले बदलावों को हैंडल करने का सिस्टम का तरीका), WebView
को फिर से बनाता है. इससे WebView
की स्थिति में बदलाव नहीं होता है.
सामग्री
android:configChanges
: मेनिफ़ेस्ट<activity>
एलिमेंट का एट्रिब्यूट. यह नीति, गतिविधि से मैनेज किए जाने वाले कॉन्फ़िगरेशन में किए गए बदलावों की सूची बनाती है.View#invalidate()
: वह तरीका जिसकी वजह से व्यू को फिर से ड्रॉ किया जाता है.WebView
से इनहेरिट किया गया.
तरीका
खास जानकारी
WebView
राज्य को सेव करने के लिए, जितना हो सके Activity
मनोरंजन से बचें. इसके बाद, WebView
को अमान्य होने दें, ताकि अपनी स्थिति को बनाए रखते हुए इसका साइज़ बदला जा सके.
1. अपने ऐप्लिकेशन की AndroidManifest.xml
फ़ाइल में कॉन्फ़िगरेशन में बदलाव जोड़ें
गतिविधि को फिर से चालू करने से बचें. इसके लिए, सिस्टम के बजाय आपके ऐप्लिकेशन से मैनेज किए जाने वाले कॉन्फ़िगरेशन में बदलाव करें:
<activity
android:name=".MyActivity"
android:configChanges="screenLayout|orientation|screenSize
|keyboard|keyboardHidden|smallestScreenSize" />
2. जब भी आपके ऐप्लिकेशन को कॉन्फ़िगरेशन में बदलाव मिलता है, तो WebView
को अमान्य करें
Kotlin
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) webView.invalidate() }
Java
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); webview.invalidate(); }
यह चरण सिर्फ़ व्यू सिस्टम पर लागू होता है, क्योंकि Jetpack Compose की सुविधा Composable
एलिमेंट का साइज़ सही तरीके से बदलने के लिए, किसी भी जानकारी को अमान्य नहीं करती. हालांकि, अगर कंपोज़िशन को सही तरीके से मैनेज नहीं किया गया है, तो यह अक्सर WebView
को फिर से जनरेट कर देता है. अपने Compose ऐप्लिकेशन में WebView
की स्थिति को सेव और वापस लाने के लिए, Accompanist वेबव्यू के रैपर का इस्तेमाल करें.
नतीजे
आपके ऐप्लिकेशन के WebView
कॉम्पोनेंट, अब कॉन्फ़िगरेशन में किए गए कई बदलावों के लिए अपनी स्थिति को बनाए रखते हैं. साथ ही, स्क्रोल करने की पोज़िशन भी तय होती है. इनमें, साइज़ बदलने से लेकर स्क्रीन की दिशा बदलने तक, डिवाइस को फ़ोल्ड करने और अनफ़ोल्ड करने तक की गतिविधियां शामिल हैं.
अन्य संसाधन
कॉन्फ़िगरेशन में किए गए बदलावों और उन्हें मैनेज करने के तरीके के बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन के बदलाव मैनेज करना लेख पढ़ें.
RecyclerView स्टेट मैनेजमेंट
RecyclerView
बहुत कम ग्राफ़िक वाले संसाधनों का इस्तेमाल करके, ज़्यादा डेटा दिखा सकता है. RecyclerView
के तौर पर
आइटम की सूची में स्क्रोल करता है. RecyclerView
, स्क्रीन पर स्क्रोल करने पर नए आइटम बनाने के लिए, View
आइटम के उन इंस्टेंस का फिर से इस्तेमाल करता है जिन्हें स्क्रीन पर स्क्रोल किया जाता है. हालांकि, डिवाइस को घुमाने जैसे कॉन्फ़िगरेशन में बदलाव होने पर, RecyclerView
की स्थिति रीसेट हो सकती है. इससे उपयोगकर्ताओं को फिर से RecyclerView
आइटम की सूची में अपनी पिछली पोज़िशन पर स्क्रोल करना होगा.
सबसे सही तरीके
कॉन्फ़िगरेशन में सभी बदलावों के दौरान, RecyclerView
को अपनी स्थिति—खास तौर पर, स्क्रोल की स्थिति—और सूची के एलिमेंट की स्थिति को बनाए रखना चाहिए.
सामग्री
RecyclerView.Adapter#setStateRestorationPolicy()
: इससे पता चलता है कि कॉन्फ़िगरेशन में बदलाव होने के बाद,RecyclerView.Adapter
अपनी स्थिति को कैसे पहले जैसा करता है.ViewModel
: किसी गतिविधि या फ़्रैगमेंट की स्थिति को होल्ड करता है.
तरीका
खास जानकारी
RecyclerView
स्क्रोल पोज़िशन को सेव करने के लिए, RecyclerView.Adapter
की स्थिति को पहले जैसा करने की नीति सेट करें. सूची के RecyclerView
आइटम की स्थिति सेव करें. सूची में मौजूद आइटम की स्थिति को RecyclerView
अडैप्टर में जोड़ें. साथ ही, ViewHolder
से जोड़े जाने पर सूची आइटम की स्थिति को पहले जैसा करें.
1. Adapter
की स्थिति को वापस लाने की नीति चालू करें
RecyclerView
अडैप्टर की स्थिति को पहले जैसा करने की नीति चालू करें, ताकि कॉन्फ़िगरेशन में बदलाव होने पर भी RecyclerView
की स्क्रोलिंग पोज़िशन बनी रहे. अडैप्टर कंस्ट्रक्टर में नीति की खास जानकारी जोड़ें:
Kotlin
class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
Java
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
2. स्टेटफ़ुल सूची आइटम की स्थिति सेव करें
जटिल RecyclerView
सूची आइटम की स्थिति सेव करें, जैसे कि EditText
एलिमेंट वाले आइटम. उदाहरण के लिए, किसी EditText
की स्थिति को सेव करने के लिए, onClick
हैंडलर से मिलता-जुलता कॉलबैक जोड़ें, ताकि टेक्स्ट में किए गए बदलावों को कैप्चर किया जा सके. कॉलबैक में, यह तय करें कि कौनसा डेटा सेव करना है:
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
अपने Activity
या Fragment
में कॉलबैक का एलान करें. राज्य को सेव करने के लिए, ViewModel
का इस्तेमाल करें.
3. सूची आइटम की स्थिति को Adapter
में जोड़ें
अपने RecyclerView.Adapter
में सूची आइटम की स्थिति जोड़ें. आपका होस्ट Activity
या Fragment
बनने के बाद, आइटम की स्थिति को अडैप्टर कंस्ट्रक्टर पर पास करें:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. अडैप्टर के ViewHolder
में सूची आइटम की स्थिति को वापस पाएं
RecyclerView.Adapter
में, जब ViewHolder
को किसी आइटम से बाइंड किया जाता है, तब आइटम की स्थिति को पहले जैसा करें:
Kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { ... val item = items[position] val state = states.firstOrNull { it.item == item } if (state != null) { holder.restore(state) } }
Java
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ... Item item = items[position]; Arrays.stream(states).filter(state -> state.item == item) .findFirst() .ifPresent(state -> holder.restore(state)); }
नतीजे
अब आपका RecyclerView
स्क्रोल करने की स्थिति और RecyclerView
सूची के हर आइटम की स्थिति को पहले जैसा कर सकता है.
अन्य संसाधन
- RecyclerView की मदद से डाइनैमिक सूचियां बनाना
- RecyclerView को अपनी पसंद के मुताबिक बनाने का बेहतर तरीका
डिटैचबल कीबोर्ड मैनेजमेंट
डिटैचबल कीबोर्ड की सुविधा, ज़्यादा डिवाइसों पर उपयोगकर्ता की प्रोडक्टिविटी को बढ़ाती है
स्क्रीन डिवाइस. जब भी कीबोर्ड चालू होता है, Android कॉन्फ़िगरेशन में बदलाव ट्रिगर करता है.
किसी डिवाइस से जुड़ा या हटाया जाता है. इसकी वजह से यूज़र इंटरफ़ेस (यूआई) स्थिति खो सकती है. आपका
ऐप्लिकेशन या तो अपनी स्थिति को सेव और वापस ला सकता है, ताकि सिस्टम उसे हैंडल कर सके
गतिविधि को फिर से चालू करने या कीबोर्ड कॉन्फ़िगरेशन में बदलावों के लिए गतिविधि को फिर से चालू करने पर पाबंदी लगाना.
सभी मामलों में कीबोर्ड से संबंधित सारा डेटा
Configuration
ऑब्जेक्ट. keyboard
और
कॉन्फ़िगरेशन ऑब्जेक्ट के keyboardHidden
फ़ील्ड में, टाइप के बारे में जानकारी होती है
समस्याओं को कैसे हल करें.
सबसे सही तरीके
बड़ी स्क्रीन के लिए ऑप्टिमाइज़ किए गए ऐप्लिकेशन, हर तरह के इनपुट डिवाइस पर काम करते हैं सॉफ़्टवेयर और हार्डवेयर कीबोर्ड से स्टाइलस, माउस, ट्रैकपैड, और अन्य सहायक डिवाइस डिवाइस.
बाहरी कीबोर्ड के साथ काम करने के लिए, कॉन्फ़िगरेशन में बदलाव किए जा सकते हैं. इन बदलावों को लागू करके, ये काम किए जा सकते हैं इनमें से किसी एक तरीके से मैनेज करें:
- सिस्टम को, हाल ही में चल रही गतिविधि को फिर से बनाने की अनुमति दें. इसके बाद, अपने ऐप्लिकेशन की स्थिति को मैनेज करें.
- कॉन्फ़िगरेशन में बदलाव को खुद मैनेज करें (गतिविधि को फिर से नहीं बनाया जाएगा):
- कीबोर्ड से जुड़ी सभी कॉन्फ़िगरेशन वैल्यू का एलान करना
- कॉन्फ़िगरेशन में बदलाव करने वाला हैंडलर बनाना
काम को आसान बनाने वाले ऐप्लिकेशन, जिन्हें टेक्स्ट डालने के लिए अक्सर यूज़र इंटरफ़ेस (यूआई) को बेहतर तरीके से कंट्रोल करने की ज़रूरत होती है. काम करते समय, 'अपने-आप काम करें' की रणनीति से और कॉन्फ़िगरेशन में बदलाव किए गए हैं.
कुछ खास मामलों में, हो सकता है कि आप हार्डवेयर की मदद से, अपने ऐप्लिकेशन का लेआउट बदलना चाहें कीबोर्ड अटैच या डिटैच किया गया हो. उदाहरण के लिए, टूल के लिए ज़्यादा जगह बनाने या बदलाव करने वाली विंडो.
चूंकि कॉन्फ़िगरेशन के बदलावों को सुनने का एकमात्र भरोसेमंद तरीका ओवरराइड करना है
किसी व्यू के onConfigurationChanged()
तरीके से, तो नया व्यू जोड़ा जा सकता है
ऐप्लिकेशन गतिविधि को इंस्टेंस करें और व्यू के onConfigurationChanged()
में जवाब दें
हैंडलर के अटैच किए जाने की वजह से कॉन्फ़िगरेशन में हुए बदलाव या
डिटैच किया गया.
सामग्री
android:configChanges
: ऐप्लिकेशन मेनिफ़ेस्ट के<activity>
एलिमेंट का एट्रिब्यूट. यह सिस्टम को, ऐप्लिकेशन के ज़रिए मैनेज किए जाने वाले कॉन्फ़िगरेशन बदलावों के बारे में सूचना देता है.View#onConfigurationChanged()
: वह तरीका जो किसी नए प्रॉडक्ट के बनने पर प्रतिक्रिया देता है ऐप्लिकेशन कॉन्फ़िगरेशन.
तरीका
खास जानकारी
configChanges
एट्रिब्यूट का एलान करें और कीबोर्ड से जुड़ी वैल्यू जोड़ें. जोड़ें
गतिविधि के व्यू हैरारकी (व्यू और व्यू ग्रुप के लेआउट का क्रम) के लिए View
और कॉन्फ़िगरेशन में हुए बदलावों को सुनें.
1. configChanges
एट्रिब्यूट का एलान करें
पहले से मैनेज किए जा रहे कॉन्फ़िगरेशन में हुए बदलावों की सूची में keyboard|keyboardHidden
वैल्यू जोड़कर, ऐप्लिकेशन मेनिफ़ेस्ट में <activity>
एलिमेंट को अपडेट करें:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. व्यू हैरारकी में कोई खाली व्यू जोड़ना
नए व्यू का एलान करें और व्यू के onConfigurationChanged()
तरीके में अपना हैंडलर कोड जोड़ें:
Kotlin
val v = object : View(this) { override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) // Handler code here. } }
Java
View v = new View(this) { @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Handler code here. } };
नतीजे
अब आपका ऐप्लिकेशन, अटैच या डिटैच किए गए बाहरी कीबोर्ड का जवाब देगा. इसके लिए, मौजूदा गतिविधि का फिर से इस्तेमाल नहीं किया जाएगा.
अन्य संसाधन
कीबोर्ड अटैचमेंट या डिटैचमेंट जैसे कॉन्फ़िगरेशन बदलावों के दौरान अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) की स्थिति को सेव करने का तरीका जानने के लिए, यूज़र इंटरफ़ेस (यूआई) की स्थितियों को सेव करना लेख पढ़ें.
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- कॉन्फ़िगरेशन के बदलावों को मैनेज करना