Android定义了一个ViewPager对象,在一个public函数中访问时变为了null

public class MerchantActivity extends FragmentActivity {

private RadioGroup discount_layout;
/**
 * 选桌位
 */
private RadioButton table_rb;
/**
 * 点菜
 */
private RadioButton dish_rb;
/**
 * 已选菜品
 */
private RadioButton selected_rb;
/**
 * 下划线标记
 */
private View table_line, dish_line, selected_line;
/**
 * 选菜Fragment
 */
private DishFragment dishFragment;
/**
 * 选桌位Fragment
 */
private TableFragment tableFragment;
/**
 * 已选菜Fragment
 */
private BillFragment billFragment;

private ViewPager pager;

//Fragment集合
private ArrayList<Fragment> fragments;

/**
 * 标题名集合
 */
private RadioButton[] titleText = null;

/**
 * 接口定义
 */
private  Fragment2Fragment fragment2Fragment;

// private Commercial commercial;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_merchant);
    initView();
}

private void initView() {
    pager = (ViewPager) findViewById(R.id.pager);
    discount_layout = (RadioGroup) findViewById(R.id.discount_layout);
    table_rb = (RadioButton) findViewById(R.id.table_rb);
    dish_rb = (RadioButton) findViewById(R.id.dish_rb);
    selected_rb = (RadioButton) findViewById(R.id.selected_rb);
    table_line = findViewById(R.id.table_line);
    dish_line = findViewById(R.id.dish_line);
    selected_line = findViewById(R.id.selected_line);

    titleText = new RadioButton[]{table_rb, dish_rb, selected_rb};
    discount_layout.setOnCheckedChangeListener(listener);

    fragments = new ArrayList<Fragment>();
    dishFragment = new DishFragment();
    tableFragment = new TableFragment();
    billFragment = new BillFragment();
    fragments.add(tableFragment);
    fragments.add(dishFragment);
    fragments.add(billFragment);

    MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments);
    pager.setAdapter(fragmentPagerAdapter);
    fragmentPagerAdapter.setFragments(fragments);
    pager.setOnPageChangeListener(new MyOnPageChangeListener());
    // 第一次启动时选中第0个tab
    pager.setCurrentItem(0);
    pager.setOffscreenPageLimit(2);
    if(pager == null)
    {
        Log.d("pager In initView!", "Pager is NULL!");
    }
}

private RadioGroup.OnCheckedChangeListener listener = new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        switch (i) {
            case R.id.table_rb:
                pager.setCurrentItem(0);
                break;
            case R.id.dish_rb:
                pager.setCurrentItem(1);
                if(pager != null)
                {
                    Log.d("pager In RadioGroup!!", "Pager isn't NULL!");
                }
                break;
            case R.id.selected_rb:
                pager.setCurrentItem(2);
                break;
        }
        if(pager == null)
        {
            Log.d("pagerLater In RadioGroup!", "Pager is NULL!");
        }
    }
};


/**
 * 切换更换下划线状态
 *
 * @param position
 */
private void setVisible(int position) {
    switch (position) {
        case 0:
            table_line.setVisibility(View.VISIBLE);
            dish_line.setVisibility(View.INVISIBLE);
            selected_line.setVisibility(View.INVISIBLE);
            break;
        case 1:
            table_line.setVisibility(View.INVISIBLE);
            dish_line.setVisibility(View.VISIBLE);
            selected_line.setVisibility(View.INVISIBLE);
            break;
        case 2:
            table_line.setVisibility(View.INVISIBLE);
            dish_line.setVisibility(View.INVISIBLE);
            selected_line.setVisibility(View.VISIBLE);
            break;
    }
}

/**
 * 设置选中图标的文字颜色与
 * 下划线可见
 *
 * @param index
 */
private void chingeIndexView(int index) {
    for (int i = 0; i < titleText.length; i++) {
        titleText[i].setChecked(false);
    }
    if (index < titleText.length) {
        titleText[index].setChecked(true);
    }

}


