English 中文(简体)
How to specify id when uses include in layout xml file
原标题:

In my layout xml file, I have included other layout xml file (each with a different android id).

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>

But when I run it in the emulator, and start Hierarchy Viewer, each of the layout still shows NO_ID , and in my code, I have findViewById(R.id.test1) and findViewById(R.id.test2) both returns null.

Can anyone please help me with my problem ?

问题回答

Specify the ID in the <include>

<include layout="@layout/test" android:id="@+id/test1" />

Then use two findViewById to access fields in the layout

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);

Using that approach, you can access any field in any include you have.

I found out, that if you are using <merge> tag in your include layout, then the ID of include transfers to the merge tag which is not real view.

So either remove merge, or replace it with some layout.

Tor Norbye wrote:

The <include> tag is not a real view, so findByView will not find it. The @id attribute (and any other attributes you ve set on the include tag) gets applied on the root tag of the included layout instead. So your activity.getView(R.id.included1) should in fact be the <TextView> itself.

Romain Guy indicates that you can override the ID of an included layout by putting an android:id attribute inside the <include> tag.

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />

I think the top answer misses the most important point and might mislead people into thinking the <include/> tag creates a View that holds the include contents.

The key point is that include s id is passed to the root view of the include s layout file.

Meaning that this:

// activity_main.xml
<include layout="@layout/somelayout" android:id="@+id/someid"/>

// somelayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

Becomes this:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

yes is like this, but careful when the layout inserted in include field is a custom one and you want to access that root layout. That layout in this case @layout/test test, is actually returned in first line.

test test1View = (test)findViewById(R.id.test1);
  1. you must set id each include tag
  2. included child element set a new id. if you look how to generate new id, look at this entry: https://stackoverflow.com/a/15442898/1136117

Problem is we try to use id which is not declared in current layout file. Instead of declaring again, id can be simply referred using @+id/. If you refactor original id name through Android Studio it does refactor in included layout as well.

<include layout="@layout/toolbar"/>

<TextView
    android:id="@+id/txt_description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

In a case of using <RecyclerView> find the id of <include> by using an instance of inflated view or else it will return null.

public class ViewHolder extends RecyclerView.ViewHolder {

        private mTextView;

        public ViewHolder(View view) {
            super(view);
            View include_1 = view.findViewById(R.id.include_1);
            mTextView = (TextView) include_1.findViewById(R.id.text_id);
        }
    }

If you have set id to either root tag of included layout then you can use that id or you can set id to included layout.

But you can not set id to both it may throw exception.

<include layout="@layout/view_contact_name" android:id="+id/test1"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

Or

<include layout="@layout/view_contact_name"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:id="@+id/llBottomMainView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

When talking about include you either have an id on the root view inside the included layout file or on the include line itself and not on both. For example:

<include layout="@layout/layout1" android:id="@+id/layout1"/>

Layout 1 file

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout2">

</RelativeLayout>

The above example is wrong because technically you have two id s declared for the same layout. So what you have to do is pick which element will have the id.

To specify the id when you are including a xml file is like setting it to any xml element

Example:

*list_layout.xml*
`<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rvNames"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>`


*activity_main.xml*
`<RelativeLayout
      tools:context=".MainActivity">

      <include
          layout="@layout/list_layout"
          android:id="@+id/myList" />
</RelativeLayout>`

Now if you want to get that to use in .kt file, just use normally findViewById

Exemplo

*MainActivity.kt*

`val myList: RecycleView = findViewById(R.id.myList)`

Wow, I can t believe this question doesn t have the right answer yet. It s simple tags suck. You can only change things that start with android:layout_ which android:id doesn t match. So the answer is you can t. Sorry. What you can do instead is create a class that will be a ViewGroup which will inflate the included views inside, then add that as a tag in your layout, but that s about it.





相关问题
Android - ListView fling gesture triggers context menu

I m relatively new to Android development. I m developing an app with a ListView. I ve followed the info in #1338475 and have my app recognizing the fling gesture, but after the gesture is complete, ...

AsyncTask and error handling on Android

I m converting my code from using Handler to AsyncTask. The latter is great at what it does - asynchronous updates and handling of results in the main UI thread. What s unclear to me is how to handle ...

Android intent filter for a particular file extension?

I want to be able to download a file with a particular extension from the net, and have it passed to my application to deal with it, but I haven t been able to figure out the intent filter. The ...

Android & Web: What is the equivalent style for the web?

I am quite impressed by the workflow I follow when developing Android applications: Define a layout in an xml file and then write all the code in a code-behind style. Is there an equivalent style for ...

TiledLayer equivalent in Android [duplicate]

To draw landscapes, backgrounds with patterns etc, we used TiledLayer in J2ME. Is there an android counterpart for that. Does android provide an option to set such tiled patterns in the layout XML?

Using Repo with Msysgit

When following the Android Open Source Project instructions on installing repo for use with Git, after running the repo init command, I run into this error: /c/Users/Andrew Rabon/bin/repo: line ...

Android "single top" launch mode and onNewIntent method

I read in the Android documentation that by setting my Activity s launchMode property to singleTop OR by adding the FLAG_ACTIVITY_SINGLE_TOP flag to my Intent, that calling startActivity(intent) would ...

From Web Development to Android Development

I have pretty good skills in PHP , Mysql and Javascript for a junior developer. If I wanted to try my hand as Android Development do you think I might find it tough ? Also what new languages would I ...

热门标签