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.