通过按钮更改 viewpager 片段 Click

Posted

技术标签:

【中文标题】通过按钮更改 viewpager 片段 Click【英文标题】:Change viewpager fragment by a buttonClick 【发布时间】:2013-05-21 15:20:49 【问题描述】:

我正在尝试通过单击一个按钮来更改 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 扩展 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;
    

这样的事情可能吗?有人可以帮助我朝正确的方向前进吗?

【问题讨论】:

这样吗? ***.com/questions/39500413/… 【参考方案1】:

我不确定你对“改变”的确切说法。

如果你问的是改变页面显示索引,你可以试试

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); 你有两种方法可以做。 1)将您的 ViewPager 对象作为公共静态对象,以便您可以在任何 Fragment 中访问。 2) 让您的 ViewPager 作为 FragmentActivity 的成员,将广播意图从您的 Fragment 发送到 FragmentActivity,并访问您的 ViewPager 对象。 mXX,是否有可能获得允许您解决此问题的代码?我有同样的问题,但找不到从我的片段中获取 ViewPager 的方法。非常感谢!【参考方案2】:

我发布了一个新答案,因为 - 据我所知 - 真正的答案是对已接受答案的评论:

“您有两种方法可以做。1) 将您的 ViewPager 对象作为公共静态对象,以便您可以在任何 Fragment 中访问。2) 将您的 ViewPager 作为您的 FragmentActivity 的成员,从您的片段到 FragmentActivity,并访问您的 ViewPager 对象。– RRTW 2013 年 5 月 28 日 2:18"

感谢 RRTW 的回答,但我想改进它。

1) 不是一个选项。片段的目的是可重用,因此它们需要独立于 Activity。我认为将它们与活动联系起来是一种不好的做法,即使 - 目前 - 你没有在其他活动中重复使用它。

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

【讨论】:

加一个用于静态公共寻呼机 感谢您的解释,我知道#1 是一个糟糕的设计(仅适用于开发时间耗尽的项目)。关于#2,正如您所说,它是LocalBroadcast(仅在您自己的APP中),我也在我的APP项目中使用它。将其称为广播是我的错误。再次感谢您:-)【参考方案3】:

在 main 中只需调用使您的 Viewpager 公开,以便可以从其他 java 文件(例如来自 frag1.java)访问它

MainActivity.Java:

public static ViewPager pager;

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

frag1.java

public void onClick(View v) 

    ViewPager.setCurrentItem(2);


【讨论】:

“在主要活动中公开查看器”?请问,封装的原理呢?这将完全违反该浏览器。假设我从一个活动 C 调用它,该活动 C 是从包含片段 B 的活动 A 转换而来的,在活动 C 中我们没有 viewpager,所以如果我们访问它,它不应该基于“范围的概念”为 null访问”?

以上是关于通过按钮更改 viewpager 片段 Click的主要内容,如果未能解决你的问题,请参考以下文章

转到ViewPager中的下一页

更改片段中按钮的文本

导航抽屉的片段管理

检测片段内的 ViewPager 选项卡更改

检测片段内的 ViewPager 选项卡更改

底部导航片段中的 Viewpager2