2013-08-16 32 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