Android UI – Inflate from XML (Dynamic UI Creation)
Join the DZone community and get the full member experience.
Join For Free
We have seen that we can declare User
Interface in Android through XML or we can even
create the UI Programmatically. Now, we will see how we can mix the two and
use it for building dynamic User Interfaces. One example of such a case would
be when on a particular action of the user on one of the UI elements, you need
more UI elements to appear on the same screen. How do we achieve this?
You can do it in two ways:
- The dynamic part of the UI can be created programmatically. However we saw in my earlier tutorial that it is not a very good way to mix UI and code. So, we can...
- Define the dynamic UI too as an XML and use XML inflation to include it into the existing UI.
We will see how to do the 2nd way, which probably is a good practice too.
As always, again a very simple example.
Assume I have a very simple linear layout. In that I want to include a button.
I can do it as part of the mail XML itself. However, assume that this button is
supposed to be reused in many activities and hence I have defined it as a
separate XML. How do I include it into the main XML?
So, here is the main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout1" > </LinearLayout> Here is the buttons.xml that is also created in the res/layout folder: <?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/button_small_left" style="?android:attr/buttonStyleSmall" android:text="Press to close" android:layout_width="wrap_content" android:layout_height="wrap_content"/> And here is the Activity’s onCreate(…) method of the InflateView class: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); Button b = (Button)inflater.inflate(R.layout.buttons, null); lLayout = (LinearLayout)findViewById(R.id.layout1); lLayout.addView(b);
First 3 lines must be familiar. In the 4th
line, I am getting a handle to the LayoutInflater through the getSystemService(…) method. This inflater has a
method inflate to which I pass the buttons.xml by passing the parameter R.layout.buttons. Then, I try to append this button to the Linear Layout that
already exists and is set as the view in line 2 setContentView(R.layout.main). How to append? I get a handle to the LinearLayout
lLayout and add the new button to it in the last line!
That simple to inflate an XML and append it
to an existing view!
However, I have gone ahead and added
another bit to this program as shown below:
b.setOnClickListener(new OnClickListener() { public void onClick(View v) { //restrict to adding only 1 textview child element if (lLayout.getChildAt(2) == null) { TextView tv = (TextView)inflater.inflate(R.layout.text, null); lLayout.addView(tv); } } });
On the click of this dynamically added
button, I am showing how we can add more to the UI dynamically through
inflation. Assume, on the click of the button, you want to show some new text.
This TextView is defined in another XML called text.xml which is
also in the res/layout folder.
So, I am inflating from this XML and
appending it to the LinearLayout view. So, a lot can be achieved for dynamic UI through inflation.You can download the complete sample code here.
XML
Android (robot)
Published at DZone with permission of Sai Geetha M N, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Trending
-
Effective Java Collection Framework: Best Practices and Tips
-
Writing a Vector Database in a Week in Rust
-
Comparing Cloud Hosting vs. Self Hosting
-
RBAC With API Gateway and Open Policy Agent (OPA)
Comments