Android: сделать кнопку видимой после завершения прокрутки
У меня есть веб-просмотр, который показывает HTML-файл. Когда пользователь прокручивает до конца этого файла в веб-просмотре, я хочу, чтобы кнопка, которая была ранее скрыта, чтобы показать, которую пользователь может затем нажать, чтобы сделать некоторую деятельность
Я сделал нечто подобное в iOS, где я просто установил делегат ViewController и просто установил кнопку как видимую. Как мне сделать что-то похожее на Android? Я заметил, что нет метода обратного вызова, как в iOS.
Изменить: сейчас у меня есть действие с 2 объектами: веб-просмотр, содержащий мой текст, и кнопка, которая в настоящее время невидима. Я хочу, чтобы моя активность получала сообщение, когда текст веб-просмотра прокручивается вниз, и делает кнопку видимой
5 ответов
Я должен был сделать это сам, чтобы отобразить кнопку "Я согласен", когда пользователь прокрутил до конца лицензионного соглашения. Адвокаты, а?
Фактически, когда вы переопределяете 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);
}
}
Я использую это для отображения кнопки "Я согласен", когда пользователь прокручивает до конца 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 пикселей), появляется кнопка "Я согласен".
[Я не могу комментировать ответ, поэтому оставляю свой комментарий здесь как новый ответ]
Ответ Кароры (первый) работает очень хорошо, за исключением того, что в
protected void onScrollChanged(int left, int top, int oldLeft, int oldTop)
метод, вызов
getContentHeight()
был дико неточным для меня. Он сообщил о слишком малом значении, поэтому мой слушатель был вызван, когда пользователь только прокрутил, возможно, треть пути вниз по WebView. я использовал
computeVerticalScrollRange()
вместо этого, и это прекрасно. Спасибо за этот пост за этот полезный совет.
Кнопка загрузки / видимости только когда веб-просмотр достиг / прокручивается вниз.
Создать класс 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");
Попробуй это:
@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, показ после завершения прокрутки). Причина, по которой я хотел, чтобы он скрывался при прокрутке, заключается в том, что кнопка, которую я хочу скрыть, предназначена для перехода к самой нижней части веб-просмотра, и когда она работала только для меня, когда веб-просмотр статичен, но не переходил к нижней части, пока просмотр все еще выполняется. прокручивается. Итак, я сделал следующее:
добавлен обратный вызов 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;
}