Android: Cómo hacer que un botón sea visible una vez que se haya completado la visualización web

Tengo una webview que muestra un archivo html. Cuando el usuario se desplaza hasta la parte inferior de este archivo en la vista web, quiero que aparezca un botón que estaba oculto anteriormente, que el usuario puede presionar para realizar alguna actividad

Hice algo similar en iOS, donde acabo de establecer el delegado a ViewController y acaba de establecer el botón como visible. ¿Cómo hago algo similar en Android? Me di cuenta de que no hay un método de devolución de llamada como en iOS.

Editar: Ahora mismo, tengo una actividad con 2 objetos: una vista web que contiene mi texto, y un botón que es actualmente invisible. Quiero que mi actividad reciba un mensaje cuando el texto de visualización web se desplace hasta la parte inferior y haga que el botón sea visible.

Tuve que hacer esto yo mismo, con el fin de mostrar un "I Agree" botón una vez que el usuario ha desplazado a la parte inferior de un EULA. Abogados, ¿eh?

De hecho, cuando reemplazas el WebView (en lugar del ScrollView como en la respuesta de @JackTurky) puedes llamar a getContentHeight () para obtener la altura del contenido, en lugar de getBottom () que devuelve el fondo visible y no es útil.

Esta es mi solución completa. Por lo que puedo ver esto es todo el API Nivel 1 cosas, por lo que debe funcionar en cualquier lugar.

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

Utilizo esto para mostrar un botón de "Acepto" una vez que el usuario ha desplazado a la parte inferior del WebView, donde lo llamo así (en una clase que "implemente 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); } 

Así que cuando se llega a la parte inferior (o en este caso, cuando se encuentran a 50 píxeles de ella) aparece el botón "Acepto".

prueba esto:

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

Para implementar esto, expanda ScrollView y luego reemplace el método onScrollChanged (heredado de View).

Botón Loading / Visible sólo cuando la vista web alcanzó / desplazó hacia abajo.

Crear una clase de 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); } }); } } 

En onCreate ():

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

Las soluciones anteriores no funcionaron completamente para mí para el problema similar (ocultar el botón mientras se está desplazando webView, mostrar después de que se haya completado el desplazamiento). La razón por la que quería que se esconda mientras se desplaza es porque el botón que quiero ocultar es para saltar a la parte inferior de la vista web, y cuando sólo funcionó para mí cuando la webview es estática, pero no saltar a la parte inferior, mientras que la vista sigue siendo Desplazado Así que hice lo siguiente:

Agregó una devolución de llamada onScrollChanged a WebView anulada, como sugerido en las cercanías:

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

Y en mi clase de actividad que implementa OnScrollChangedCallback

ACTUALIZADO:

 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; } 
  • Android: Cómo alternar entre los ajustes de vibración (siempre, nunca, sólo en modo silencioso, sólo cuando no está en modo silencioso)? Revisited
  • Cómo reemplazar el método a través del atajo de teclado en Android Studio
  • ¿Cómo obtener un evento táctil continuo?
  • Compartir recursos en bruto a través de WhatsApp
  • Icono de aplicación y icono de lanzador diferentes?
  • Error de conexión: ECONNREFUSED
  • Verificación del número de teléfono Android
  • Una forma fiable de saber cuándo se resiste el teclado virtual de Android (devolución de llamada que funciona en todos los teléfonos)
  • Modificación de atributos anidados en un Layout incluido
  • Crear vínculo profundo para la aplicación móvil
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.