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问题。请问大神是咋回事。在此谢过大神!