转到ViewPager中的下一页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转到ViewPager中的下一页相关的知识,希望对你有一定的参考价值。

我的MainActivity中有一个ViewPager。其中的每一页都是片段。因此,每次向右或向左滑动时,都会创建一个新的片段实例,并相应地更新片段视图。

我还有两个按钮:LEFTRIGHT用于导航。这些按钮位于片段内,而不在活动中。用户可以滑动或者按相关按钮在页面之间导航。

问题在于:由于我正在通过MainActivity更改视图,如何在Activity中检测这些按钮的onClick事件以更新片段?

这是PagerAdapter类(删除了所有无关的代码):

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        // logic part for the views.

        return PlaceholderFragment.newInstance(sectionNumber, questionStatus, questionOrder, showNext, showPrevious);
    }

这是PlaceHolderFragment类:

public class PlaceholderFragment extends Fragment{

    //some global variables

    public static PlaceholderFragment newInstance(int sectionNumber, int questionStatus, String questionOrder, boolean showNext, boolean showPrevious) {
        PlaceholderFragment fragment = new PlaceholderFragment();

        //setting up the arguments
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {

    }

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

        //code for filling up all the views

        RightButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //can I do something here?
            }
        });

        return rootView;
    }
}

更多信息:我必须将导航按钮保留在片段本身而不是活动中。

答案

在你的片段中写一个接口,如:

public class PlaceholderFragment extends Fragment{
        private OnButtonClickListener mOnButtonClickListener;

        interface OnButtonClickListener{
        void onButtonClicked(View view);
        }

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                mOnButtonClickListener = (OnButtonClickListener) context;
            } catch (ClassCastException e) {
                throw new ClassCastException(((Activity) context).getLocalClassName()
                            + " must implement OnButtonClickListener");
            }
        }

        yourButtons.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mOnButtonClickListener.onButtonClicked(v);
            }
        });
     }   

在你的主要活动中:

class MainActivity extends AppCompatActivity implements   OnButtonClickListener{

    @Override
    void onButtonClicked(View view){
        int currPos=yourPager.getCurrentItem();

        switch(view.getId()){

            case R.id.leftNavigation:
            //handle currPos is zero
            yourPager.setCurrentItem(currPos-1);
            break;

            case R.id.rightNavigation:
            //handle currPos is reached last item
            yourPager.setCurrentItem(currPos+1);
            break;
        }
    }
}
另一答案

在您的活动中制作公共方法

public void swipeRight(int x){
    if(x < totalNumberOfFragment){
        viewPager.setCurrentItem(x + 1);
    }
}

public void swipeLeft(int x){
    if(x > 0){
        viewPager.setCurrentItem(x - 1);
    }
}

您可以从片段按钮的单击操作中调用这些方法

RightButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Yes 
            ((YourActivityClassName)getActivity()).swipeRight(position);
        }
    });

并为LeftButton做同样的事情

YourActivityClassName - 持有此viewPager片段的Activity。

位置 - 当前片段的位置。

另一答案

您可以在活动xml中添加按钮,如下所示

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >

        <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        </android.support.v4.view.ViewPager>
    </LinearLayout>

    <ImageView
        android:id="@+id/leftNavigation"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:padding="10dp"
        android:src="@drawable/ic_chevron_left_black_24dp"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/rightNavigation"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:layout_weight="0"
        android:gravity="center"
        android:padding="10dp"
        android:src="@drawable/ic_chevron_right_black_24dp" />
  </FrameLayout>
另一答案

您可以在父Activity中创建特殊方法,如下所示:

public class PagerActiviy extends Activity {
    ...
    public void onFragmentNavigationButtonClick(View button) {
        // Do your stuff here
    }
    ...
}

然后在你的片段中你可以用Activity方法获得你的父getActivity(),将它转换为实际类型并调用方法:

public class PlaceholderFragment extends Fragment{

...
...

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

        //code for filling up all the views

        RightButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((PagerActvity) getActivity()).onFragmentNavigationButtonClick(v);
            }
        });

        return rootView;
    }
}

作为旁注,我应该在您的示例中添加它,但不清楚为什么您需要将导航按钮保留在片段中,并且无法将它们移动到Activity并在那里管理它们。

另一答案

你可以点击片段内的按钮点击发送广播,如下所示:

Intent intent = new Intent();
        intent.setAction(NUMBER_OF_RECEIVER_NEXT);
        getActivity().sendBroadcast(intent);

然后在主活动中捕获Intent并将寻呼机的当前位置设置为所需的数字

private class broadcastReceived extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String actionGet = intent.getAction();
            if(actionGet.equals(NUMBER_OF_RECEIVER_NEXT)){

                mPager.setCurrentItem(1);
                Log.e("IntentNextPage","Received");
            }
        }
    }

别忘了设置一个

private static final String NUMBER_OF_RECEIVER_NEXT = "nextPage";

在主要活动和片段中,当然要注册,取消注册接收器到onResume和onPause方法。

还要在onCreate方法中向接收器添加intent过滤器,并将操作指定为NUMBER_OF_RECEIVER_NEXT

以上是关于转到ViewPager中的下一页的主要内容,如果未能解决你的问题,请参考以下文章

如何跳转到 PrintDocument 的下一页?

修改子项时 ViewPager2 转到第一页

转到外部 Flash 动作脚本 3 中的下一帧

scrapy如何获取动态数据的下一页url?

页面设置中“分页符”和“下一页”的区别是啥?

自定义分页和过滤在反应 js 中不起作用