Layout inflation is the term used within the context of Andr

CSDN学院讲师招募Markdown编辑器 轻松写博文学院课程好不好你说了算!读文章说感想 获好礼企业高端研修班培训直通车

Layout inflation is the term used within the context of Android to indicate when an XML layout resou

分类:Android

AndroidLayoutInflater

Layout inflation is the term used within the context of Android to indicate when an XML layout resource is parsed and converted into a hierarchy of View objects.

It’s common practice in the Android SDK, but you may be surprised to find that there is a wrong way to useLayoutInflater, and your application might be one of the offenders. If you’ve ever written something like the following code usingLayoutInflater in your Android application:

inflater.inflate(R.layout.my_layout,null);

PLEASE read on, because you’re doing it wrong and I want to explain to you why.

Get to Know LayoutInflater

Let’s first take a look at how LayoutInflater works. There are two usable versions of theinflate() method for a standard application:

inflate(intresource, ViewGroup root)

inflate(intresource, ViewGroup root, booleanattachToRoot)

The first parameter points to the layout resource you want to inflate. The second parameter is the root view of the hierarchy you are inflating the resource to attach to. When the third parameter is present, it governs whether or not the inflated view is attached to the supplied root after inflation.

It is these last two parameters that can cause a bit of confusion. With the two parameter version of this method,LayoutInflater will automatically attempt to attach the inflated view to the supplied root. However, the framework has a check in place that if you passnull for the root it bypasses this attempt to avoid an application crash.

Many developers take this behavior to mean that the proper way to disable attachment on inflation is by passingnull as root; in many cases not even realizing that the three parameter version ofinflate() exists. By doing things this way, we also disable another very important function the root view has…but I’m getting ahead of myself.

Examples from the Framework

Let’s examine some situations in Android where the framework expects you as a developer to interactively inflate portions of the view.

Adapters are the most common case for using LayoutInflater is custom ListView adapters overridinggetView(), which has the following method signature:

getView(intposition, View convertView, ViewGroup parent)

Fragments also use inflation often when creating views via onCreateView(); notice its method signature:

onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

Have you noticed that every time the framework wants you to inflate a layout, they also pass you the parentViewGroup it will eventually be attached to? Notice also that in most cases (including the above two examples), it will throw an Exception later on ifLayoutInflater is allowed to automatically attach the inflated view to the root.

So why do you suppose we are given this ViewGroup if we are not supposed to attach to it? It turns out the parent view is a very important part of the inflation process because it is necessary in order to evaluate theLayoutParams declared in the root element of the XML being inflated. Passing nothing here is akin to telling the framework “I don’t know what parent this view will be attached to, sorry.”

The problem with this is android:layout_xxx attributes are always be evaluated in the context of the parent view.As a result, without any known parent, all LayoutParams you declared on the root element of your XML tree will just get thrown away, and then you’ll be left asking “why is the framework ignoring the layout customizations I defined? I’d better check SO and then file a bug.”

Without LayoutParams, the ViewGroup that eventually hosts the inflated layout is left to generate a default set for you. If you are lucky (and in many cases you are) these default parameters are the same as what you had in XML…masking the fact that something is amiss.

Application Example

So you claim you’ve never seen this happen in an application? Take the following simple layout that we want to inflate for aListView row:

R.layout.item_row

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<LinearLayoutxmlns:android=""

android:layout_width="match_parent"

android:layout_height="?android:attr/listPreferredItemHeight"

android:gravity="center_vertical"

android:orientation="horizontal">

<TextView

android:id="@+id/text1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:paddingRight="15dp"

android:text="Text1"/>

<TextView

android:id="@+id/text2"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:text="Text2"/>

</LinearLayout>

We want to set the height of our row to be a fixed height, in this case the preferred item height for the current theme…seems reasonable.

However, when we inflate this layout the wrong way

1

2

3

4

5

6

7

public View getView(int position, View convertView, ViewGroup parent) {

if(convertView == null) {

convertView = inflate(R.layout.item_row,null);

}

returnconvertView;

}

we end up with a result that looks like this

前有阻碍,奋力把它冲开,运用炙热的激情,

Layout inflation is the term used within the context of Andr

相关文章:

你感兴趣的文章:

标签云: