1

我正在编写一个使用 webview 来显示 HTML 文件的应用程序。当用户单击搜索时,将运行此代码:

public void search() {   
    container = (LinearLayout)findViewById(R.id.layoutId);

    nextButton = new Button(this);   
    nextButton.setText("Next");   
    nextButton.setOnClickListener(new OnClickListener(){   
        @Override  
        public void onClick(View v){   
            mWebView.findNext(true);   
        }   
    });   
    container.addView(nextButton); 

    closeButton = new Button(this);   
    closeButton.setText("Close");   
    closeButton.setOnClickListener(new OnClickListener(){   
        @Override  
        public void onClick(View v){   
            container.removeAllViews();   

        }   
    });   
    container.addView(closeButton);   

    findBox = new EditText(this);   
    findBox.setMinEms(30);   
    findBox.setSingleLine(true);   
    findBox.setHint("Search");   

    findBox.setOnKeyListener(new OnKeyListener(){   
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event){   
            if((event.getAction() == KeyEvent.ACTION_DOWN) && ((keyCode == KeyEvent.KEYCODE_ENTER))){   
                mWebView.findAll(findBox.getText().toString());   

                try{   
                    Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);   
                    m.invoke(mWebView, true);   
                }catch(Exception ignored){}   
            }   
            return false;   
        }   
    });

}

我使用的代码运行良好,Android 4.0 中存在一些错误。我想要一个 Android 浏览器中提供的解决方案,其中顶部栏成为搜索区域。

当我试图实现这一点时,我失败了。有没有办法将它正确地实现到 Android 应用程序的 web 视图中?我想要一个比我目前使用的更优雅、更实用的设计。

谢谢大家的回复

编辑

对于以后的用户,这个bug只存在于以下Android版本中:

Platform Version        API Level   VERSION_CODE
Android 4.0.3, 4.0.4    15          ICE_CREAM_SANDWICH_MR1
4

2 回答 2

2

其他帖子(例如thisthis讨论了这个问题。从这些来源得出我的答案,这样的事情应该可以解决问题:

try{   
    Method m = WebView.class.getMethod("findAllAsync", new Class<?>[]{String.class});
    m.invoke(mWebView, findBox.getText().toString());  
} catch(Throwable notIgnored){
    mWebView.findAll();
    try {
        m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE);   
        m.invoke(mWebView, true); 
    } catch (Throwable ignored){}
} 
于 2013-08-23T14:10:16.460 回答
0

我发现答案是提高我的最低 SDK 版本并添加一些代码。现在我可以删除上面的搜索代码。

编辑

这是我发现效果最好的代码,注意:这在 SDK 版本 15 中没有突出显示,如上所述。据我所知,没有解决方法。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle your other action bar items...
    int itemId = item.getItemId();
    if (itemId == R.id.Search) {
            search();
    } else if (itemID == R.id.yourstuff){
              blah blah blah
               }
            }

我的 search() 方法:

@SuppressLint("NewApi")
public void search() {

        if (Build.VERSION.SDK_INT >= 11) {
            if (wv != null) {
                wv.showFindDialog(null, true);
            }
        else {
            searchOldMethod();
        }
    } else {
        Toast.makeText(atcSectionWeb.this,
                "Please purchase premium to use this feature.",
                Toast.LENGTH_SHORT).show();
    }
}

searchold 方法是从原始问题中搜索。

于 2013-08-20T10:27:20.690 回答