【问题标题】:Android - Implement findOnPage into a WebViewAndroid - 将 findOnPage 实现到 WebView
【发布时间】:2013-08-16 15:17:50
【问题描述】:

我正在编写一个使用 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 应用程序的 webview 中?我想要一个比我目前使用的更优雅、更实用的设计。

感谢大家的回复

编辑

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

Platform Version        API Level   VERSION_CODE
Android 4.0.3, 4.0.4    15          ICE_CREAM_SANDWICH_MR1

【问题讨论】:

  • 我已经尝试搜索 Android 源代码以了解这是如何完成的,但我找不到接下来会发生什么。我能找到的关于 findOnPage() 的唯一其他参考是 UI.java 和 browser.xml。这些都没有导致我在其他任何地方了解如何实现这一点。

标签: java android browser android-webview


【解决方案1】:

其他帖子(例如 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){}
} 

【讨论】:

  • 感谢您的解决方案,我在几天前为自己解决了这个问题,但这个代码段肯定会帮助其他遇到问题的人。
  • @user1363871 没问题!如果您认为这有帮助,请随时提供赏金:)
  • 我改变了我对你的回答,这是正确的实现,因为 showFindDialog 已被贬值。不过我很好奇,如果你还在身边,你知道这会是一个多么漂亮的实现——在操作栏中显示搜索栏而不是放在 web 视图中的按钮?我一直在寻找,但没有找到与我所寻找的完全一样的东西。
  • @user1363871 这听起来像是一个单独的问题 - 所以您可能想在其他地方发布它。但是,我会想象一个简单的示例,包括使用SearchView(developer.android.com/guide/topics/search/…),并覆盖搜索查询方法以使用上述 findAllAsync 方法。我自己还没有这样做,但是已经创建了几个在操作栏中使用 Android SearchView 的应用程序。
【解决方案2】:

我发现答案是提高我的最低 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 方法是从原始问题中搜索。

【讨论】:

  • 我刚刚为你添加了它,祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2023-02-01
相关资源
最近更新 更多