android viewstub

Cómo usar View Stub en android



viewstub (3)

Aquí hay un ejemplo para mostrar / ocultar y cambiar datos de ViewStub en tiempo de ejecución

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/buttonShow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show View Stub"/> <Button android:id="@+id/buttonHide" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hide View Stub"/> <ViewStub android:id="@+id/viewStub" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/layout_of_view_stub" /> </LinearLayout>

layout_of_view_stub.xml

<TextView android:id="@+id/textInViewStub" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ViewStub Button" />

MainActivity.java

public class MainActivity extends AppCompatActivity { private ViewStub viewStub; private Button buttonShow; private Button buttonHide; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonShow = findViewById(R.id.buttonShow); buttonHide = findViewById(R.id.buttonHide); buttonShow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showViewStub(); } }); buttonHide.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { hideViewStub(); } }); } private void showViewStub() { if (viewStub == null) { viewStub = findViewById(R.id.viewStub); // If you want to change data of ViewStub at runtime, you can do like this View inflatedView = viewStub.inflate(); TextView textViewInViewStub = inflatedView.findViewById(R.id.textInViewStub); textViewInViewStub.setText("ABC"); } viewStub.setVisibility(View.VISIBLE); } private void hideViewStub() { if (viewStub == null) { return; } viewStub.setVisibility(View.GONE); } }

Quiero usar ViewStub en Android, así que por favor ayúdenme. Yo he creado

ViewStub stub = new ViewStub; View inflated = stub.inflate();

¿Cómo usarlo programáticamente?


Como dice la documentation , ViewStub es una View que se infla infladamente.

Puede declarar una ViewStub en un archivo XML como este:

<ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />

El atributo android:layout es una referencia a la View que se inflará junto a una llamada de inflate() . Asi que

ViewStub stub = (ViewStub) findViewById(R.id.stub); View inflated = stub.inflate();

Cuando se invoca el ViewStub inflate() ViewStub se elimina de su elemento principal y se reemplaza con la View correcta (la vista raíz del diseño mySubTree ).

Si quieres hacer esto de forma programática, entonces tu código debería ser algo así como:

ViewStub stub = new ViewStub(this); stub.setLayoutResource(R.layout.mySubTree); stub.inflate();


Simplemente se usa ViewStub para aumentar la eficiencia del diseño de renderizado. Al usar ViewStub, se pueden crear vistas manualmente pero no agregarlas para ver la jerarquía. En el tiempo de ejecución, puede inflarse fácilmente, mientras que ViewStub está inflado, el contenido del viewstub será reemplazado por el diseño definido en el viewstub.

activity_main.xml definimos viewstub pero no se creó primero.

Un ejemplo simple da una mejor comprensión,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="create the view stub" /> <Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hide the stub." /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <ViewStub android:id="@+id/stub_import" android:layout_width="fill_parent" android:layout_height="fill_parent" android:inflatedId="@+id/content_import" android:layout="@layout/splash" /> </RelativeLayout> </LinearLayout>

En tiempo de ejecución, cuando inflemos, el contenido será reemplazado por el diseño definido en el viewstub.

public class MainActivity extends Activity { Button b1 = null; Button b2 = null; ViewStub stub = null; TextView tx = null; int counter = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.btn1); b2 = (Button) findViewById(R.id.btn2); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (stub == null) { stub = (ViewStub) findViewById(R.id.stub_import); View inflated = stub.inflate(); tx = (TextView) inflated.findViewById(R.id.text1); tx.setText("thanks a lot my friend.."); } } }); b2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (stub != null) { stub.setVisibility(View.GONE); } } }); }

Entonces, miremos de nuevo la jerarquía de vista,

cuando inflamos viewstub, se eliminará de la jerarquía de vistas.