Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Warning: This <FrameLayout> can be replaced with a <merge> tag

Tags:

I have a FrameLayout that contains a TextView and two LinearLayouts:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent" >       ... a textview and 2 linearlayouts   </FrameLayout> 

After running Android Lint, I get this warning: This <FrameLayout> can be replaced with a <merge> tag.

Why does this warning exist? What can I do to fix it (other than ignore)?

like image 369
Oleksiy Avatar asked Jan 31 '14 19:01

Oleksiy


People also ask

What is FrameLayout?

Android Framelayout is a ViewGroup subclass that is used to specify the position of multiple views placed on top of each other to represent a single view screen. Generally, we can say FrameLayout simply blocks a particular area on the screen to display a single view.

How do you merge on Android?

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 merge XML?

MergeXML merges the XML sources (files, strings, objects) into single DOM XML object. The merging is performed recursively on the node level adding new elements and replacing existing ones. The nodes with the same path/name are replaced/added sequentially and the modification can be controlled by the options.

Why is FrameLayout used?

Frame Layout is designed to block out an area on the screen to display a single item. Generally, FrameLayout should be used to hold a single child view, because it can be difficult to organize child views in a way that's scalable to different screen sizes without the children overlapping each other.


1 Answers

To understand this, you need to understand how layouts are inflated and placed.

Let's say for example, you have an activity and this is the layout xml you use. Here is what the layout of the activity looks before you put your layout file.

<FrameLayout> // This is the window     <FrameLayout> // This is activity     </FrameLayout> </FrameLayout> 

There might be few other layers depending on the device/OS.

Now when you inflate your layout file and put it in, this is how it will look.

<FrameLayout> // This is the window     <FrameLayout> // This is activity             //A textview and 2 linearlayouts     </FrameLayout> </FrameLayout> 

Do you see the FrameLayout inside the other FrameLayout? It is redundant to have that since it does not add much value. To optimize, you can replace your outer FrameLayout with the <merge> tag. This is what it will look like.

<merge> // This is the window     <FrameLayout> // This is activity             //A textview and 2 linearlayouts     </FrameLayout> </merge> 

Notice how there is no extra FrameLayout. Instead, it is just merged with the FrameLayout of the activity. Whenever you can, you should use <merge>. This doesn't only apply to FrameLayouts. You can read more about it here. http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge

Hope this helps.

like image 149
Aswin Rajendiran Avatar answered Oct 17 '22 20:10

Aswin Rajendiran