1. ホーム
  2. android

[解決済み] ScrollViewの終了を検出する

2023-04-29 04:32:17

質問

あるアプリで、アクティビティに ScrollView . ユーザーが の一番下まで来たことを検出する必要があります。 ScrollView . 私はいくつかのグーグル検索を行い、私は見つけた このページ と説明されています。しかし、この例では、その人が拡張している ScrollView . やはり、Activityを拡張する必要があります。

では、Activityを拡張するカスタムクラスを作ってみましょう。 ScrollView をオーバーライドして onScrollChanged() メソッドをオーバーライドし、スクロールの終了を検出し、それに応じて動作します" 。

したのですが、この行で

scroll = (ScrollViewExt) findViewById(R.id.scrollView1);

を投げます。 java.lang.ClassCastException . を変更しました。 <ScrollView> タグを変更しましたが、明らかに、うまくいきません。私の疑問は なぜ、もし ScrollViewExtScrollView を投げると、私の顔に向かって ClassCastException は、あまり混乱することなく、スクロールの終了を検出する方法はありますか?

ありがとうございます。

編集 約束したように、これが私の XML の重要な部分です。

<ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >


        <WebView
            android:id="@+id/textterms"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:textColor="@android:color/black" />

    </ScrollView>

から変更しました。 TextView から WebView に変更し、中のテキストを正当化できるようにしました。実現したいのは、契約条件を完全に読み込むまで、"Accept ボタンが有効にならないようにすることです。私の拡張クラスは ScrollViewEx t. タグを変更すると ScrollViewScrollViewExt を投げます。

android.view.InflateException: Binary XML file line #44: Error inflating class ScrollViewExt

というタグを理解できないので ScrollViewEx . 解決策があるとは思えませんが...。

ご回答ありがとうございました

どのように解決するのですか?

できた!

Alexandreが提供してくれた修正以外に、私はインターフェイスを作成する必要がありました。

public interface ScrollViewListener {
    void onScrollChanged(ScrollViewExt scrollView, 
                         int x, int y, int oldx, int oldy);
}

そして、ScrollViewのOnScrollChangedメソッドをScrollViewExtでオーバーライドする必要がありました。

public class ScrollViewExt extends ScrollView {
    private ScrollViewListener scrollViewListener = null;
    public ScrollViewExt(Context context) {
        super(context);
    }

    public ScrollViewExt(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ScrollViewExt(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }
}

さて、Alexandreが言ったように、XMLタグにパッケージ名を入れて(私のミスです)、Activityクラスに先ほど作ったインタフェースを実装させ、そして、全部をまとめます。

scroll = (ScrollViewExt) findViewById(R.id.scrollView1);
scroll.setScrollViewListener(this);

そして、インターフェイスからOnScrollChangedというメソッドで...

@Override
public void onScrollChanged(ScrollViewExt scrollView, int x, int y, int oldx, int oldy) {
    // We take the last son in the scrollview
    View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1);
    int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));

    // if diff is zero, then the bottom has been reached
    if (diff == 0) {
        // do stuff
    }
}

そして、うまくいきました

Alexandreさん、どうもありがとうございました。