inflate in merge

10,800

Solution 1

The merge tag should be used in the inflated layout, it merges itself inside the parent ViewGroup.

Try this :

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

    <com.osmgames.kartuves.LinesLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/lines" />

</FrameLayout >

and this :

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

    <ImageView   
         android:layout_width="40dp" 
         android:layout_height="40dp"
         android:layout_gravity="center" 
         android:layout_marginTop="75dp" 
         android:layout_marginRight="40dp"
         android:src="@drawable/line" />

    <ImageView   
         android:layout_width="40dp" 
         android:layout_height="40dp"
         android:layout_gravity="center" 
         android:layout_marginTop="75dp" 
         android:src="@drawable/line" />

    <ImageView   
         android:layout_width="40dp" 
         android:layout_height="40dp"
         android:layout_gravity="center" 
         android:layout_marginTop="75dp" 
         android:layout_marginLeft="40dp"
         android:src="@drawable/line" />
</merge>

Hope it will help

Solution 2

use

    View headerView = View.inflate(this, R.layout.layout_name, null);
    lv.addHeaderView(headerView);

to inflate your layout it will give you your parent layout in which all views are present then typecast it or if you want to add then add it directly to another layout.

Solution 3

You should better use

58 FrameLayout item = (FrameLayout)findViewById(R.id.lines);
59 View child = getLayoutInflater().inflate(R.layout.letters3, item, false);
60 item.addView(child);

or you can use

58 FrameLayout item = (FrameLayout)findViewById(R.id.lines);
    59 View child = getLayoutInflater().inflate(R.layout.letters3, item, true);

when you pass true it will automatically do the things for you.

which would be one less view instead of that useless FrameLayout you are adding in place of merge tag.

Share:
10,800
Kęstas Venslauskas
Author by

Kęstas Venslauskas

Updated on June 04, 2022

Comments

  • Kęstas Venslauskas
    Kęstas Venslauskas almost 2 years

    Hi I'm trying to inflate my layout with <merge> tag here is my main.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <com.osmgames.kartuves.LinesLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/lines" />
    
    </merge>
    

    This is my LinesLayout.java:

    public class LinesLayout extends FrameLayout {
    
        public LinesLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
        }
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            super.onInterceptTouchEvent(event);
            return false;
        }
    }
    

    And my main.java:

    public class main extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }}
    

    So I want to inflate the XML below to main.xml. How can I do that?

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent">
    
        <ImageView   
             android:layout_width="40dp" 
             android:layout_height="40dp"
             android:layout_gravity="center" 
             android:layout_marginTop="75dp" 
             android:layout_marginRight="40dp"
             android:src="@drawable/line" />
    
        <ImageView   
             android:layout_width="40dp" 
             android:layout_height="40dp"
             android:layout_gravity="center" 
             android:layout_marginTop="75dp" 
             android:src="@drawable/line" />
    
        <ImageView   
             android:layout_width="40dp" 
             android:layout_height="40dp"
             android:layout_gravity="center" 
             android:layout_marginTop="75dp" 
             android:layout_marginLeft="40dp"
             android:src="@drawable/line"  />
    </FrameLayout>
    

    This is log I'm getting:

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.osmgames.kartuves/com.osmgames.kartuves.InGame}: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)
    
    Caused by: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
    at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
    at **com.osmgames.kartuves.InGame.onCreate(InGame.java:59)**
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    ... 11 more
    

    InGame.java:59 is :

    58 FrameLayout item = (FrameLayout)findViewById(R.id.lines);
    59 View child = getLayoutInflater().inflate(R.layout.letters3, null);
    60 item.addView(child);