2016-07-07 1 views
-1

Когда я звоню webView.findAll(word);, он показывает все вхождения как выбрано, и webView.findNext(true) также показывает другой цвет фона, но не прокручивает страницу до следующего выбранного слова.Android WebView findnext не прокручивает до следующего выбранного слова

Мне нужно вручную прокрутить страницу, чтобы увидеть выбранные слова. Я ожидаю, что всякий раз, когда я звоню webView.findNext(true), он должен автоматически прокручивать страницу до следующего слова. Я использую устройство Android 6.0. Я также пробовал с webView.findAllAsync(word);. Но я не могу прокрутить страницу webView до выбранного слова. Пожалуйста помоги!

EDIT:

расположение файла:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white" > 

    <WebView android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/tv_for_dummies" 
     android:textColor="@android:color/black" 
     android:padding="7dp"/> 
</ScrollView> 

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:appcompat="http://schemas.android.com/apk/res-auto" 
    xmlns:app="http://schemas.android.com/tools" > 

    <item 
     android:id="@+id/search" 
     android:icon="@android:drawable/ic_menu_search" 
     android:title="Search" 
     appcompat:actionViewClass="android.support.v7.widget.SearchView" 
     appcompat:showAsAction="ifRoom|collapseActionView"/> 
    <item 
     android:id="@+id/next" 
     android:icon="@android:drawable/arrow_down_float" 
     android:title="Next" 
     android:visible="false" 
     appcompat:showAsAction="always"/> 
    <item 
     android:id="@+id/prev" 
     android:icon="@android:drawable/arrow_up_float" 
     android:title="Previous" 
     android:visible="false" 
     appcompat:showAsAction="always"/> 

</menu> 

DummiesActivity.java файл

public class DummiesActivity extends AppCompatActivity { 

    WebView wvDummies; 
    Context context; 
    Float scale = 0.5F; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = this; 
     setContentView(R.layout.dummies_guide); 

     wvDummies = (WebView) findViewById(R.id.tv_for_dummies); 

     wvDummies.getSettings().setSupportZoom(true); 
     wvDummies.getSettings().setBuiltInZoomControls(true); 
     wvDummies.getSettings().setJavaScriptEnabled(true); 
     wvDummies.loadData(getString(R.string.app_name123), "text/html", 
       "UTF-8"); 

     getSupportActionBar().setTitle("Dummies guide"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(final Menu menu) { 
     getMenuInflater().inflate(R.menu.dummies_search_menu, menu); 

     SearchManager searchManager = (SearchManager) context 
       .getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = (SearchView) menu.findItem(R.id.search) 
       .getActionView(); 
     searchView.setSearchableInfo(searchManager 
       .getSearchableInfo(getComponentName())); 
     searchView.setQueryHint("Search"); 

     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @SuppressLint("NewApi") 
      @Override 
      public boolean onQueryTextSubmit(String query) { 

       if (!query.isEmpty()) { 
        menu.findItem(R.id.next).setVisible(true); 
        menu.findItem(R.id.prev).setVisible(true); 

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
         wvDummies.findAllAsync(query); 
        } else { 
         wvDummies.findAll(query); 
        } 

        try { 
         Method m = WebView.class.getMethod("setFindIsUp", 
           Boolean.TYPE); 
         m.invoke(wvDummies, true); 
        } catch (Throwable e) { 
         e.printStackTrace(); 
        } 
       } else { 
        menu.findItem(R.id.next).setVisible(false); 
        menu.findItem(R.id.prev).setVisible(false); 
       } 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       if (newText.isEmpty()) { 
        try { 
         Method m = WebView.class.getMethod("setFindIsUp", 
           Boolean.TYPE); 
         m.invoke(wvDummies, false); 
        } catch (Throwable ignored) { 
        } 
       } 
       return true; 
      } 
     }); 

     searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
      @Override 
      public boolean onClose() { 
       Log.d("", "setOnCloseListener called"); 
       try { 
        Method m = WebView.class.getMethod("setFindIsUp", 
          Boolean.TYPE); 
        m.invoke(wvDummies, false); 
       } catch (Throwable ignored) { 
       } 
       return false; 
      } 
     }); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int itemId = item.getItemId(); 
     switch (itemId) { 
     case android.R.id.home: 
      finish(); 
      break; 

     case R.id.next: 
      wvDummies.findNext(true); 
      break; 

     case R.id.prev: 
      wvDummies.findNext(false); 
      break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

ответ

2

я использую SearchView может scorll словам selectd при щелчке ч на клавиатуре

public class SOActivity extends AppCompatActivity { 

private WebView webview; 
private SearchView sv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_so); 
    webview = (WebView) findViewById(R.id.webview); 
    sv = (SearchView) findViewById(R.id.searcheview); 
    initWebView(); 


} 

private void initWebView() { 
    webview.loadUrl("http://www.stackoverflow.com"); 
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.setWebViewClient(new WebViewClient(){ 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

    }); 

    sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      webview.findAllAsync(query); 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 
    }); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 

    if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 

     webview.goBack(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

}

Xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="g7.com.example.cgx_pc.cameraapp.SOActivity"> 


    <android.support.v7.widget.SearchView 
     android:id="@+id/searcheview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    </android.support.v7.widget.SearchView> 

<WebView 
    android:id="@+id/webview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

</WebView> 

enter image description here

7

РЕДАКТИРОВАТЬ: с SearchView

Я использую SearchView, и это отлично работает отлично для меня в Moto G3 зефир 6.0.

Мой XML-файл:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="com.example.peacock.myproj.MainActivity"> 

<WebView 
    android:id="@+id/webview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</LinearLayout> 

В menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<item android:id="@+id/action_search" 
    android:title="Search" 
    android:icon="@drawable/abc_ic_search_api_mtrl_alpha" 
    app:showAsAction="ifRoom|collapseActionView" 
    app:actionViewClass="android.support.v7.widget.SearchView" /> 

</menu> 

В моей деятельности:

public class MainActivity extends AppCompatActivity { 

WebView mWebView; 
boolean flag = false; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu, menu); 

    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); 
    SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE); 

    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    searchView.setSubmitButtonEnabled(true); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      if (!query.isEmpty()) { 


       if (!flag) { 
        mWebView.findAllAsync(query); 

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

     @Override 
     public boolean onQueryTextChange(String newText) { 

      if (newText.isEmpty()) { 
       try { 
        Method m = WebView.class.getMethod("setFindIsUp", Boolean.TYPE); 
        m.invoke(mWebView, false); 
       } catch (Throwable ignored) { 
       } 
      } 
      flag=false; 
      return true; 
     } 
    }); 
    searchView.setOnCloseListener(new SearchView.OnCloseListener() { 
     @Override 
     public boolean onClose() { 

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

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mWebView = (WebView) findViewById(R.id.webview); 
    // Load the url 
    mWebView.loadUrl("http://stackoverflow.com/questions/38254152/android-webview-findnext-does-not-scroll-to-next-selected-word"); 

} 
} 

Нажав на кнопку отправки вы можете мо до следующего слова. смотрите ниже GIF:

+0

Я не использую EditText. Я создал appcompat: actionViewClass = "android.support.v7.widget.SearchView" в самой панели действий. Должен ли я внести какие-либо изменения для этого? –

Смежные вопросы