Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use View Stub in android

I want to use ViewStub in android, so please help me. I have created

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

How to use it programmatically?

like image 418
posteritysystem Avatar asked Jul 20 '12 10:07

posteritysystem


People also ask

What is View Stub in android?

android.view.ViewStub. A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime. When a ViewStub is made visible, or when inflate() is invoked, the layout resource is inflated. The ViewStub then replaces itself in its parent with the inflated View or Views.

Why use ViewStub android?

Simply a ViewStub is used to increase efficiency of rendering layout. By using ViewStub, manually views can be created but not added to view hierarchy. At the runtime, can be easily inflated, while ViewStub is inflated, the content of the viewstub will be replaced the defined layout in the viewstub.

How do you merge on Android?

XML. Go to the app > res > layout > right-click > New > Layout Resource File and name the file as custom_layout. Below is the code for the custom_layout. xml and the file should be present with merge contents.

What is a ViewGroup?

ViewGroup is a collection of Views(TextView, EditText, ListView, etc..), somewhat like a container. A View object is a component of the user interface (UI) like a button or a text box, and it's also called a widget.


2 Answers

Like the documentation says, ViewStub is a View that is inflated lazily.

You can declare a ViewStub in an XML file like this:

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

The android:layout attribute is a reference to the View that will be inflated next to a call of inflate(). So

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

When the method inflate() is invoked the ViewStub is removed from its parent and replaced with the right View (the root view of mySubTree layout).

If you want to do this progammatically then your code should be something like:

ViewStub stub = new ViewStub(this); stub.setLayoutResource(R.layout.mySubTree); stub.inflate();  
like image 146
mneri Avatar answered Sep 24 '22 11:09

mneri


Simply a ViewStub is used to increase efficiency of rendering layout. By using ViewStub, manually views can be created but not added to view hierarchy. At the runtime, can be easily inflated, while ViewStub is inflated, the content of the viewstub will be replaced the defined layout in the viewstub.

activity_main.xml we defined viewstub but not created first.enter image description here

Simple example gives better understanding,

<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> 

At runtime, when we inflate, the content will be replaced with the layout defined in the 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);                 }              }         });      } 

enter image description here

So, Lets look at again the view hierarchy,

enter image description here

when we inflate the viewstub, it will be removed from the view hierarchy.

like image 42
huseyin Avatar answered Sep 24 '22 11:09

huseyin