Android: сделать кнопку видимой после завершения прокрутки

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

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

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

Ответы на вопрос(5)

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

добавлен обратный вызов 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

UPDATED:

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 (btnJumpT,oBottom != 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;
}

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

Создать класс 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");

so leaving my comment here as a new answer]

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

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

метод, вызов

getContentHeight()

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

computeVerticalScrollRange()

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

@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 (унаследованный от View).

чтобы отобразить «Я согласен». кнопка, как только пользователь прокрутил до конца лицензионного соглашения. Адвокаты, а?

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

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

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);
    }

}

Я использую это, чтобы отобразить & quot; Я согласен & quot; кнопка, когда пользователь прокрутил до конца 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 пикселей от него), «Я согласен» кнопка появляется.

Ваш ответ на вопрос