我觉得这个问题已经有了答案,但我找不到答案。
我的布局中有一个ScrollView,它包含各种可点击的视图。
在特定条件下,我想禁用ScrollView及其所有子项的点击和事件。
以下内容没有帮助:
ScrollView.setEnabled(false)
ScrollView.setClickable(false)
ScrollView.setOnTouchListener(null)
以及:
(parent view of the ScrollView).requestDisallowInterceptTouchEvent()
我使用以下代码创建了一个自定义ScrollView:
public class StoppableScrollView extends ScrollView
{
private static boolean stopped = false;
public StoppableScrollView(Context context)
{
super(context);
}
public StoppableScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
if(stopped)
{
return true;
}
else
{
super.onInterceptTouchEvent(ev);
return false;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if(stopped)
{
return true;
}
else
{
super.onTouchEvent(ev);
return false;
}
}
public static void setStopped(boolean inBool)
{
stopped = inBool;
}
public static boolean getStopped()
{
return stopped;
}
}
仅使用onTouchEvent()将停止滚动,但不会停止点击子视图。
仅使用onInterceptTouchEvent()使得点击工作时滚动不会,反之亦然。
同时使用onTouchEvent()和onInterceptTouchEvent()可以在停止时为'true'成功停止对子视图的不必要点击,但无论停止状态如何,它都会禁用滚动。
是否有更简单的方法来获取此行为,或者是否有办法修改StoppableScrollView类以便它能正确处理这些触摸事件?
答案 0 :(得分:5)
可能应该有以下帮助(因为我有类似的问题):
在ScrollView中,您应该将RelativeLayout作为主子进程(ScrollView无论如何只接受1个主子进程)。这个RelativeLayout当然应该是两个方向上的fill_parent。
在RelativeLayout的真正末尾(在所有其他子节点之后),你现在可以放置一个透明背景(#00FFFFFF)的LinearLayout,它在两个方向上都有fill_parent。此LinearLayout应具有Visibility = View.GONE(默认情况下) 此外,您必须附加一个空的OnClickListener。现在,因为zOrder如果你使这个LinearLayout Visibility = View.Visible它将捕获所有事件并避免点击上面的孩子!
答案 1 :(得分:0)
由于scrollview允许immeditate一个孩子说在我的情况下我有线性布局。在这个线性布局我有其他的conreolls。
现在我们的第一个任务是获得这种线性布局,以便我们可以编写
LinearLayout l = (LinearLayout) scrollview.getChildAt(0);
现在,在获得此线性布局后,我们可以通过此代码轻松访问放置在其中的其他控件并禁用它。
for(int i =0; i<l.getChildCount(); i++)
{
Log.i(TAG,"child "+ l.getChildAt(i));
l.getChildAt(i).setEnabled(false);
}