Ho dovuto farlo da solo, al fine di visualizzare un pulsante "Accetto" dopo che l'utente ha spostato in fondo a un EULA. Avvocati, eh?
Infatti, quando si esegue l'override di WebView (anziché ScrollView come nella risposta di @JackTurky) è possibile chiamare getContentHeight() per ottenere l'altezza del contenuto, piuttosto che getBottom() che restituisce il fondo visibile ed è inutile.
Questa è la mia soluzione completa. Per quanto posso vedere, tutto questo è di livello API 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);
}
}
Io lo uso per visualizzare un pulsante "Accetto" una volta che l'utente ha selezionato un fondo del WebView, dove io lo chiamo così (in una classe 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);
}
Così, quando viene raggiunto il fondo (o in questo caso, quando si arriva a meno di 50 pixel di esso) il "Accetto" appare il pulsante.
La visualizzazione Web non ha tuttavia alcun riferimento al pulsante. – Daniel