WebView强制将我的ScrollView滚动到底部。

6

我有一个在ScrollView中的WebView,在Activity加载时,一旦WebView完成“loadData”,它就会强制将我的ScrollView滚动到底部(即WebView所在位置)。 我该如何防止这种情况发生? 我已经尝试过以下方法,但它会跳动屏幕,这并不是我想要的:

ScrollView scroll = (ScrollView)findViewById(R.id.detailsScroll);  
scroll.post(new Runnable()   
{  
    @Override  
    public void run()   
    {  
       ScrollView scroll = (ScrollView)findViewById(R.id.detailsScroll);  
       scroll.fullScroll(ScrollView.FOCUS_UP);  
    }  
});  

2
不应该在ScrollView中放置WebView。可滚动视图内部的可滚动视图无法正常工作。 - Falmarri
好的,如果Activity的内容比屏幕大,我该怎么做? - steve
这不正是Admob正在做的吗?似乎一旦内容加载完成,webview就会获得焦点,导致scrollview跳动。 - steve
1
@steve:“如果Activity的内容比屏幕大怎么办?”--你可以使用ScrollView,只需将WebView放在其外部。将屏幕的2/3分配给WebView,其余部分分配给ScrollView,或者其他什么方式。 - CommonsWare
@CommonsWare - 谢谢,这很有道理。我想我必须把它放在另一个Activity中,因为它太大了。 - steve
这不是有点不太理想吗?如果我想要WebView在ScrollView的“底部”,这样一旦用户完全滚动,就可以看到WebView,但仅限于此时呢? - powerj1984
4个回答

10

fhucho的答案可以停止Webview自动滚动到底部。但是这会导致使用跟踪球等辅助功能无法访问。所以我找到了一种改进方法:

public class MyScrollView extends ScrollView {

    @Override 
    public void requestChildFocus(View child, View focused) { 
        if (focused instanceof WebView ) 
           return;
    super.requestChildFocus(child, focused);
    }
}
希望这能有所帮助!

不幸的是,这会防止在 Webview 中单击输入字段时显示键盘。 - spatialist

5
使用以下方法创建自定义ScrollView:
@Override
public void requestChildFocus(View child, View focused) {
    if (child instanceof WebView) return;
}

2
为解决与焦点相关的问题,我发现以下方法更有效,在XML中将这些添加到您的WebView中:
    android:focusable="false"
    android:focusableInTouchMode="false"

对于实际提出的问题,只需将默认焦点设置为其他视图,而不是WebView,应该就可以解决该问题。我认为像我这样的其他人在尝试处理ScrollView中的WebView占用焦点时可能会找到此方法。将上述内容添加到XML中不会阻止WebView中的超链接工作。


1
请将以下内容添加到您的主要布局中:

android:descendantFocusability="blocksDescendants"


该属性可阻止子视图获取焦点。

这很有帮助。但最好将其添加到WebView的父级中。 - Sira Lam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接