Android: создание кнопки видимой после просмотра веб-прокрутки

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

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

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

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

попробуй это:

 @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).

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

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

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

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