private class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
    private ArrayList<Fragment> fragments;
    private FragmentManager fm;

    public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
        super(fm);
        this.fm = fm;
        this.fragments = fragments;
    }

    @Override
    public int getCount() {
        return fragments.size();
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }


    public void setFragments(ArrayList<Fragment> fragments) {
        if (this.fragments != null) {
            FragmentTransaction ft = fm.beginTransaction();
            for (Fragment f : this.fragments) {
                ft.remove(f);
            }
            ft.commit();
            ft = null;
            fm.executePendingTransactions();
        }
        this.fragments = fragments;
        notifyDataSetChanged();
    }


    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        Object obj = super.instantiateItem(container, position);
        return obj;
    }

}

public class MyOnPageChangeListener implements ViewPager.OnPageChangeListener {

    @Override
    public void onPageSelected(int position) {
        chingeIndexView(position);
        setVisible(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

    @Override
    public void onPageScrolled(int position, float positionOffset,
                               int positionOffsetPixels) {
    }
}

public interface Fragment2Fragment{
    public void gotoFragment(ViewPager viewPager);
}

public void setFragment2Fragment(Fragment2Fragment fragment2Fragment){
    this.fragment2Fragment = fragment2Fragment;
}

public void forSkip(){//在这个方法中pager对象为null,在其他的方法中都可以正常使用
    if(pager == null)
    {
        Log.d("pager In forSkip!", "Pager is NULL!");
    }
    if(fragment2Fragment!=null && pager != null){
        fragment2Fragment.gotoFragment(pager);
    }
}

}
这是Activity类,其中包含了三个Fragment,三个Fragment都有一个共同的Activity而Activity通过其Viewpager的setCurrentItem(int position)可以设置显示第几个Fragment。所有在Activity中定义一个内部接口,并把要具体执行跳转的方法封装在这个接口中,并设置一个参数即可以具体设置显示哪个Fragment的ViewPager:

public interface Fragment2Fragment{
public void gotoFragment(ViewPager viewPager);
}

同时再该Activity中定义一个该接口类型的成员变量,并为其设置setter方法。

private Fragment2Fragment fragment2Fragment;
public void setFragment2Fragment(Fragment2Fragment fragment2Fragment){
this.fragment2Fragment = fragment2Fragment;
}

最后再给该Activity设置一个调用此接口中定义此方法的方法:

public void forSkip(){
if(fragment2Fragment!=null){
fragment2Fragment.gotoFragment(viewPager);
}
}

Fragment端的代码:
FragmentA :
在Fragment中可以通过getActivity()获取来Activity。然后我们给该Activity注入其定义的Fragment2Fragment的变量fragment2Fragment此时我们必须实现Fragment2Fragment接口中定义的方法即具体的跳转方法,参数是ViewPager所以此时你可以设置你想要跳转到哪个Fragment中:

final MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.setFragment2Fragment(new MainActivity.Fragment2Fragment() {
@Override
public void gotoFragment(ViewPager viewPager) {
//fragment传递数据
mainActivity.setFragmentArgu(string);
viewPager.setCurrentItem(0);
}
});
mainActivity.forSkip();

最后通过该Activity调用其中的forSkip方法,此时就会执行Fragment2Fragment接口的实现类的gotoFragment方法,这个方法由子类实现,这样就完成了两个Fragment的点击跳转。

我参照http://blog.csdn.net/canot/article/details/50533516这篇博客写的。

但是出现了了问题。就是pager为null问题。请问大神是咋回事。在此谢过大神!

4个回答

这是你的pager没有访问到

有时间我也参照着写一个。。。。。

05-14 20:39:23.893: D/pager In forSkip!(11319): Pager is NULL!
05-14 20:39:23.893: D/pager In TestPager!(11319): Pager is NULL!
这是我的log文件。

知道原因了,是因为我在使用时每次都是新创建一个对象,所以这个对象里的数据都是空的,可以使用getAcitivity()获取已存在,有数据的MainActivity()对象,然后调用。
还有一种解决方法就是使用代理模式,新建一个接口,然后让MainAcitivity这个类实现这个接口,然后在Fragment里调用此接口。来达到使用MainAcitivity类的方法的目的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!