Reputation: 61
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
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
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
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
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