转到ViewPager中的下一页
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转到ViewPager中的下一页相关的知识,希望对你有一定的参考价值。
我的MainActivity中有一个ViewPager
。其中的每一页都是片段。因此,每次向右或向左滑动时,都会创建一个新的片段实例,并相应地更新片段视图。
我还有两个按钮:LEFT
和RIGHT
用于导航。这些按钮位于片段内,而不在活动中。用户可以滑动或者按相关按钮在页面之间导航。
问题在于:由于我正在通过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中的下一页的主要内容,如果未能解决你的问题,请参考以下文章