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