问题
我有horizontalListView
向用户显示加载到ViewPager
的所有图片。它位于屏幕的底部。
我想要做的是horizontalListView
隐藏它不被使用超过5秒。
它应该如何运作:
horizontalListView
horizontalListView
上的内容并触发其阻止线程horizontalListView
上无所事事5秒后,它消失了现在如何运作:
horizontalListView
postDelayed
被解雇,让horizontalListView
消失了。CODE
HorizontalListView和Runnable
horizontalListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
hideViewHandler.removeCallbacks(mRunnable);
hideViewHandler.postDelayed(mRunnable,5*1000);
return true;
}
});
mRunnable = new StoppableRunnable() {
@Override
public void stoppableRun() {
hideAnimation();
}
};
在Image上设置的TapListener负责显示horizontalListView
private class TapGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
hListView.clearAnimation();
if (((ViewGroup.MarginLayoutParams) hListView.getLayoutParams()).bottomMargin < 0) {
expandAnimation();
hideViewHandler.postDelayed(mRunnable,5*1000);
} else {
hideAnimation();
}
return true;
}
}
答案 0 :(得分:1)
您必须在侦听器内部检查MotionEvent.ACTION_UP或MotionEvent.ACTION_CANCEL,才能在它们之后触发runnable。
您当前的代码是在任何事件上发布runnable,但您只想在用户停止使用该视图时才这样做。
BTW:如果从TouchListener返回true,则表示您已经使用了该事件,并且事件链将停止。很可能ScrollView甚至不会滚动,因为事件不会传播到它。
答案 1 :(得分:0)
你可以这样做......
yourScreenLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (horizontalListView.getVisibility() == View.INVISIBLE) {
horizontalListView.setVisibility(View.VISIBLE);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (horizontalListView.getVisibility() == View.VISIBLE)
horizontalListView.setVisibility(View.INVISIBLE);
}
}, 5000);
} else {
horizontalListView.setVisibility(View.INVISIBLE);
}
}
});
答案 2 :(得分:0)
我认为问题的根源可能是在removeCallbacks
之前调用postDelayed
。
清除队列后,线程本身就被触发了。
答案 3 :(得分:0)
我自己设法解决了这个问题。
<强> FIX 强>
我的onTouchListener
无法正常工作的主要原因是它根本没有被触发。 <{1}}适配器内的OnClickListener
正在消耗触发器。
现在我传递了horizontalListView
内点击发生的信息,并用不同的方法做了所有事情。