कभी-कभी आपके लेआउट के लिए कॉम्प्लेक्स व्यू की ज़रूरत होती है, जिनका इस्तेमाल शायद ही कभी किया जाता हो. चाहे इनमें, आइटम की जानकारी, प्रोग्रेस इंडिकेटर या मैसेज को पहले जैसा किया जाता है. मेमोरी का इस्तेमाल होता है और व्यू लोड होने से रेंडरिंग की रफ़्तार बढ़ती है की ज़रूरत नहीं है.
अगर आपके ऐप्लिकेशन के व्यू जटिल हैं, तो लोड होने वाले संसाधनों को कुछ समय के लिए रोका जा सकता है
तय करके यह तय करें कि
इसके लिए ViewStub
जटिल और बहुत कम इस्तेमाल होने वाले व्यू हैं.
ViewStub तय करना
ViewStub एक लाइटवेट व्यू है. इसमें कोई डाइमेंशन नहीं है
कुछ भी ड्रॉ करने या लेआउट में हिस्सा लेने के लिए किया जा सकता है. इसलिए, इसके लिए कुछ संसाधनों की ज़रूरत होती है
का इस्तेमाल किया जा सकता है. हर ViewStub में ये शामिल हैं
android:layout एट्रिब्यूट का इस्तेमाल करके, इनफ़्लेटेशन का लेआउट तय करें.
मान लें कि आपके पास एक लेआउट है जिसे आपको अपनी उपयोगकर्ता यात्रा में बाद में लोड करना है ऐप्लिकेशन:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:src="@drawable/logo" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>
ViewStub का इस्तेमाल करके, लोड होने से रोका जा सकता है. बनाने में
यह कुछ भी दिखाता या लोड करता है, तो आपको इसे रेफ़र किया गया लेआउट दिखाना होगा:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent"> <ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/heavy_layout_we_want_to_postpone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" /> </FrameLayout>
ViewStub लेआउट लोड करें
पिछले सेक्शन में मौजूद कोड स्निपेट से कुछ इस तरह का पता चलता है, जैसे कि इमेज 1:
ViewStub यह है
छिपाए गए भारी लेआउट को छिपा दिया जाता है.जब आपको ViewStub के बताए गए लेआउट को लोड करना हो,
कॉल करके इसे 'दिखाएं' पर सेट करें
setVisibility(View.VISIBLE)
या कॉल करें
inflate().
नीचे दिया गया कोड स्निपेट, स्थगित लोड को सिम्युलेट करता है. स्क्रीन इस तरह लोड होती है
Activity और onCreate() में सामान्य है, तो यह
heavy_layout_we_want_to_postpone लेआउट:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_old_xml) Handler(Looper.getMainLooper()) .postDelayed({ findViewById<View>(R.id.stub_import).visibility = View.VISIBLE // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate() }, 2000) }
Java
@Override void onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_old_xml); Handler(Looper.getMainLooper()) .postDelayed({ findViewById<View>(R.id.stub_import).visibility = View.VISIBLE // Or val importPanel: View = findViewById<ViewStub>(R.id.stub_import).inflate() }, 2000); }
ViewStub एलिमेंट दिखने या बढ़ा-चढ़ाकर दिखाने के बाद, एलिमेंट का हिस्सा हट जाता है
के क्रम में हो सकता है. इसे इनफ़्लेटेड लेआउट से बदल दिया जाता है और
उस लेआउट का रूट व्यू android:inflatedId से तय किया गया है
ViewStub एट्रिब्यूट का इस्तेमाल करें. बताया गया आईडी android:id
ViewStub के लिए, ViewStub तक ही मान्य है
लेआउट साफ़ तौर पर दिख रहा हो या बढ़ा हुआ हो.
इस विषय के बारे में ज़्यादा जानने के लिए, यह ब्लॉग पोस्ट देखें ऑप्टिमाइज़ करें स्टब के साथ.