Reputation: 75
I am using a tabed view in my application...
my code...
public class ComboGraph extends AppCompatActivity {
Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_combo_graph);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
Button next = (Button) findViewById(R.id.button8);
final TextView textView = (TextView) findViewById(R.id.textView22);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText(textView.getText().toString() + "a");
ExpensesGraph expensesGraph=(ExpensesGraph)getSupportFragmentManager().findFragmentById(R.id.fragment1);
expensesGraph.textView.setText("Hello");
}
});
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new ExpensesGraph(), "Expenses");
adapter.addFragment(new IncomeGraph(), "Income");
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
ExpenseGraph.java
public class ExpensesGraph extends Fragment {
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_epenses_graph, container, false);
textView = (TextView) view.findViewById(R.id.textview_fragment);
return view;
}
}
Error log
java.lang.NullPointerException: Attempt to read from field 'android.widget.TextView com.pocketdiary.ExpensesGraph.textView' on a null object reference at com.gloesolutions.pocketdiary.ComboGraph$1.onClick(ComboGraph.java:44)
I need to change the textview fromexpensgraph
activities value from combograph
button click. Every method i tried getting null point error.
How can i solve this issue.?
Upvotes: 0
Views: 1031
Reputation: 29
you may create two methods getter and setter in activity eg. public String getDataToPass(){return requiredtext;} , public void setDataToPass(String requiredtext){ this.requiredtext = requiredtext;} , and onClick in fragment button, pass data to activity method eg. btn.onClick(){getActivity().setDataToPass("your text");}, finally on next fragment OnViewCreated : get text as String text = getActivity().getDataToPass();
Upvotes: 0
Reputation: 1386
Create a BaseFragment for both ExpensesGraph and IncomeGraph like below
public abstract class BaseFragment extends Fragment {
public abstract void updateComponent();
}
In Activity Button Onclick
Button next = (Button) findViewById(R.id.button8);
final TextView textView = (TextView) findViewById(R.id.textView22);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
(BaseFragment)viewPageAdaptor.getItem(0)).updateComponent();
}
});
Inside the ExpensesGraph and IncomeGraph Fragments you need to update the TextView accordingly. Same call back if you want it in all fragment make it inside the loop.
Inside the Fragment
public class ExpensesGraph extends BaseFragment {
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_epenses_graph, container, false);
textView = (TextView) view.findViewById(R.id.textview_fragment);
return view;
}
public void updateComponent(){
if(textView != null){
textView.setText("Update your text Here")
}
}}
Upvotes: 3
Reputation: 1740
you should call on replace method here mFragmentList.add(fragment);
since there is a possibility that onCreateView
on your fragment will not be reinitialize
Upvotes: 1