2013-08-16 36 views
1

我正在编写一个使用webview来显示HTML文件的应用程序。当用户点击搜索此代码运行:Android - 将findOnPage实现为WebView

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 Browser中提供的解决方案,顶部栏成为搜索区域。

当我试图执行此操作时,我失败了。有没有一种方法可以正确地将其实施到Android应用程序的webview中?我想要比我目前使用的更优雅和功能性的设计。

谢谢所有回复

编辑

对于未来的用户,这个bug只在下列Android版本存在:

Platform Version  API Level VERSION_CODE 
Android 4.0.3, 4.0.4 15   ICE_CREAM_SANDWICH_MR1 
+0

我试图搜索Android源代码,看看如何我无法找到接下来会发生什么,我可以找到findOnPage()的唯一其他引用是在UI.java和browser.xml中,它们都不会导致我知道如何实现这一点 – user1363871

回答

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){} 
} 
+0

感谢您的解决方案,我几天前解决了这个问题对于我自己,但这段代码段肯定会帮助那些遭受这个问题的人。 – user1363871

+0

@ user1363871没问题!随意发放赏金,如果你认为这是有帮助的:) – Phil

+1

享受那赏金! – user1363871

0

我发现答案颠簸up我的最低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(); 
    } 
} 

的searcholdmethod是从原来的问题进行搜索。 。

+0

你会介意发布您的解决方案的代码? – MiStr

+0

我刚刚为您添加了它,祝您好运! – user1363871