2012-06-08 3 views
5

У меня есть веб-просмотр, который показывает html-файл. Когда пользователь прокручивается в нижней части этого файла в webview, мне нужна кнопка, которая была ранее скрыта для отображения, которую пользователь может нажать, чтобы сделать некоторую активность.Android: Сделать кнопку видимой, как только веб-просмотр сделан прокруткой

Я сделал что-то подобное в iOS, где я просто установил делегата в ViewController и просто установите кнопку как видимую. Как мне сделать что-то подобное на Android? Я заметил, что в iOS нет метода обратного вызова.

Редактировать: Прямо сейчас, у меня есть активность с 2 объектами: веб-просмотр, содержащий мой текст, и кнопка, которая в настоящее время невидима. Я хочу, чтобы моя деятельность, чтобы получить сообщение, когда WebView текст прокручивается на дно, и сделать кнопку видимой

ответ

0

попробовать это:

@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     View view = (View) getChildAt(getChildCount()-1); 
     int diff = (view.getBottom()-(getHeight()+getScrollY()));// Calculate the scrolldiff 
     if(diff == 0){ // if diff is zero, then the bottom has been reached 
      Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached"); 
      yourButton.setVisible(true); 
     } 
     super.onScrollChanged(l, t, oldl, oldt); 
} 

Для реализации этого расширения Scrollview, а затем переопределить onScrollChanged метод (унаследованный от просмотра).

+0

Веб-просмотр не содержит ссылок на кнопку. – Daniel

2

Я должен был сделать это сам, чтобы отобразить кнопку «Я согласен», как только пользователь прокрутил нижнюю часть EULA. Адвокаты, да?

Фактически, когда вы переопределяете WebView (а не ScrollView, как в ответе от @JackTurky), вы можете вызвать getContentHeight(), чтобы получить высоту содержимого, а не getBottom(), который возвращает видимое нижнее и не полезно.

Это мое комплексное решение. Насколько я вижу, это все API уровня 1, поэтому он должен работать где угодно.

public class EulaWebView extends WebView { 
    public EulaWebView(Context context) 
    { 
     this(context, null); 
    } 

    public EulaWebView(Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
    } 

    public EulaWebView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    public OnBottomReachedListener mOnBottomReachedListener = null; 
    private int mMinDistance = 0; 

    /** 
    * Set the listener which will be called when the WebView is scrolled to within some 
    * margin of the bottom. 
    * @param bottomReachedListener 
    * @param allowedDifference 
    */ 
    public void setOnBottomReachedListener(OnBottomReachedListener bottomReachedListener, int allowedDifference) { 
     mOnBottomReachedListener = bottomReachedListener; 
     mMinDistance = allowedDifference; 
    } 

    /** 
    * Implement this interface if you want to be notified when the WebView has scrolled to the bottom. 
    */ 
    public interface OnBottomReachedListener { 
     void onBottomReached(View v); 
    } 

    @Override 
    protected void onScrollChanged(int left, int top, int oldLeft, int oldTop) { 
     if (mOnBottomReachedListener != null) { 
      if ((getContentHeight() - (top + getHeight())) <= mMinDistance) 
       mOnBottomReachedListener.onBottomReached(this); 
     } 
     super.onScrollChanged(left, top, oldLeft, oldTop); 
    } 

} 

Я использую это, чтобы отобразить кнопку «Я согласен», когда пользователь прокрутил в нижней части WebView, где я называю это так (в классе, который «реализует OnBottomReachedListener»:

EulaWebView mEulaContent; 
Button mEulaAgreed; 

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

    setContentView(R.layout.eula); 
    mEulaContent = (EulaWebView) findViewById(R.id.eula_content); 
    StaticHelpers.loadWebView(this, mEulaContent, R.raw.stylesheet, StaticHelpers.readRawTextFile(this, R.raw.eula), null); 
    mEulaContent.setVerticalScrollBarEnabled(true); 
    mEulaContent.setOnBottomReachedListener(this, 50); 

    mEulaAgreed = (Button) findViewById(R.id.eula_agreed); 
    mEulaAgreed.setOnClickListener(this); 
    mEulaAgreed.setVisibility(View.GONE); 
} 

@Override 
public void onBottomReached(View v) { 
    mEulaAgreed.setVisibility(View.VISIBLE); 
} 

Итак, когда дно достигнуто (или в данном случае, когда они попадают в 50 пикселей It) «Я согласен» появится кнопка.

+0

Привет, не могли бы вы сообщить мне, где объявлен StaticHelpers? –

+0

StaticHelpers - это внутренний класс с несколькими методами общего назначения - в этом случае для загрузки веб-представления и для чтения текстового файла из файловой системы - ничего особенного в нем нет. – karora

-1

Solutions выше не в полной мере работать на меня за аналогичный вопрос (скрыть кнопку, пока прокручивается webView, показывается после прокрутки). Причина, по которой я хочу d, чтобы скрыть во время прокрутки, потому что кнопка, которую я хочу скрыть, предназначена для перехода в самую нижнюю часть веб-обозревателя, и когда она работает только для меня, когда веб-просмотр является статическим, но не прыгнет на дно, пока просмотр все еще прокручивается. Так что я сделал следующее:

