2012-06-08 20 views
5

Mam widok internetowy, który pokazuje plik html. Gdy użytkownik przewinie do dołu tego pliku w widoku internetowym, chcę przycisk, który wcześniej był ukryty, aby pokazać się, a następnie użytkownik może nacisnąć, aby wykonać jakąś czynność.Android: Tworzenie przycisku widocznego po zakończeniu przeglądania strony internetowej

Zrobiłem coś podobnego w iOS, gdzie właśnie ustawiłem delegat do ViewController i po prostu ustaw przycisk jako widoczny. Jak zrobić coś podobnego na Androida? Zauważyłem, że nie ma metody wywołania zwrotnego, jak w iOS.

Edycja: Teraz mam aktywność z 2 obiektami: webview zawierający mój tekst i przycisk, który jest obecnie niewidoczny. Chcę moją aktywność, aby otrzymać wiadomość gdy Webview przewija tekst na dole, i uczynić przycisk widoczny

Odpowiedz

0

Spróbuj tego:

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

Aby to realizować, przedłużyć Scrollview a następnie zastąpić metodę onScrollChanged (dziedziczona z widoku).

+0

Widok strony internetowej nie ma jednak żadnego odniesienia do przycisku. – Daniel

2

Musiałem to zrobić samodzielnie, aby wyświetlić przycisk "Zgadzam się", gdy użytkownik przewinie się na dół EULA. Prawnicy, co?

W rzeczywistości, gdy zastępujesz WebView (zamiast ScrollView jak w odpowiedzi z @JackTurky) możesz wywołać getContentHeight(), aby uzyskać wysokość zawartości, zamiast getBottom(), która zwraca widoczne dno i jest nieprzydatne.

To jest moje kompleksowe rozwiązanie. O ile widzę, to wszystko jest na poziomie API 1, więc powinno działać wszędzie.

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

} 

używam tego, aby wyświetlić przycisk „Zgadzam się”, gdy użytkownik przewija do dołu WebView, gdzie ja to nazywam tak (w klasie, która „implementuje 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); 
} 

Więc po osiągnięciu dna (lub w tym przypadku, kiedy się w ciągu 50 pikseli nim) „I Agree” pojawi się przycisk.

+0

Witam, czy mógłbyś dać mi znać gdzie 'StaticHelpers' został zadeklarowany? –

+0

StaticHelpers to klasa wewnętrzna z kilkoma metodami ogólnego przeznaczenia - w tym przypadku do ładowania przeglądarki internetowej i do czytania pliku tekstowego z systemu plików - nic szczególnie zaskakującego. – karora

-1

Solutions powyżej nie w pełni działa na mnie do podobnego problemu (ukryj przycisk podczas przewijania webView, pokaż po przewinięciu się) Powód, dla którego chcę d do ukrycia podczas przewijania, ponieważ przycisk, który chcę ukryć, służy do przeskakiwania do samego dołu widoku sieciowego, a gdy działa tylko dla mnie, gdy przeglądanie jest statyczne, ale nie przeskoczył do dołu, a widok jest nadal przewijany. Więc zrobiłem następujące:

dodał onScrollChanged oddzwanianie do nadpisane Webview, jak sugerowano w pobliżu:

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

iw mojej klasie działalności, która implementuje OnScrollChangedCallback

AKTUALIZACJA:

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; 
} 
+0

Dowiedziałem się, że "web.pageDown (true);" działa podczas przewijania, ale "web.scrollTo (0, scrollTo);" jest ignorowany. – shtolik

+0

Gdy strona jest przewijana, otrzymasz setki połączeń zwrotnych onScrollChanged, a to spowoduje przydzielenie dużej ilości obiektów Timera :) Jednym ze sposobów jest posiadanie jednego timera/wątku, który będzie działał ze stałym interwałem (~ 500ms). Następnie będziesz nagrywać znacznik czasu ostatniego przewijania w onScrollChanged i wyłączać/włączać przyciski timera w zależności od ostatniego znacznika czasu przewijania. – noxo

+0

Odpowiedz odpowiednio zaktualizowana – shtolik

0

Przycisk Ładowanie/Widoczny tylko wtedy, gdy przeglądarka osiągnęła/przewinęła do dołu.

Utwórz klasę 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); 

      } 
     }); 
     } 
    } 

W onCreate():

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

[nie mogę wypowiedzieć się na odpowiedź, więc pozostawiając mój komentarz tutaj jako nowe odpowiedzi]

Odpowiedź karora (pierwsza) działa bardzo dobrze, z wyjątkiem tego, że w

protected void onScrollChanged(int left, int top, int oldLeft, int oldTop) 

metoda, nazywając

getContentHeight() 

był szalenie niedokładne dla mnie. Podano wartość o wiele za małą, więc mój słuchacz został wywołany, gdy użytkownik przewinął tylko jedną trzecią drogi w dół WebView. Zamiast tego użyłem:

computeVerticalScrollRange() 
i to jest doskonałe. Podziękowania dla this post za pomocną podpowiedź.

Powiązane problemy