solalito
solalito

Reputation: 1209

Access variable from within a fragment

I have a main activity consisting of three tabs with each its corresponding fragment. In each of the fragment, there is one textview. Also, I am using ViewPager to help me navigate through the tabs.

When I try to access a TextView from within a fragment, I get a NULL POINTER error. Here is my code:

Fragment 1 (tab1):

public class FragmentA extends Fragment{
TextView tv1;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View parentView = inflater.inflate(R.layout.fragment_a, container, false);

    //******* Error Here **********
    tv1 = (TextView) getView().findViewById(R.id.fragAtv1);


    return parentView;
}

}

Main Activity:

public class SwipeTabs extends FragmentActivity implements TabListener{

ViewPager viewPager;
ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.main_swipe);

    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(new MySwipeAdapter(getSupportFragmentManager()));
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int tab_pos) {
            actionBar.setSelectedNavigationItem(tab_pos);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

    // Initialize action bar with tabs
    actionBar = setupActionBar();
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction arg1) {

}
@Override
public void onTabSelected(Tab tab, FragmentTransaction arg1) {
    viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction arg1) {

}

private ActionBar setupActionBar(){
    ActionBar newAB = getActionBar();
    newAB.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tab1 = newAB.newTab();
    tab1.setText("Tab 1");
    tab1.setTabListener(this);
    newAB.addTab(tab1);

    ActionBar.Tab tab2 = newAB.newTab();
    tab2.setText("Tab 2");
    tab2.setTabListener(this);
    newAB.addTab(tab2);

    ActionBar.Tab tab3 = newAB.newTab();
    tab3.setText("Tab 3");
    tab3.setTabListener(this);
    newAB.addTab(tab3);

    return newAB;
}
}

class MySwipeAdapter extends FragmentStatePagerAdapter{
//Construstor: retuns the 
public MySwipeAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = null;
    switch(position){
    case 0:
        fragment = new FragmentA();
        break;
    case 1:
        fragment = new FragmentB();
        break;
    case 2:
        fragment = new FragmentC();
        break;
    }
    return fragment;
}
@Override
public int getCount() {
    return 3;
}

}

Upvotes: 0

Views: 503

Answers (2)

A--C
A--C

Reputation: 36449

You can't access getView() and get a non-null value before onCreateView() returns. That doesn't make sense logically. Instead, do this:

tv1 = (TextView) parentView.findViewById(R.id.fragAtv1);

You could also override onViewCreated() but this is simpler.

Upvotes: 2

Ahmed
Ahmed

Reputation: 3260

Instead of using getView.findviewbyId try parentView.findViewById.

tv1 = (TextView) parentView.findViewById(R.id.fragAtv1);

Upvotes: 1

Related Questions