1. ホーム
  2. android

[解決済み] ScrollViewをプログラムで無効にする?

2022-09-17 18:58:49

質問

ScrollViewを有効にし、ボタンクリックで無効にしたいのですが、どうすればよいですか?

DisableはScrollViewがなかった場合のような意味で、enableはScrollViewを戻すという意味です。

私はテキスト画像でギャラリーがあり、ボタンをクリックすると画面の向きが変わり、横向きではテキストが大きくなるので、それが欲しいです。そして、画像が勝手に伸びてテキストが読めなくならないように、ScrollViewが欲しいのです。

scrollview.Enabled=false / setVisibility(false) は何も作らない。

xmlです。

<ScrollView 
android:id="@+id/QuranGalleryScrollView" 
android:layout_height="fill_parent" 
android:layout_width="fill_parent">
<Gallery android:id="@+id/Gallery" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:scrollbars="horizontal"></Gallery>
</ScrollView>

Visibility(gone)を使うとGalleryも隠れてしまうので使えません。私が欲しいのはScrollViewの効果を隠すことなのです。ScrollViewがあると、Galleryの画像がスクロール可能になり、画面に収まらなくなるので、スクロールしないと画像全体が見えません。ボタンクリックで無効化・有効化するのは嫌です。

こんな感じでやってみました。

((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);
                        ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setHorizontalScrollBarEnabled(false);
                        ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setVerticalScrollBarEnabled(false);
                        ((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setEnabled(false);

しかし、まだギャラリーの画像はスクロール可能で、画面に収まりません。これに対する解決策は何でしょうか?

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

まず、いくつかのポイントがあります。

  1. ScrollViewのスクロールを無効化することはできません。ScrollViewを拡張して、その上で onTouchEvent メソッドをオーバーライドして false を返します。
  2. ギャラリーコンポーネントは、それがScrollView内にあるかどうかに関係なく水平にスクロールします - ScrollViewは垂直スクロールのみを提供します(水平スクロールのためにHorizontalScrollViewが必要です)。
  3. 画像の伸縮に問題があるようですが、これは ScrollView とは関係なく、ImageView の伸縮の仕方は android:scaleType プロパティ (XML) または setScaleType メソッド - 例えば ScaleType.CENTER は画像を伸ばさず、元の大きさのまま中央に配置します。

あなたは ScrollView を以下のように修正すると、スクロールを無効にすることができます。

class LockableScrollView extends ScrollView {

    ...

    // true if we can scroll (not locked)
    // false if we cannot scroll (locked)
    private boolean mScrollable = true;

    public void setScrollingEnabled(boolean enabled) {
        mScrollable = enabled;
    }

    public boolean isScrollable() {
        return mScrollable;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // if we can scroll pass the event to the superclass
                return mScrollable && super.onTouchEvent(ev);
            default:
                return super.onTouchEvent(ev);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        // Don't do anything with intercepted touch events if
        // we are not scrollable
        return mScrollable && super.onInterceptTouchEvent(ev);
    }

}

次に

<com.mypackagename.LockableScrollView 
    android:id="@+id/QuranGalleryScrollView" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent">

    <Gallery android:id="@+id/Gallery" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:scrollbars="horizontal">
    </Gallery>

</com.mypackagename.LockableScrollView>

をXMLファイルに追加してください。 ScrollView を特別な LockableScrollView ).

次に

((LockableScrollView)findViewById(R.id.QuranGalleryScrollView)).setScrollingEnabled(false);

でビューのスクロールを無効にします。

私は、あなたが望む結果を得るためには、スクロールを無効にするという問題以上のものがあると思います(例えば、上記のコードではギャラリーはスクロール可能なままです) - 私は、3つのコンポーネント(ギャラリー、ScrollView、ImageView)それぞれについて、それぞれがどんなプロパティを持っていてどう動作するかをもう少し調査することをお勧めします。