Android: fare un button visibile una volta che il webview è fatto scorrere

Ho un webview che mostra un file html. Quando l'utente scorre in fondo a questo file in webview, desidero che un button precedentemente nascosto venga visualizzato, che l'utente può quindi premere per eseguire un'attività

Ho fatto qualcosa di simile in iOS, where ho appena impostato il delegato al ViewController e ho appena impostato il button come visibile. Come faccio qualcosa di simile per Android? Ho notato che non esiste un metodo di richiamata come in iOS.

  • Accettazione di un certificato per HTTP su Android
  • Come convertire un progetto android in un progetto di libreria in Eclipse?
  • Come modificare il colore delle maniglie di EditText?
  • Come provare il codice creato per salvare / ripristinare il ciclo di vita di un'attività?
  • Conversione da .java diretta a .smali. Possibile?
  • Il servizio Android smette di funzionare quando il telefono è bloccato
  • Modifica: in questo momento, ho un'attività con due oggetti: una webview contenente il mio text e un button attualmente invisibile. Voglio che la mia attività ricevere un messaggio quando il text webview scorre in basso e rendere visibile il button

  • Come controllare la versione dei servizi di Google Play?
  • Animare il text utilizzando TextSwitcher in Android
  • Avere un button eseguire OnClickListener alla fine dell'animation ripple (tema del materiale)
  • abilitare / disabilitare lo zoom di Android WebView
  • Come faccio a evitare doppie confini tra le liste?
  • Viste programmate come impostare un id unico?
  • 4 Solutions collect form web for “Android: fare un button visibile una volta che il webview è fatto scorrere”

    Ho dovuto farlo da me stesso, per visualizzare un button "Accetto" una volta che l'utente ha scelto in fondo a un EULA. Avvocati, eh?

    Infatti quando sovrascrivete il WebView (piuttosto che ScrollView come nella risposta da @JackTurky) puoi call getContentHeight () per get l'altezza del contenuto piuttosto che getBottom () che restituisce il fondo visibile e non è utile.

    Questa è la mia soluzione completa. Per quanto posso vedere questo è tutto il livello API livello 1, quindi dovrebbe funzionare ovunque.

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

    Lo uso per visualizzare un button "Accetto" una volta che l'utente ha scelto nella parte inferiore del WebView, where lo chiamo in questo modo (in una class che "implementa 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); } 

    Quindi, quando viene raggiunto il fondo (o in questo caso, quando raggiungono i 50 pixel di esso) viene visualizzato il button "Accetto".

    prova questo:

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

    Per implementarlo, estendere ScrollView e quindi ignorare il metodo onScrollChanged (ereditato da View).

    Pulsante di caricamento / visibile solo quando il webview è stato raggiunto / scorciato verso il basso.

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

    In onCreate ():

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

    Le soluzioni di cui sopra non hanno funzionato completamente per me per il problema simile (button hide mentre webView viene scorciato, mostrato dopo lo scorrimento è finito). Il motivo per cui ho voluto hide mentre scorrimento è perché il button che voglio hide è quello di saltare al fondo del webview e quando ha funzionato solo per me quando la visualizzazione web è statica, ma non è saltare in fondo mentre la vista è ancora in corso scorrere. Così ho fatto quanto segue:

    ha aggiunto un callback onScrollChanged al override di webView, come suggerito nelle vicinanze:

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

    e nella mia class di attività che implementa OnScrollChangedCallback

    AGGIORNAMENTO:

     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; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.