我发现以下问题:Android:FragmentActivity内的FragmentActivity(NavigationBar中的ScrollView)。但是,我的问题是关于如何使用事务显示片段以及以安全方式启用滑动手势检测的问题。注意:我发布的答案中有一个链接(这也是使用事务显示容器中片段的有效方法,包括两种情况)。请看。我已经尝试过一些事情,但是通过使用支持ViewPager而不是嵌套的片段:
详细信息:https : //moqups.com/[email protected]/lc0ZOERO/p : a5d7b55eb
现在,我要实现的是仅对右[从左到右]滑动使用滑动手势来完成上面的第三点。
我为此使用了GestureListener和SimpleOnGestureListener以及活动的OnTouchEvent。
我面临的问题是:
此手势在活动屏幕上位于片段下方的部分和活动的一部分上起作用。我想要手势工作
我尝试了以下课程,并在这样的布局中更改了我的活动片段。
我的手势和触摸侦听器扩展了框架布局:
public class OnSwipeTouchListener extends FrameLayout {
private final GestureDetector gestureDetector;
private static final String TAG = "OnSwipeTouchListener";
private Context context;
public OnSwipeTouchListener(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
gestureDetector = new GestureDetector(context, new GestureListener());
setClickable(true);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(motionEvent);
return super.onTouchEvent(event);
}
private final class GestureListener extends 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();
}
}
} else {
if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
onSwipeBottom();
} else {
onSwipeTop();
}
}
}
} catch (Exception exception) {
//see that e1 is null
}
return result;
}
}
public void onSwipeRight() {
///manage my back stack history here.
}
public void onSwipeLeft() {
}
public void onSwipeTop() {
}
public void onSwipeBottom() {
}
}
然后将框架布局更改为此类参考:
<path.to.my.package.OnSwipeTouchListener
android:id="@+id/activity_frag_frame_layout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="invisible" >
<fragment
android:id="@+id/activity_frag1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="path.to.my.package.fragments.Activity_Frag1"
android:tag="act_frag1" />
</path.to.my.package.OnSwipeTouchListener>
它对我没有多大帮助,所以应该对您找到解决方案有所帮助。在其中一个片段中有一个searchView停止工作,并且没有单击起作用。如果您获得了我想要实现的目标,请在这方面提供帮助。
更新1:在onTouchEvent和onInterceptTouchEvent中都返回true具有所需的效果,但是它阻止了SearchView所在的片段中的单击,在可单击的视图中没有单击起作用。仅划动有效。更新:在我的最新文章中:我也完全放弃了使用事务后退堆栈,因为我依赖于我自定义的后退堆栈,其中我维护所有选项卡的导航历史记录。我确实使用ViewPager和FragmentStatePagerAdapter给出的setCurrentTab和onTabSelected方法。
更新2:这个很难实现:检查哪些事件需要拦截,哪些事件要传递给子视图:http : //developer.android.com/training/gestures/viewgroup.html
更新3:
在我的活动布局中,有一个视图寻呼机,在它下面的每个框架布局中,都有一个片段。
启动应用程序时,ViewPager在第一个选项卡中显示片段。
单击此片段上的按钮时,将显示视图分页器下面的帧布局中的一个片段,并将其添加到我的自定义后台堆栈中。
当按下返回键时,此片段再次被隐藏,以在视图寻呼机中显示选项卡片段。以上所有步骤均已完成。只有我想要从左到右的滑动手势才能工作,我发现可以通过拦截触摸事件来做到这一点。但它根本不执行此操作。当我返回true时,只有滑动手势有效,否则,该操作将被取消并且对该片段的单击有效。
我在http://mobi-app-dev.blogspot.in/2014/01/android-transactions.html中提到了此答案。
检查哪些事件需要拦截以及哪些事件需要传递给子视图:http : //developer.android.com/training/gestures/viewgroup.html
现在,我不再在贴有片段的帧布局中使用我的滑动手势侦听器,而是在相对布局(即片段的根视图)上使用它。
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean intercepted = super.onInterceptTouchEvent(event);
// In general, we don't want to intercept touch events. They should be
// handled by the child view.
gestureDetector.onTouchEvent(event);
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean touched = super.onTouchEvent(event);
gestureDetector.onTouchEvent(event);
return touched;
}
以下是我在活动中使用片段时要遵循的一些技巧:
[注意:如果您正在使用FragmentStatePagerAdapter,则可以使用在同一选项卡中的方式,在要用作该适配器数据的片段列表中的特定索引处,用另一个片段替换另一个片段。但是它的内容被更改而没有更改选项卡。然后使用notifyDataSetChanged()。在这里,您不使用事务,但是您可以使用]。
提示:添加滑动功能时请多加注意,因为还有其他可单击的视图。在RootView上使用拦截触摸轻扫,返回false,但分析触摸。
还有一件事:您应该观察到一次在一个容器中放置一个片段可以解决另一个问题:如果有两个片段,一个在另一个容器的顶部,则来自一个片段的点击将转到下面的另一个片段。因此,隐藏或替换一次只能有一个片段。Back-Stack帮助维护导航级别,并且在更改或更新配置时,尝试更新目标活动片段的相同实例,而不是进行事务处理,因为这会改变导航片段的顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句