Wear पर फ़ुल-स्क्रीन पर गतिविधियों से बाहर निकलें

Compose को आज़माएं
Wear OS के लिए, Jetpack Compose को यूज़र इंटरफ़ेस (यूआई) टूलकिट के तौर पर इस्तेमाल करने का सुझाव दिया जाता है.

कोई उपयोगकर्ता, Wear OS पर किसी ऐक्टिविटी से बाहर निकलने के लिए, बाईं से दाईं ओर स्वाइप कर सकता है. अगर ऐप्लिकेशन में हॉरिज़ॉन्टल स्क्रोलिंग की सुविधा है, तो उपयोगकर्ता कॉन्टेंट के किनारे पर जाकर, बाईं से दाईं ओर स्वाइप करके ऐप्लिकेशन से बाहर निकल सकता है. पावर बटन दबाने पर भी, उपयोगकर्ता स्मार्टवॉच की होम स्क्रीन पर वापस आ जाता है.

स्वाइप करके स्क्रीन बंद करने का जेस्चर

मौजूदा स्क्रीन को बंद करने के लिए, उपयोगकर्ता बाईं से दाईं ओर स्वाइप करते हैं. इसलिए, हमारा सुझाव है कि आप इन सुविधाओं का इस्तेमाल करें:

  • वर्टिकल लेआउट
  • कॉन्टेंट कंटेनर

हमारा यह भी सुझाव है कि आपके ऐप्लिकेशन में हॉरिज़ॉन्टल स्वाइप करने के जेस्चर न हों.

कोई ऐक्टिविटी बंद करना

ऐक्टिविटी में, स्वाइप करके स्क्रीन बंद करने की सुविधा अपने-आप काम करती है. किसी ऐक्टिविटी को बाईं से दाईं ओर स्वाइप करने पर, वह बंद हो जाती है. इसके बाद, ऐप्लिकेशन बैक स्टैक पर वापस चला जाता है.

कोई फ़्रैगमेंट बंद करना

फ़्रैगमेंट में, स्वाइप करके स्क्रीन बंद करने की सुविधा चालू करने के लिए, आपको फ़्रैगमेंट वाले व्यू को SwipeDismissFrameLayout क्लास में रैप करना होगा. फ़्रैगमेंट का इस्तेमाल करने के बारे में फ़ैसला लेते समय, इस बात का ध्यान रखें. यहां दिए गए उदाहरण के मुताबिक, SwipeDismissFrameLayout क्लास का इस्तेमाल करें:

Kotlin

class SwipeDismissFragment : Fragment() {
    private val callback = object : SwipeDismissFrameLayout.Callback() {
        override fun onSwipeStarted(layout: SwipeDismissFrameLayout) {
            // Optional
        }

        override fun onSwipeCanceled(layout: SwipeDismissFrameLayout) {
            // Optional
        }

        override fun onDismissed(layout: SwipeDismissFrameLayout) {
            // Code here for custom behavior, such as going up the
            // back stack and destroying the fragment but staying in the app.
        }
    }

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View =
            SwipeDismissFrameLayout(activity).apply {

                // If the fragment should fill the screen (optional), then in the layout file,
                // in the androidx.wear.widget.SwipeDismissFrameLayout element,
                // set the android:layout_width and android:layout_height attributes
                // to "match_parent".

                inflater.inflate(
                        R.layout.swipe_dismiss_frame_layout,
                        this,
                        false
                ).also { inflatedView ->
                    addView(inflatedView)
                }
                addCallback(callback)
            }
}

Java

public class SwipeDismissFragment extends Fragment {
  private final Callback callback =
    new Callback() {
      @Override
        public void onSwipeStart() {
          // Optional
        }

        @Override
        public void onSwipeCancelled() {
          // Optional
        }

        @Override
        public void onDismissed(SwipeDismissFrameLayout layout) {
          // Code here for custom behavior, such as going up the
          // back stack and destroying the fragment but staying in the app.
        }
      };

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    SwipeDismissFrameLayout swipeLayout = new SwipeDismissFrameLayout(getActivity());

    // If the fragment should fill the screen (optional), then in the layout file,
    // in the androidx.wear.widget.SwipeDismissFrameLayout element,
    // set the android:layout_width and android:layout_height attributes
    // to "match_parent".

    View inflatedView = inflater.inflate(R.layout.swipe_dismiss_frame_layout, swipeLayout, false);
    swipeLayout.addView(inflatedView);
    swipeLayout.addCallback(callback);

    return swipeLayout;
    }
}

ध्यान दें: अपनी ऐक्टिविटी में फ़्रैगमेंट का इस्तेमाल करते समय, स्वाइप करके स्क्रीन बंद करने के जेस्चर की सुविधा चालू करने के लिए, FragmentManager.replace के बजाय FragmentManager.add का इस्तेमाल करें. इससे यह पक्का करने में मदद मिलती है कि स्वाइप करने पर, सबसे ऊपर दिखने वाला फ़्रैगमेंट हट जाए और उसके नीचे, पिछला फ़्रैगमेंट दिखे.

