Reputation: 3688
I have been trying to set text in a textView inside a fragment layout from the activity code that the fragment is instantiated in. I am getting a NullPointerException. It's been days and cannot fix it.
I have tried a few ways fro communicating data from activity to fragment... 1.) I first added the fragment in the activity. Then tried to access the corresponding textView (originally in the fragment layout) with FindViewByID(), in the activity layout (assuming now it is a part of my activity). I got NPE. 2.) I made setter methods in my Fragment class. Then i tried to call this method from activity class code. This also gives NPE.
Step 2 codes are below. Please help me what am i doing wrong.
Activity Code
public class DetailsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
// Show the Up button in the action bar.
setupActionBar();
//attach fragment
Details_fragment detailsFrag = new Details_fragment(); //initializes any fragments that may be used
//data is coming from the previous activity
Intent intent = getIntent();
NewsData temp = new NewsData();
temp.setHeadline(intent.getStringExtra("headline"));
temp.setDetails(intent.getStringExtra("details"));
temp.setImage_source(intent.getIntExtra("img_source", 1));
detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO
FragmentManager fManager = getFragmentManager(); //prepare fragment manager
FragmentTransaction fTransaction = fManager.beginTransaction();
// Add fragments using fTransaction and then commit
fTransaction.add(R.id.details_activity_container, detailsFrag, "frag_tag");
fTransaction.commit();
//get data from intent
//set data in fragment views by using the setter of fragment
}
}
**Error is on this line: ** detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO
that is when i comment this out, my app does not crash.
NOTE: I even tried to place these data setting code lines AFTER committing the fragment transaction. Same Error NPE
Fragment Code
public class Details_fragment extends Fragment {
NewsData display_data;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
display_data = new NewsData();
View view = inflater.inflate(R.layout.details, container, false);
return view;
}
public NewsData getDisplay_data() {
return display_data;
}
public void setDisplay_data(NewsData display_data) {
this.display_data = display_data;
TextView headline = (TextView) getView().findViewById(R.id.details_headline_view);
headline.setText(display_data.getHeadline());
TextView detail = (TextView) getView().findViewById(R.id.details_details_view);
detail.setText(display_data.getDetails());
ImageView image_thumb = (ImageView) getView().findViewById(R.id.details_img_view);
image_thumb.setImageResource(display_data.getImage_source());
}
public void onAttach(Activity activity) {
super.onAttach(activity);
}
}
ErrorLog
10-19 17:43:10.287: E/AndroidRuntime(9798): FATAL EXCEPTION: main
10-19 17:43:10.287: E/AndroidRuntime(9798): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wasae.newsapp/com.wasae.newsapp.DetailsActivity}: java.lang.NullPointerException
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.ActivityThread.access$600(ActivityThread.java:150)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.os.Looper.loop(Looper.java:213)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.ActivityThread.main(ActivityThread.java:5225)
10-19 17:43:10.287: E/AndroidRuntime(9798): at java.lang.reflect.Method.invokeNative(Native Method)
10-19 17:43:10.287: E/AndroidRuntime(9798): at java.lang.reflect.Method.invoke(Method.java:525)
10-19 17:43:10.287: E/AndroidRuntime(9798): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
10-19 17:43:10.287: E/AndroidRuntime(9798): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
10-19 17:43:10.287: E/AndroidRuntime(9798): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
10-19 17:43:10.287: E/AndroidRuntime(9798): at dalvik.system.NativeStart.main(Native Method)
10-19 17:43:10.287: E/AndroidRuntime(9798): Caused by: java.lang.NullPointerException
10-19 17:43:10.287: E/AndroidRuntime(9798): at com.wasae.newsapp.Details_fragment.setDisplay_data(Details_fragment.java:37)
10-19 17:43:10.287: E/AndroidRuntime(9798): at com.wasae.newsapp.DetailsActivity.onCreate(DetailsActivity.java:35)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.Activity.performCreate(Activity.java:5133)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-19 17:43:10.287: E/AndroidRuntime(9798): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230)
10-19 17:43:10.287: E/AndroidRuntime(9798): ... 12 more
UPDATE
After following the setArguments() methodology, i still get NPE
Activity Code
public class DetailsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
// Show the Up button in the action bar.
setupActionBar();
//attach fragment
Details_fragment detailsFrag = new Details_fragment(); //initializes any fragments that may be used
Intent intent = getIntent();
//SETTER METHOD - DOESNT WORK
// NewsData temp = new NewsData();
// temp.setHeadline(intent.getStringExtra("headline"));
// temp.setDetails(intent.getStringExtra("details"));
// temp.setImage_source(intent.getIntExtra("img_source", 1));
// detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO
Bundle dataBundle = new Bundle();
dataBundle.putCharSequence("headline", intent.getStringExtra("headline"));
dataBundle.putCharSequence("details", intent.getStringExtra("details"));
dataBundle.putInt("img_source", intent.getIntExtra("img_source", 1));
detailsFrag.setArguments(dataBundle);
FragmentManager fManager = getFragmentManager(); //prepare fragment manager
FragmentTransaction fTransaction = fManager.beginTransaction();
// Add fragments using fTransaction and then commit
fTransaction.add(R.id.details_activity_container, detailsFrag, "frag_tag");
//detailsFrag.setData();
fTransaction.commit();
//detailsFrag.setData();
}
}
Fragment Code
public class Details_fragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.details, container, false);
//get arguments
Bundle dataBundle = new Bundle();
dataBundle = this.getArguments();
TextView headline = (TextView) getView().findViewById(R.id.details_headline_view);
headline.setText(dataBundle.getString("headline"));
TextView detail = (TextView) getView().findViewById(R.id.details_details_view);
detail.setText(dataBundle.getString("details"));
ImageView image_thumb = (ImageView) getView().findViewById(R.id.details_img_view);
image_thumb.setImageResource(dataBundle.getInt("img_source"));
return view;
}
// public void setData() {
// Bundle dataBundle = new Bundle();
// dataBundle = this.getArguments();
//
// TextView headline = (TextView) getView().findViewById(R.id.details_headline_view);
// headline.setText(dataBundle.getString("headline"));
// TextView detail = (TextView) getView().findViewById(R.id.details_details_view);
// detail.setText(dataBundle.getString("details"));
// ImageView image_thumb = (ImageView) getView().findViewById(R.id.details_img_view);
// image_thumb.setImageResource(dataBundle.getInt("img_source"));
// }
public void onAttach(Activity activity) {
super.onAttach(activity);
}
}
Error Log
10-19 23:18:20.271: E/AndroidRuntime(29737): FATAL EXCEPTION: main
10-19 23:18:20.271: E/AndroidRuntime(29737): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wasae.newsapp/com.wasae.newsapp.DetailsActivity}: java.lang.NullPointerException
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.access$600(ActivityThread.java:150)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.os.Looper.loop(Looper.java:213)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.main(ActivityThread.java:5225)
10-19 23:18:20.271: E/AndroidRuntime(29737): at java.lang.reflect.Method.invokeNative(Native Method)
10-19 23:18:20.271: E/AndroidRuntime(29737): at java.lang.reflect.Method.invoke(Method.java:525)
10-19 23:18:20.271: E/AndroidRuntime(29737): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
10-19 23:18:20.271: E/AndroidRuntime(29737): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
10-19 23:18:20.271: E/AndroidRuntime(29737): at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
10-19 23:18:20.271: E/AndroidRuntime(29737): at dalvik.system.NativeStart.main(Native Method)
10-19 23:18:20.271: E/AndroidRuntime(29737): Caused by: java.lang.NullPointerException
10-19 23:18:20.271: E/AndroidRuntime(29737): at com.wasae.newsapp.Details_fragment.onCreateView(Details_fragment.java:23)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.Fragment.performCreateView(Fragment.java:1699)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:889)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1061)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.BackStackRecord.run(BackStackRecord.java:682)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1443)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.Activity.performStart(Activity.java:5142)
10-19 23:18:20.271: E/AndroidRuntime(29737): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2239)
10-19 23:18:20.271: E/AndroidRuntime(29737): ... 12 more
Upvotes: 1
Views: 1831
Reputation: 157437
the problem is that when you call detailsFrag.setDisplay_data(temp); //ERRONEOUS TODO
onCreateView
has not been yet called, and getView
returns null. You should use setArguments
, providing the data you want to show in your Fragment and retrieve those with getArguments
inside, onCreateView
for instance
Upvotes: 4