私は最近この問題に遭遇しました、そして私の場合、私は二次的なバグ修正がこの問題を引き起こしていることをなんとか理解することができました。
したがって、webviewを拡張するカスタムクラスを作成しなかった場合、このandroidバグレポートの提案により、onCheckIsTextEditorをオーバーライドして常にtrueを返します...ここで読むのをやめます。
それを行った場合、この修正はHTCによってすでに実装されているようであり、何らかの理由でフォーカスを受け取ったときにクラッシュします。この問題は、ビューにタッチイベントを配置するときと、ビューの可視性を設定するときの2つの場所で明らかになりました。私のプロジェクトでは、WebViewClientを設定し、ページの読み込みが完了するまで待ってから、Webビューの可視性を表示に設定しました。これにより、次のスタックトレースが発生しました。
java.lang.NullPointerException at android.webkit.WebView.navHandledKey(WebView.java:9353)
at android.webkit.WebView.requestFocus(WebView.java:7910)
at android.view.View.requestFocus(View.java:3718)
at android.view.View.requestFocus(View.java:3696)
at android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1803)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474)
at android.view.View.setFlags(View.java:4680)
at android.view.View.setVisibility(View.java:3163)
setVisibility呼び出しをtry/catchでラップすることにより、タッチイベントをオーバーライドする必要があるかどうかを判断できました。イベントをキャッチした場合、それはオーバーライドを無効にする必要があることを意味します。これは私がしたことの例です:
try {
webView.setVisibility(View.VISIBLE);
} catch (NullPointerException e) {
Log.i(TAG, "Error setting webview visibility due to overriding focus. It will be disabled.");
webView.setOverrideOnCheckIsTextEditor(false);
// Confirm window is visible
webView.setVisibility(View.VISIBLE);
}
私のカスタムWebビューは次のようになり、最後の2つの方法に特別な注意が払われました。
/**
* When using a webview in a dialog, there are issues relating to the keyboard not appearing when focusing on a text box.
* This overrides a function to ensure the keyboard is shown when focusing on a text box in a webview.
* See link for bug report and solution.
*
* @see http://code.google.com/p/android/issues/detail?id=7189
* @see http://stackoverflow.com/questions/12325720
* @author James O'Brien
* @since 10/16/2012
*/
public class FocusableWebView extends WebView {
private boolean mOverrideCheckIsTextEditor = true;
/**
* Default Constructor
*
* @param context
*/
public FocusableWebView(Context context) {
super(context);
}
/**
* Default Constructor
*
* @param context
* @param attrs
*/
public FocusableWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Default Constructor
*
* @param context
* @param attrs
* @param defStyle
*/
public FocusableWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onCheckIsTextEditor() {
if (mOverrideCheckIsTextEditor) {
return true;
} else {
return super.onCheckIsTextEditor();
}
}
/**
* Enable/Disable overriding of onCheckIsTextEditor to always return true.
*/
public void setOverrideOnCheckIsTextEditor(boolean foo) {
mOverrideCheckIsTextEditor = foo;
}
}
申し訳ありませんが、これで問題が解決する理由について詳しく説明することはできません。私が推測できるのは、フォーカスに関連し、動的に無効にすることでうまくいくと思います:)
**更新(12/11/12)**
上記の両方の問題を解決することができました。これは、Webビューの焦点に関する問題のようでした。私のコードは次のようになります
webView.setVisibility(View.VISIBLE);
webView.setFocusable(true);
webView.requestFocus();
focusable属性を明示的に「true」に設定するか、setFocusable(true)を呼び出すことをお勧めします。