Skip to content
Advertisement

Adding a linear layout in XML dynamically to another linear layout

Basically I created a separate XML containing a linear layout which contains a image and a textview, and I need this linear layout inside of another linear layout, where I need to add my first linear layout dynamically to the second linear layout.

First linear layout, a separate XML file :

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

    <LinearLayout
        android:id="@+id/storeLocation"
        android:layout_width="@dimen/settings_item_width"
        android:layout_height="@dimen/settings_item_height"
        android:layout_marginBottom="10dp"
        android:visibility="@integer/sales_order_settings_visibility"
        style="@style/dashboard_btn"
        android:onClick="onStoreLocationClick"
        android:clickable="true"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="@dimen/settings_item_image_container_width"
            android:layout_height="match_parent"
            android:gravity="center">

            <ImageView
                android:layout_width="@dimen/setting_item_image_size"
                android:layout_height="@dimen/setting_item_image_size"
                android:tint="@color/cherry_red_without_opacity"
                android:src="@drawable/ic_location_icon" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingRight="40dp"
            android:gravity="center|left">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Store Location"
                android:textColor="@color/white"
                android:textSize="@dimen/top_section_purchase_id_font" />

        </LinearLayout>
    </LinearLayout>


</LinearLayout>

Second linear layout, separate XML:

<LinearLayout
                            android:id="@+id/settingButtonHolder"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:gravity="center"
                            android:orientation="vertical">
</LinearLayout>

Android Studio code:

linearLayout = (LinearLayout) findViewById(R.id.settingButtonHolder);
            linearLayout2 = (LinearLayout) findViewById(R.id.storeLocation);
            linearLayout.addView(linearLayout2);

This doesn’t work, I am getting a null pointer exception :

12-16 16:48:52.402 21571-21571/io.apptizer.business.clover E/AndroidRuntime: FATAL EXCEPTION: main
    Process: io.apptizer.business.clover, PID: 21571
    java.lang.RuntimeException: Unable to start activity ComponentInfo{io.apptizer.business.clover/io.apptizer.pos.activity.ApplicationSettingsActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
        at android.view.ViewGroup.addView(ViewGroup.java:3353)
        at android.view.ViewGroup.addView(ViewGroup.java:3336)
        at io.apptizer.pos.activity.applicationSetting.ApplicationSettingsActivityCommon.onCreate(ApplicationSettingsActivityCommon.java:151)
        at io.apptizer.pos.activity.ApplicationSettingsActivity.onCreate(ApplicationSettingsActivity.java:78)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)

What can I try to resolve this?

Advertisement

Answer

One of the layouts must not exist as a view yet. If your activity or fragment is being built with settingButtonHolder layout then you need to inflate the other layout using a LayoutInflater.

Once you’ve used the LayoutInflater you will receive a view instance which you can use to add to your linearlayout in the place of linearLayout2. Until you’ve inflated your new layout, you will keep seeing NPEs because the views in that layout will not exist. You will have to use your inflated view instance (linearLayout2) to access the views, preferably through linearLayout2.findViewById(R.id.X).

Try this out and let me know if it has helped you at all, Panos.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement