转到ViewPager中的下一页

时间:2016-04-13 13:39:28

标签: android android-fragments android-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;
    }
}

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

6 个答案:

答案 0 :(得分:8)

在你的片段中写一个界面,如:

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;
        }
    }
}

答案 1 :(得分:2)

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

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片段的活动。

位置 - 当前片段的位置。

答案 2 :(得分:2)

对于 Kotlin ViewPager2

上一页:

val currPos: Int = xyzViewPager.currentItem
if (currPos != 0) {
   xyzViewPager.currentItem = currPos - 1
}

下一页:

val currPos: Int = xyzViewPager.currentItem
if ((currPos + 1) != xyzViewPager.adapter?.itemCount) {
    xyzViewPager.currentItem = currPos + 1
}

答案 3 :(得分:0)

您可以在活动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>

答案 4 :(得分:0)

您可以在父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并在那里管理它们。

答案 5 :(得分:0)

您可以在片段内点击按钮时发送广播,如下所示:

Intent intent = new Intent();
        intent.setAction(NUMBER_OF_RECEIVER_NEXT);
        getActivity().sendBroadcast(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 methd中为接收器添加一个intent过滤器,并将操作指定为NUMBER_OF_RECEIVER_NEXT