为什么在带有WebView的Fragment中软键盘无法显示

6
我正在使用兼容性包,并且我有一个Fragment在onCreateView中返回一个WebView。问题是,如果该片段未在Activity的onCreate期间添加,则当单击WebView中的文本框时,软键盘不会显示。如果在添加自定义 Web 片段后旋转设备并重新创建活动,则单击文本字段时显示软键盘。
仅为清楚起见,以下是两种不同的情况:
public void onCreate(Bundle state){
   if(state == null){
      WebFragment web = new WebFragment();
      getSupportFragmentManager.beginTransaction().add(android.R.id.content, web).commit();
   }
}



public void onClick(View v){
      WebFragment web = new WebFragment();
      getSupportFragmentManager.beginTransaction().add(android.R.id.content, web).commit();
}

在第一种情况下,在Activity onCreate方法中添加片段时,当点击文本字段时,片段中包含的WebView可以正常工作。然而,在第二个示例中,除非您在WebView显示后旋转设备,否则单击文本字段时不会发生任何事情。如果我必须为我的片段创建一个新活动才能使其正常工作,那么这有点违背了片段的初衷。是否有人可以提供一个解决方案?


@CommonsWare 感谢回复,我能够通过进行以下更改 http://pastebin.com/4WGhD0Mk 在您提供的项目中重现此错误。我没有平板电脑,所以无法在三倍痛苦设置上进行测试,但我的问题主要是针对手机的。 - Nathan Schwermann
@schwiz:我不知道res/layout/test.xml是什么,也不知道test()方法是如何被调用的。请考虑将演示问题的完整项目压缩成ZIP文件并发布到某个地方。 - CommonsWare
@schwiz:在您的样本代码上,软键盘在XOOM上表现得非常好。然而我能够在手机上复现您的问题,例如Nexus S和Droid X。我会尝试清理这个问题并提交一个错误报告。 - CommonsWare
@CommonsWare 谢谢确认!看来我现在只能使用一个活动,如果您能想到解决方法,请告诉我。如果我们可以在兼容包中得到修复就太好了。 - Nathan Schwermann
@CommonsWare 谢谢,我一定会关注这个的! - Nathan Schwermann
显示剩余3条评论
2个回答

12
将以下内容添加到Fragment的onCreateView方法中。
webview.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP:
                if (!v.hasFocus()) {
                    v.requestFocus();
                }
                break;
        }
        return false;
    }
});  

已测试通过安卓2.3.3和3.2.0。

基于问题 #7189StackOverflow


今天早上我看到了这个错误,需要试一下,谢谢! - Nathan Schwermann

0

同时RuslanK的解决方案对我也起作用了

创建一个继承自WebView的类

private class MyWebView extends WebView {

public MyWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
 }

// Note this!
@Override
public boolean onCheckIsTextEditor() {
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent ev)     {
    switch (ev.getAction())         {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_UP:
            if (!hasFocus())
                requestFocus();
        break;
    }

    return super.onTouchEvent(ev);
}
}

然后将您的视图添加到 XML 布局中:

<com.example.view.MyWebView
    android:id="@+id/vw"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

等等,在代码中...

MyWebView webView = (MyWebView) parent.findViewById(R.id.vw);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
webView.requestFocus(View.FOCUS_DOWN);
webView.loadUrl(url);

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