我的应用看起来像这样:
基本上是一个用于放置片段和底部导航视图的FrameLayout。现在,我想在HomeFragment中实现右滑动手势(选择“主页”选项卡时)。但是该片段托管了一个RecyclerView。要添加右滑动,我正在使用:
public class OnSwipeTouchListener implements View.OnTouchListener {
private final GestureDetector gestureDetector;
public OnSwipeTouchListener (Context ctx){
gestureDetector = new GestureDetector(ctx, new GestureListener());
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
private final class GestureListener extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
onSwipeRight();
} else {
onSwipeLeft();
}
result = true;
}
}
else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
result = true;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return result;
}
}
public void onSwipeRight() {
}
public void onSwipeLeft() {
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
}
当我将此触摸侦听器添加到RecyclerView时,滚动不会顺利进行。我不知道背后的原因。请说明您是否拥有。
现在,请提出我应该怎么做才能解决该问题。还有其他方法可以设置触摸侦听器和手势侦听器,以便不会妨碍滚动以及我可以检测到向右滑动手势。
作为一种解决方法,我尝试在recyclerview上方设置一个完整的透明视图,该视图可以检测到手势,但是recyclerview不会滚动。
答案 0 :(得分:1)
尝试在 onCreateViewHold()中展开的视图上设置侦听器。像
public @NonNull
RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_message, parent, false);
view.setOnTouchListener(new OnSwipeTouchListener(view.getContext()));
return new ItemViewHolder(view);
}
从RecyclerView本身中删除侦听器。
答案 1 :(得分:0)
我不确定自己想要什么,但是可以在Android片段中使用向左或向右滑动功能。您可以使用MainActivity中的viewPager.setCurrentItem()将当前页面设置为最后一页。 ViewPager是允许用户向左或向右滑动以查看全新屏幕的小部件。我希望这可以帮助你。
答案 2 :(得分:0)
您只需使用ViewPager更改FrameLayout,然后为滑动操作添加侦听器
将FrameLayout更改为ViewPager
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@id/tab_layout"/>
实施PagerAdapter
public class PagerAdapter extends FragmentStatePagerAdapter {
int fragmentNumber;
public PagerAdapter(FragmentManager fm, int fragmentNumber) {
super(fm);
this.fragmentNumber = fragmentNumber;
}
/**
* Return the Fragment associated with a specified position.
*
* @param position
*/
@Override
public Fragment getItem(int position) {
switch (position) {
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;
}
}
/**
* Return the number of views available.
*/
@Override
public int getCount() {
return fragmentNumber;
}
}
MainActivity逻辑
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = findViewById(R.id.pager);
final PagerAdapter adapter = new PagerAdapter
(getSupportFragmentManager(), 5); //Change the number based on the number of Fragments you have
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// put your scrolling logic here. use positionOffset and position to determine the next destination
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
您还可以将viewPager与bottomNavigation连接以保持一致性 并可以根据您的具体情况改进这些代码:跳过不可见片段的轨迹,而不是扭曲它们.....
我希望这对您有所帮助。