Android - 如何禁用ScrollView和所有孩子

时间:2012-03-04 00:13:06

标签: android scrollview

  • 为清晰起见而编辑

我觉得这个问题已经有了答案,但我找不到答案。

我的布局中有一个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类以便它能正确处理这些触摸事件?

2 个答案:

答案 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);
}