【问题标题】:HorizontalScrollView with EditText's scrolls when keyboard appear键盘出现时带有EditText滚动的Horizo​​ntalScrollView
【发布时间】:2015-03-05 13:36:39
【问题描述】:

我已经成功创建了一个包含多个动态元素/行的列表 (LinearLayout)。它充满了网络服务接收到的内容。 每行的一个元素是一个 Horizo​​ntalScrollView,它包含可变数量的 EditText 字段。

这意味着所有行(包括标题)的所有编辑文本都可以使用该水平滚动视图滚动。

滚动管理器将确保所有水平滚动视图同时移动。 所以它基本上是一个列表中的可滚动列。

我遇到的问题如下。

当我选择 EditText 视图时,它会显示键盘,这是我想要它做的。但是scrollManager被触发了,所以它会将所有的horizo​​ntalscrollviews滚动到最后。它不会将焦点集中的编辑文本保留在屏幕中,而是会移出视线。

我的 ScrollManager OnScrollChanged

@Override
    public void onScrollChanged(View sender, int l, int t, int oldl, int oldt) {
        // avoid notifications while scroll bars are being synchronized
        if (isSyncing)
            return;

        isSyncing = true;

        // remember scroll type
        if (l != oldl)
            scrollType = SCROLL_HORIZONTAL;
        else if (t != oldt)
            scrollType = SCROLL_VERTICAL;
        else {
            // not sure why this should happen
            isSyncing = false;
            return;
        }

        // update clients
        for (ScrollNotifier client : clients) {
            View view = (View) client;

            if (view == sender) 
                continue; // don't update sender

            // scroll relevant views only
            // TODO Add support for horizontal ListViews - currently weird things happen when ListView is being scrolled horizontally
            if ((scrollType == SCROLL_HORIZONTAL && view instanceof HorizontalScrollView)
                    || (scrollType == SCROLL_VERTICAL && view instanceof ScrollView)
                    || (scrollType == SCROLL_VERTICAL && view instanceof ListView)) {
                view.scrollTo(l, t);
            }
        }

        isSyncing = false;
    }

最后我希望键盘出现并且滚动视图能够滚动,但我想在键盘出现时阻止水平滚动事件。

【问题讨论】:

    标签: android android-softkeyboard horizontalscrollview onscrollchanged synchronized-scrolling


    【解决方案1】:

    我还没有对此进行测试,但是您应该能够通过将 OnTouchListener 设置为您的 EditText 并覆盖 OnTouch 方法来停止向 Horizo​​ntalScrollView 传播触摸事件:

    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        Log.i("OnTouch", "Fired On Touch in " + v.getId());
    
        // Do this on the down event too so it's not getting fired before up event
        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
           // Disallow ScrollView to intercept touch events.
           v.getParent().requestDisallowInterceptTouchEvent(true);
        }   
    
        //only do this on the up event so you're not doing it for down too
        if(event.getAction() == MotionEvent.ACTION_UP)
        {
           // Disallow ScrollView to intercept touch events.
           v.getParent().requestDisallowInterceptTouchEvent(true);
        }   
    
        //Keep going with the touch event to show the keyboard        
        v.onTouchEvent(event);
        return true;
    }  
    

    【讨论】:

    • @stackr 还在滚动吗?
    • 我的意思是视图静止执行不需要的滚动到滚动视图的末尾。但是滚动是由Android本身完成的。它发生在键盘外观上。所以滚动的不是触摸事件。当我在清单中放入“adjustNothing”时,它可以正常工作,但是它不再可能一直滚动到底部。
    • @stackr 应用我的编辑以确保滚动实际上没有发生在向下事件上,并确保 OnTouch 事件实际上被触发。如果不是,我们可能还有其他问题(很容易解决)。
    • 奇怪的是,当 EditText 不是 Gravity.Center 时,一切都按原样进行。但是我的老板要求采用不同的方法,所以这个问题现在不在讨论范围内了。+1 为你的努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多