добавил onScrollChanged обратного вызова преодолен WebView, как предложено поблизости:

private OnScrollChangedCallback mOnScrollChangedCallback; 

public OnScrollChangedCallback getOnScrollChangedCallback() { 
    return mOnScrollChangedCallback; 
} 

public void setOnScrollChangedCallback(
     final OnScrollChangedCallback onScrollChangedCallback) { 
    mOnScrollChangedCallback = onScrollChangedCallback; 
} 

@Override 
protected void onScrollChanged(final int l, final int t, final int oldl, 
     final int oldt) { 
    super.onScrollChanged(l, t, oldl, oldt); 
    if (mOnScrollChangedCallback != null){ 
     mOnScrollChangedCallback.onScrollChanged(l, t); 
    } 
} 

/** 
* Implement in the activity/fragment/view that you want to listen to the 
* webview 
*/ 
public static interface OnScrollChangedCallback { 
    public void onScrollChanged(int l, int t); 
} 

и в моем классе деятельности, которая реализует OnScrollChangedCallback

ОБНОВЛЕНО:

Timer timer2showJumpButton; 
private long lastScrollEventTimestamp; 
public final static int HIDING_JUMP_BUTTON_ON_SCROLL_DELAY = 500; 

    public void onScrollChanged(int l, int t) { 

    // showing button when scrolling starts 
    if (btnJumpToBottom != null) { 
     btnJumpToBottom.setVisibility(View.VISIBLE); 
    } 

    if (btnJumpToTop!= null) { 
     btnJumpToTop.setVisibility(View.VISIBLE); 
    } 


    if (timer2showJumpButton == null) { 

     final Runnable r2 = new Runnable() { 

      @Override 
      public void run() { 
       if (btnJumpToBottom != null) { 
        btnJumpToBottom.setVisibility(View.GONE); 
       } 
       if (btnJumpToTop!= null) { 
        btnJumpToTop.setVisibility(View.GONE); 
       } 

      } 
     }; 

     TimerTask timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       if (btnJumpToTop.getVisibility() == View.VISIBLE || btnJumpToBottom.getVisibility() == View.VISIBLE){ 
        long currentTimestamp = System.currentTimeMillis(); 

        if (currentTimestamp - lastScrollEventTimestamp > HIDING_JUMP_BUTTON_ON_SCROLL_DELAY1){       
         webView.postDelayed(r2, HIDING_JUMP_BUTTON_ON_SCROLL_DELAY); 
        }else{ 
         //too soon 
        } 
       } 
      } 
     }; 

     try { 
      timer2showJumpButton = new Timer(); 
      timer2showJumpButton.schedule(timerTask, 500, 500); 
     } catch (IllegalStateException e) { 
      logger.warn(TAG + "/onScrollChanged/" + e.getMessage()); 

     } 
    } 

    // adding runnable which will hide button back 
    long currentTimestamp = System.currentTimeMillis(); 

    lastScrollEventTimestamp = currentTimestamp; 
} 
+0

Обнаружил, что "web.pageDown (true);" работает во время прокрутки, но «web.scrollTo (0, scrollTo)»; игнорируется. – shtolik

+0

Когда страница прокручивается, вы получите сотни обратных вызовов onScrollChanged и выделяете огромное количество объектов Timer :) Один из способов - иметь один таймер/поток, который будет работать с фиксированным интервалом (~ 500 мс). Затем вы будете записывать последнюю временную метку прокрутки в onScrollChanged и отключать/включать кнопки по таймеру в зависимости от последней временной метки прокрутки. – noxo

+0

Ответить обновлено – shtolik

0

Загрузка/видимая кнопка, только когда веб-просмотр достигнут/прокручен донизу.

Создать класс JavaScript:

public class JavaScriptInterface { 

    @android.webkit.JavascriptInterface 
    public void didScrollToBottom() { 
    Log.d(TAG, "Scroll to Bottom"); 
    myHandler.post(new Runnable() { 
     @Override 
     public void run() { 
     btnAccept.setVisibility(View.VISIBLE); 

      } 
     }); 
     } 
    } 

В OnCreate():

final JavaScriptInterface jsInterface = new JavaScriptInterface(); 
myWebView.addJavascriptInterface(jsInterface, "AndroidFunction"); 
0

[Я не могу прокомментировать ответ, так оставив свой комментарий здесь, как новый ответ]

Ответ на karora (первый) работает очень хорошо, за исключением того, что в

protected void onScrollChanged(int left, int top, int oldLeft, int oldTop) 

метод вызова

getContentHeight() 

был дико неточными для меня. Он сообщил, что значение слишком мало, поэтому мой слушатель был вызван, когда пользователь прокручивал, может быть, треть пути WebView. Я использовал

computeVerticalScrollRange() 

вместо этого, и это идеально. Благодаря this post за этот полезный намек.

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