2010-03-16 4 views
3

Я новичок в Android.Android: получите позицию прокрутки WebView

Я хотел бы просто знать, где на странице прокручивается пользователь. Когда в нижней части экрана появляется определенная точка на веб-странице, я хочу вызвать событие. Но этот код вызывает исключение. Я знаю, что WebView наследует getScrollY() из представления. Я не реализую его правильно?

Заранее спасибо.

public class Scroll extends Activity { 

    public WebView webview; 
    public float yPos; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     WebView webview = new WebView(this); 
     setContentView(webview); 
     webview.loadUrl("file:///android_asset/Scroll.html"); 
    } 


    public boolean onTouchEvent(final MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      yPos = webview.getScrollY(); 
      Log.v("Scroll", "yPos = " + yPos); 
     } 
     return false; 
    } 
} 

ответ

2

И исключение?
Вот запись на WebView высоты экрана от одного из моих приложений:

// current position (top) = getScrollY(); 
// max position = getContentHeight(); 
// screen height = getHeight(); 
+1

Спасибо за ответ! Это исключение NullPointerException. Отладчик останавливается в строке «yPos = webview.getScrollY()», но я не могу понять, откуда приходит нулевой указатель. Что касается вашего примечания, я использую getScrollY(), поэтому вы подтвердили, что это правильный метод, но способ, которым я его использую, по-видимому, ошибочен. – Dave

+0

На самом деле я обнаружил, что в строке «yPos = webview.getScrollY()» переменная «webview» равна null, хотя в методе onCreate «WebView webview = новый WebView (this)»; работает. Не имеет ли переменная «webview» область действия, которая выходит из метода onCreate? А если нет, как мне получить ручку? – Dave

+8

@Dave Это должен быть webview = новый WebView (это); вместо WebView webview = новый WebView (это); in onCreate (..). – yanchenko

3

Вы пишете WebView webview; в двух местах внутри метода OnCreate().

Aimply написать webview = new WebView(this); вместо WebView webview = new WebView(this);

Таким образом, вы можете решить эту проблему нулевого указателя.

0

WebView есть метод, чтобы получить его высоту содержимого, которое я использовал в своем решении:

webView.setOnScrollChangeListener(new View.OnScrollChangeListener() { 
    @Override 
    public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 
     WebView webView = (WebView) view; 
     float contentHeight = webView.getContentHeight() * webView.getScaleY(); 
     float total = contentHeight * getResources().getDisplayMetrics().density - view.getHeight(); 
     // on some devices just 1dp was missing to the bottom when scroll stopped, so we subtract it to reach 1 
     float percent = Math.min(scrollY/(total - getResources().getDisplayMetrics().density), 1); 
     Log.d("SCROLL", "Percentage: " + percent); 
     if (scrollY >= total - 1) { 
         Log.d("SCROLL", "Reached bottom"); 
     } 
    } 
} 

Высматривайте:

  • WebView шкала должна быть принята во внимание, чтобы получить общая высота прокрутки
  • Плотность дисплея необходимо умножить на высоту содержимого, чтобы сравнить его с прокруткойY
  • На моем Nexus 5X на Andr oid 8 прокрутка никогда не достигла высоты, но остановилась на 1dp до конца (обходной путь включен в код)
Смежные вопросы