ainkiwi
ainkiwi

Reputation: 61

Getting null while passing data through a bundle from Activity to Fragment

Losing data on the way when passing it through bundle, i get

Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference at String bundlePassData = this.getArguments().getString("tagName");

Here it's a sample of my code. MainActivity->

 tagsView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Bundle bundle = new Bundle();
            TextView textView = (TextView) view.findViewById(R.id.tagName);
            String selectedItemName = textView.getText().toString();
            bundle.putString("tagName", selectedItemName);

            TaskAssignFragment taskAssignFragment = new TaskAssignFragment();
            taskAssignFragment.setArguments(bundle);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.commit();

            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new TaskAssignFragment()).addToBackStack(null).commit();

            Log.i("ListView", selectedItemName);
        }
    });

TaskAssignFragment->

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_task_assign, container, false);
    TextView test = view.findViewById(R.id.testerView);

    String bundlePassData = this.getArguments().getString("tagName");
    test.setText(bundlePassData);

    return view;
}

Should I try interfaces? But if i would i need the data as a variable, not in only a function, because i would use it in more places in my fragment.

Upvotes: 0

Views: 413

Answers (4)

Ankit
Ankit

Reputation: 307

You are making a new object while replacing fragment.

        TaskAssignFragment taskAssignFragment = new TaskAssignFragment();
        taskAssignFragment.setArguments(bundle);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                taskAssignFragment).addToBackStack(null).commit();

Try this out

Upvotes: 0

Shanto George
Shanto George

Reputation: 994

tagsView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Bundle bundle = new Bundle();
            TextView textView = (TextView) view.findViewById(R.id.tagName);
            String selectedItemName = textView.getText().toString();
            bundle.putString("tagName", selectedItemName);

            TaskAssignFragment taskAssignFragment = new TaskAssignFragment();
            taskAssignFragment.setArguments(bundle);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.commit();

            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    taskAssignFragment).addToBackStack(null).commit();

            Log.i("ListView", selectedItemName);
        }
    });

Please try this code, you create a new instance of TaskAssignFragment() and pass it without arguments

Upvotes: 0

Manohar
Manohar

Reputation: 23384

In your code You are creating new fragment when replacing.

TaskAssignFragment taskAssignFragment = new TaskAssignFragment();
            taskAssignFragment.setArguments(bundle);

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    new TaskAssignFragment()).addToBackStack(null).commit();

use the fragment instance you already created in which you set arguments

  getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                   taskAssignFragment).addToBackStack(null).commit();

Upvotes: 1

Boken
Boken

Reputation: 5447

You can call method directly on fragment e.g:

TaskAssignFragment taskAssignFragment = new TaskAssignFragment();
// Call here your own method (from fragment)
taskAssignFragment.setSelectedItemName(selectedItemName);

And in your fragment:

public void setSelectedItemName(String selectedItemName) {
    // Store data as field in class
    this.selectedName = selectedItemName
}

where selectedName is field in your class.

Upvotes: 0

Related Questions