場合によっては、ほとんど使用されない複雑なビューがレイアウトに必要なことがあります。かどうか アイテムの詳細、進行状況インジケーター、メッセージの取り消しです。 レンダリングの高速化が可能になります。 必要ありません。
アプリに複雑なビューがある場合、リソースの読み込みを遅らせることができる
将来的なニーズに対応するために
ViewStub
:
ほとんど使用されないビューです
ViewStub を定義する
ViewStub
は、
描画したり、レイアウトに関与したりできます。そのため、必要なリソースが最小限で済みます。
ビュー階層内にインフレートして残します各 ViewStub
に含まれるもの
android:layout
属性でインフレートするレイアウトを指定します。
ユーザー ジャーニーの後半で読み込む必要があるレイアウトがあるとします。 app:
<?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
の属性です。指定された ID android:id
ViewStub
は、ViewStub
表示またはインフレートできます。
このトピックの詳細については、こちらのブログ投稿をご覧ください。 最適化 スタブを使用するをご覧ください。