프로그래밍 방식으로 ScrollView를 비활성화 하시겠습니까? 있기 때문에 가시성 (사라짐)을 사용할 수 없습니다.

ScrollView를 활성화하고 버튼 클릭으로 비활성화하고 싶습니다.
Disable은 ScrollView가없는 경우와 같습니다. 활성화하면 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>

감사

Edit1 : 갤러리를 숨길 수도 있기 때문에 가시성 (사라짐)을 사용할 수 없습니다. 원하는 것은 ScrollView의 효과를 숨기는 것입니다. ScrollView가있을 때 Gallery의 이미지가 scrollabale이되고 화면에 맞지 않으므로 전체 이미지를 보려면 스크롤해야하므로 버튼 클릭으로 비활성화 / 활성화하고 싶지 않습니다.

나는 이것을 시도했다 :

((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. Gallery 구성 요소는 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);

보기 스크롤을 비활성화합니다.

원하는 결과를 얻기 위해 스크롤을 비활성화하는 것 이상의 문제가 있다고 생각합니다 (예 : 위의 코드를 사용하여 갤러리는 스크롤 할 수 있음). 세 가지 구성 요소 (갤러리, 갤러리)에 대해 더 많은 연구를 수행하는 것이 좋습니다. ScrollView, ImageView)를 사용하여 각각의 속성과 작동 방식을 확인합니다.


답변

나는 이렇게 갔다.

        scrollView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return isBlockedScrollView;
        }
    });


답변

이 간단한 솔루션이 방금 설정되었습니다.

ScrollView.requestDisallowInterceptTouchEvent(true);


답변

ScrollView 비활성화

ScrollView sw = (ScrollView) findViewById(R.id.scrollView1);
sw.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});


답변

시작하려면 첫 번째 댓글에 게시 된 코드를 사용했지만 다음과 같이 변경했습니다.

    public class LockableScrollView extends ScrollView {

    public LockableScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }
    public LockableScrollView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public LockableScrollView(Context context)
    {
        super(context);
    }

    // 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
                if (mScrollable) return super.onTouchEvent(ev);
                // only continue to handle the touch event if scrolling enabled
                return mScrollable; // mScrollable is always false at this point
            default:
                return super.onTouchEvent(ev);
        }
    }



@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // if we can scroll pass the event to the superclass      
        if (mScrollable) return super.onInterceptTouchEvent(ev);
        // only continue to handle the touch event if scrolling enabled    
        return mScrollable; // mScrollable is always false at this point     
        default:
            return super.onInterceptTouchEvent(ev);
            }
    }

}

그런 다음 나는 이것을 이렇게 불렀다.

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

내가 시도했기 때문에

((LockableScrollView)findViewById(R.id.scrollV)).setIsScrollable(false);

그러나 그것은 setIsScrollable 이 정의되지 않았다고 말했습니다.

이게 도움이 되길 바랍니다


답변

여기에 더 간단한 해결책이 있습니다. 터치로 스크롤을 건너 뛰려면 onTouch()for를 재정의하고 ScrollView OnTouchListenerfalse를 반환합니다. 프로그래밍 방식 스크롤은 여전히 ​​작동하며 ScrollView클래스 를 확장 할 필요가 없습니다 .

mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
  return isScrollable;
}
});


답변

답변에 대해 언급 할 포인트가 충분하지 않지만 mikec의 답변이 저에게 효과적이라고 말하고 싶었습니다.! isScrollable을 다음과 같이 반환하도록 변경해야했습니다.

mScroller.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      return !isScrollable;
    }
});