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.