Bazen düzeniniz nadiren kullanılan karmaşık görünümler gerektirir. Öğe ayrıntıları, ilerleme göstergeleri veya geri alma mesajları olabilir. Görünümleri yalnızca ihtiyaç duyulduğunda yükleyerek bellek kullanımını azaltabilir ve oluşturmayı hızlandırabilirsiniz.
Karmaşık ve nadiren kullanılan görünümler için bir ViewStub
tanımlayarak uygulamanızın gelecekte ihtiyaç duyacağı karmaşık görünümler olduğunda kaynakların yüklenmesini erteleyebilirsiniz.
ViewStub tanımlama
ViewStub
, hiçbir şey çizmeyen veya düzene katılmayan, boyutu olmayan basit bir görünümdür. Bu nedenle, görünümü artırıp bir görünüm hiyerarşisinde
bırakmak için çok az kaynak gerekir. Her ViewStub
, genişletilecek düzeni belirtmek için android:layout
özelliğini içerir.
Uygulamanızın kullanıcı yolculuğunda daha sonra yüklemek istediğiniz bir düzeniniz olduğunu varsayalım:
<?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>
Aşağıdaki ViewStub
öğelerini kullanarak yüklemeyi erteleyebilirsiniz. Herhangi bir şeyi göstermesi veya yüklemesi için önerilen düzeni göstermesini sağlamanız gerekir:
<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 düzenini yükleme
Önceki bölümde verilen kod snippet'leri şekil 1'e benzer bir sonuç verir:
ViewStub
tarafından belirtilen düzeni yüklemek istediğinizde setVisibility(View.VISIBLE)
kodunu çağırarak veya inflate()
yöntemini çağırarak düzeni görünür olarak ayarlayın.
Aşağıdaki kod snippet'i, ertelenmiş bir yükü simüle etmektedir. Ekran, Activity
ve onCreate()
içinde her zamanki gibi yüklenir, ardından heavy_layout_we_want_to_postpone
düzeni gösterilir:
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
öğesi, görünür hale geldiğinde veya şişirildiğinde artık görünüm hiyerarşisinin bir parçası olmaz. Bunun yerine, büyütülmüş düzen kullanılır ve bu düzenin kök görünümünün kimliği, ViewStub
öğesinin android:inflatedId
özelliği ile belirtilir. ViewStub
için belirtilen android:id
kimliği, yalnızca ViewStub
düzeni görünene veya şişirilene kadar geçerlidir.
Bu konu hakkında daha fazla bilgi için Koçlarla optimize etme başlıklı blog yayınına bakın.