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

'लिखें' सुविधा आज़माएं
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 ऑब्जेक्ट में रैप करें. यह ऑब्जेक्ट, किनारे पर स्वाइप करने की सुविधा के साथ काम करता है. जब व्यू या उसके चाइल्ड व्यू, canScrollHorizontally() कॉल से वापस आते हैं, तब किनारे पर स्वाइप करने की सुविधा चालू हो जाती है.true किनारे पर स्वाइप करने की सुविधा की मदद से, उपयोगकर्ता व्यू को स्क्रीन के सबसे बाईं ओर 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>

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

पावर बटन से खारिज करना

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

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

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

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

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