简体   繁体   中英

Change textView value in viewpager from Activity

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 from expensgraph activities value from combograph button click. Every method i tried getting null point error. How can i solve this issue.?

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")
   }
}}

you should call on replace method here mFragmentList.add(fragment); since there is a possibility that onCreateView on your fragment will not be reinitialize

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM