बड़ी स्क्रीन वाली कुकबुक

पांच स्टार वाले बड़ी स्क्रीन वाले ऐप्लिकेशन के लिए, 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 और उसके बाद के वर्शन वाले एपीआई लेवल पर मल्टी-पॉइंटर इवेंट और सभी एपीआई लेवल पर सिंगल-पॉइंटर इवेंट के लिए, हथेली के इशारे से किए जाने वाले इफ़ेक्ट को पहचान सकता है और अस्वीकार कर सकता है.

अन्य संसाधन

ज़्यादा जानकारी के लिए, यहां देखें:

वेबव्यू स्टेट मैनेजमेंट

तीन-स्टार रेटिंग

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() {
    init {
        stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    }
    ...
}

Java

class MyAdapter extends RecyclerView.Adapter {

    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 सूची के हर आइटम की स्थिति को पहले जैसा कर सकता है.

अन्य संसाधन

डिटैचबल कीबोर्ड मैनेजमेंट

तीन-स्टार रेटिंग

डिटैचबल कीबोर्ड की सुविधा, ज़्यादा डिवाइसों पर उपयोगकर्ता की प्रोडक्टिविटी को बढ़ाती है स्क्रीन डिवाइस. जब भी कीबोर्ड चालू होता है, Android कॉन्फ़िगरेशन में बदलाव ट्रिगर करता है. किसी डिवाइस से जुड़ा या हटाया जाता है. इसकी वजह से यूज़र इंटरफ़ेस (यूआई) स्थिति खो सकती है. आपका ऐप्लिकेशन या तो अपनी स्थिति को सेव और वापस ला सकता है, ताकि सिस्टम उसे हैंडल कर सके गतिविधि को फिर से चालू करने या कीबोर्ड कॉन्फ़िगरेशन में बदलावों के लिए गतिविधि को फिर से चालू करने पर पाबंदी लगाना. सभी मामलों में कीबोर्ड से संबंधित सभी डेटा Configuration ऑब्जेक्ट. keyboard और कॉन्फ़िगरेशन ऑब्जेक्ट के keyboardHidden फ़ील्ड में, टाइप के बारे में जानकारी होती है समस्याओं को कैसे हल करें.

सबसे सही तरीके

बड़ी स्क्रीन के लिए ऑप्टिमाइज़ किए गए ऐप्लिकेशन, हर तरह के इनपुट डिवाइस पर काम करते हैं सॉफ़्टवेयर और हार्डवेयर कीबोर्ड से स्टाइलस, माउस, ट्रैकपैड, और अन्य सहायक डिवाइस डिवाइस.

बाहरी कीबोर्ड के साथ काम करने के लिए, कॉन्फ़िगरेशन में बदलाव किए जा सकते हैं. इन बदलावों को लागू करके, ये काम किए जा सकते हैं इनमें से किसी एक तरीके से मैनेज करें:

  1. सिस्टम को, हाल ही में चल रही गतिविधि को फिर से बनाने की अनुमति दें. इसके बाद, अपने ऐप्लिकेशन की स्थिति को मैनेज करें.
  2. कॉन्फ़िगरेशन में बदलाव को खुद मैनेज करें (गतिविधि को फिर से नहीं बनाया जाएगा):
    • कीबोर्ड से जुड़ी सभी कॉन्फ़िगरेशन वैल्यू का एलान करना
    • कॉन्फ़िगरेशन में बदलाव करने वाला हैंडलर बनाना

काम को आसान बनाने वाले ऐप्लिकेशन, जिन्हें टेक्स्ट डालने के लिए अक्सर यूज़र इंटरफ़ेस (यूआई) को बेहतर तरीके से कंट्रोल करने की ज़रूरत होती है. काम करते समय, 'अपने-आप काम करें' की रणनीति से और कॉन्फ़िगरेशन में बदलाव किए गए हैं.

कुछ खास मामलों में, हो सकता है कि आप हार्डवेयर की मदद से, अपने ऐप्लिकेशन का लेआउट बदलना चाहें कीबोर्ड अटैच या डिटैच किया गया हो. उदाहरण के लिए, टूल के लिए ज़्यादा जगह बनाने या बदलाव करने वाली विंडो.

चूंकि कॉन्फ़िगरेशन के बदलावों को सुनने का एकमात्र भरोसेमंद तरीका ओवरराइड करना है 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.
    }
};

नतीजे

अब आपका ऐप्लिकेशन, अटैच या डिटैच किए गए किसी बाहरी कीबोर्ड का जवाब देगा. इसके लिए, मौजूदा गतिविधि को फिर से बनाना ज़रूरी नहीं है.

अन्य संसाधन

कीबोर्ड अटैचमेंट या डिटैचमेंट जैसे कॉन्फ़िगरेशन में बदलाव के दौरान, अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) की स्थिति को सेव करने का तरीका जानने के लिए, यूज़र इंटरफ़ेस (यूआई) की स्थितियों को सेव करना लेख पढ़ें.