通过按钮点击更改ViewPager片段

11

我正在尝试通过点击一个按钮来更改viewpager片段。我有5个片段,每个片段都有自己的xml文件(frag1.xml、frag2.xml等)。每个片段都有5个按钮,应该转到viewpager的其他页面。但问题是如何在FragmentPageAdapter中检查哪个按钮被点击以及如何到达那里?

我将展示我拥有的代码,然后我认为它应该很清楚。将其看作具有底部点的主屏幕,当您单击某个点时,将转到相应的屏幕。

FragmentPagerAdapter

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

    final int PAGE_COUNT = 6;

    /** Constructor of the class */
    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int arg0) {

        switch(arg0){

        case 0:

            return new Fragment1();

        case 1:
            return new Fragment2();

        case 2:
            return new Fragment3();

        case 3:
            return new Fragment4();

        case 4:
            return new Fragment5();

        default:
            return null;

        }       
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {
        return PAGE_COUNT;
    }
}

Frag1.java

public class Frag1 extends Fragment {

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


        OnClickListener changeFrag = new OnClickListener() {            
            @Override
            public void onClick(View v) {
            /*When I click this button in my fragment, I'd like it to go to fragment 3 for example*/
            }
        };

        ImageButton btnT = (ImageButton) v.findViewById(R.id.frag3);
        btnT.setOnClickListener(changeFrag);

        return v;
    }
}

MainActivity

这段代码声明了一个名为MainActivity的Java类,它继承自FragmentActivity。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);/** Getting a reference to the ViewPager defined the layout file */
        ViewPager pager = (ViewPager) findViewById(R.id.pager);

        /** Getting fragment manager */
        FragmentManager fm = getSupportFragmentManager();

        /** Instantiating FragmentPagerAdapter */
        MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the pagerAdapter to the pager object */
        pager.setAdapter(pagerAdapter);

       //pager.setPageTransformer(true, new ZoomOutPageTransformer());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

这种情况可能发生吗?有人能帮我指明正确的方向吗?


请问如何从子片段更改ViewPager片段? - Putra Minang
3个回答

23

我不确定你关于“Change”说的具体是什么。

如果你想改变页面显示的索引,你可以尝试:

ViewPager.setCurrentItem(int pageIndex, boolean isSmoothScroll);

或者,如果您询问的是如何更改内容,这是我所做的

public class MyPagerAdapter extends FragmentStatePagerAdapter
{
  private FragmentManager fragMan;
  private ArrayList<Fragment> fragments=new ArrayList<Fragment>();

  public void clearAll() //You can clear any specified page if you want...
  {
    for(int i=0; i<fragments.size(); i++)
    fragMan.beginTransaction().remove(fragments.get(i)).commit();
    fragments.clear();
    fragments=new ArrayList<Fragment>();
    notifyDataSetChanged();
  }

  public void addList() //Add some new fragment...
  {
    listFrag=new ListFragment();
    fragments.add(list);
  }
}

希望能够帮到你~


确实,谈论更改页面显示索引。我应该把 ViewPager.setCurrentItem(int pageIndex, boolean isSmoothScroll); 放在哪里? - mXX
4
你有两种方法可以做到。1) 将你的ViewPager对象设置为public static,这样你就可以在任何Fragment中访问它。2) 将你的ViewPager留在FragmentActivity的成员中,从Fragment发送广播意图到FragmentActivity,并访问你的ViewPager对象。 - RRTW
mXX,能否提供一下修复此问题的代码?我也遇到了同样的问题,但是无法从我的片段中获取ViewPager。非常感谢! - Simon Rolin

6
我发布了一个新的答案,因为 - 从我所看到的 - 真正的答案在被接受的答案的评论中:
“你有两种方法可以做。1)将您的ViewPager对象设置为public static,这样您就可以在任何Fragment中访问它。2)将您的ViewPager保留为FragmentActivity的成员,在Fragment中发送广播意图到FragmentActivity,并访问您的ViewPager对象。- RRTW May 28 '13 at 2:18”
因此感谢RRTW提供的答案,但我想改进它。
1)不是一个选项。片段的目的是可重用的,因此它们需要独立于Activity。我认为将它们链接到活动是一种不好的实践,即使现在您没有在其他活动中重用它。

2) 听起来很不错,但我认为需要更多的解释。getAcitivty().sendBroadcast() 的目的是向用户系统中所有应用程序发送事件,这绝对不是你想要实现的。所以从我的角度来看,好的答案是使用LoacalBroadcastManager,并且你可以查看 该帖子 了解如何使用它。


静态公共分页器加1 - Skizo-ozᴉʞS ツ
感谢您的解释,我知道#1是一个糟糕的设计(只是为了一个时间紧迫的项目)。关于#2,正如您所说,它是LocalBroadcast(仅在您自己的应用程序中),我也在我的应用程序项目中使用它。把它称为Broadcast是我的错误。再次感谢您 :-) - RRTW

-1
在主函数中,只需将您的Viewpager设置为public,这样它就可以从其他Java文件(例如frag1.java)访问。

MainActivity.Java:

public static ViewPager pager;

现在,在frag1.java内的Onclick()函数中,只需调用您的mViewPager并将项目(片段)设置为您想要加载的任何片段即可。例如,如果您想加载下一个片段,则将其设置为2。

frag1.java

public void onClick(View v) {

    ViewPager.setCurrentItem(2);

}

将ViewPager在主活动中公开?我可以问一下,封装的原则呢?这将完全违反ViewPager的封装性。假设我从持有片段B的活动A转换到的活动C中调用它,在活动C中我们没有ViewPager,因此如果我们访问它,根据“访问范围”的概念,它不应该为空吗? - EvOlaNdLuPiZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接