Abdul Wasae
Abdul Wasae

Reputation: 3688

Set TextView in Fragment from Activity

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

Answers (1)

Blackbelt
Blackbelt

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

Related Questions