我的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;
}
}
更多信息: 我必须将导航按钮保留在片段本身而不是活动中。
答案 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