हॉरिज़ॉन्टल स्क्रोल किए जा सकने वाले व्यू

कुछ मामलों में, जैसे कि पैन करने की सुविधा वाले मैप वाले व्यू में, यूज़र इंटरफ़ेस (यूआई) हॉरिज़ॉन्टल स्वाइप करने से नहीं रोक सकता. ऐसे में, आपके पास दो विकल्प होते हैं:

  • अगर बैक स्टैक छोटा है, तो उपयोगकर्ता पावर बटन दबाकर ऐप्लिकेशन को बंद कर सकता है और स्मार्टवॉच की होम स्क्रीन पर वापस जा सकता है.
  • अगर आपको यह सुविधा देनी है कि उपयोगकर्ता बैक स्टैक पर वापस जा सके, तो व्यू को SwipeDismissFrameLayout ऑब्जेक्ट में रैप किया जा सकता है. इससे किनारे से स्वाइप करने की सुविधा चालू हो जाती है. किनारे से स्वाइप करने की सुविधा तब चालू होती है, जब व्यू या उसके चाइल्ड, true कॉल से canScrollHorizontally() वैल्यू दिखाते हैं. किनारे से स्वाइप करने की सुविधा की मदद से, उपयोगकर्ता व्यू में कहीं भी स्वाइप करने के बजाय, स्क्रीन के सबसे बाईं ओर के 10% हिस्से से स्वाइप करके व्यू को बंद कर सकता है.

यहां दिए गए उदाहरणों में बताया गया है कि किसी व्यू को SwipeDismissFrameLayout ऑब्जेक्ट में कैसे रैप किया जाता है:

<androidx.wear.widget.SwipeDismissFrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/swipe_dismiss_root" >

    <TextView
        android:id="@+id/test_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Swipe me to dismiss me." />
</androidx.wear.widget.SwipeDismissFrameLayout>

Kotlin

activity?.findViewById<SwipeDismissFrameLayout>(R.id.swipe_dismiss_root)?.apply {
    addCallback(object : SwipeDismissFrameLayout.Callback() {

        override fun onDismissed(layout: SwipeDismissFrameLayout) {
            layout.visibility = View.GONE
        }
    })
}

Java

SwipeDismissFrameLayout testLayout =
    (SwipeDismissFrameLayout) activity.findViewById(R.id.swipe_dismiss_root);
testLayout.addCallback(new SwipeDismissFrameLayout.Callback() {
    @Override
    public void onDismissed(SwipeDismissFrameLayout layout) {
        layout.setVisibility(View.GONE);
    }
  }
);

इसका सुझाव नहीं दिया जाता: स्वाइप करके स्क्रीन बंद करने की सुविधा बंद करना

आम तौर पर, हमारा सुझाव है कि स्वाइप करके स्क्रीन बंद करने की सुविधा बंद न करें. इसकी वजह यह है कि उपयोगकर्ता किसी भी स्क्रीन को स्वाइप करके बंद करने की उम्मीद करता है. किसी खास मामले में, स्टाइल रिसॉर्स में डिफ़ॉल्ट थीम को बढ़ाया जा सकता है. साथ ही, android:windowSwipeToDismiss एट्रिब्यूट को false पर सेट किया जा सकता है. इसके लिए, यहां दिया गया कोड सैंपल देखें:

<resources>
  <style name="AppTheme" parent="@android:style/Theme.DeviceDefault">
    <item name="android:windowSwipeToDismiss">false</item>
  </style>
</resources>

इसके बाद, अपने ऐप्लिकेशन का पहली बार इस्तेमाल करने वाले उपयोगकर्ताओं को बताया जा सकता है कि वे पावर बटन दबाकर ऐप्लिकेशन से बाहर निकल सकते हैं.

पावर बटन से स्क्रीन बंद करना

फ़िज़िकल पावर बटन दबाने पर, पावर की इवेंट भेजा जाता है. इसलिए, पावर बटन का इस्तेमाल, 'वापस जाएं' बटन के तौर पर या सामान्य तौर पर नेविगेट करने के लिए नहीं किया जा सकता.

पावर बटन दबाने पर, उपयोगकर्ता स्मार्टवॉच की होम स्क्रीन पर वापस आ जाता है. इसके दो अपवाद हैं:

  • अगर उपयोगकर्ता, इनपुट मेथड एडिटर (IME) में है, जैसे कि हाथ से लिखे टेक्स्ट को पहचानने वाली स्क्रीन पर, तो बटन दबाने पर IME बंद हो जाता है और उपयोगकर्ता ऐप्लिकेशन पर वापस आ जाता है.
  • अगर उपयोगकर्ता स्मार्टवॉच के डायल पर है, तो हार्डवेयर बटन दबाने पर ऐप्लिकेशन लॉन्चर खुल जाता है.

ध्यान दें कि पावर बटन दबाने पर, isFinishing() क्लास का Activity तरीका, true वैल्यू नहीं दिखाता. साथ ही, की इवेंट को इंटरसेप्ट नहीं किया जा सकता.

ज़्यादा जानकारी के लिए, नेविगेशन लेख पढ़ें.