프로그래밍 방식으로 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);
하지만 여전히 갤러리의 이미지는 스크롤이 가능하고 화면에 맞지 않습니다. 이에 대한 해결책은 무엇입니까?
시작해야 할 몇 가지 사항 :
- ScrollView의 스크롤을 비활성화 할 수 없습니다. ScrollView로 확장하고 일부 조건이 일치 할 때
onTouchEvent
반환false
할 메서드를 재정의해야합니다 . - Gallery 구성 요소는 ScrollView에 있는지 여부에 관계없이 가로로 스크롤됩니다. ScrollView는 세로 스크롤 만 제공합니다 (가로 스크롤에는 HorizontalScrollView가 필요함).
- 이미지 자체 확장에 문제가 있다고 말하는 것 같습니다. 이것은 ScrollView와 관련이 없습니다.
android:scaleType
속성 (XML) 또는setScaleType
메서드를 사용하여 ImageView가 확장되는 방식을 변경할 수 있습니다. 예를 들어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 이 정의되지 않았다고 말했습니다.
이게 도움이 되길 바랍니다
답변에 대해 언급 할 포인트가 충분하지 않지만 mikec의 답변이 저에게 효과적이라고 말하고 싶었습니다.! isScrollable을 다음과 같이 반환하도록 변경해야했습니다.
mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return !isScrollable;
}
});
여기에 더 간단한 해결책이 있습니다. 터치로 스크롤을 건너 뛰려면 onTouch()
for를 재정의하고 ScrollView
OnTouchListener
false를 반환합니다. 프로그래밍 방식 스크롤은 여전히 작동하며 ScrollView
클래스 를 확장 할 필요가 없습니다 .
mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return isScrollable;
}
});
@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);
}
}
@JosephEarl +1 그는 프로그래밍 방식으로 수행하기 위해 약간의 수정으로 저에게 완벽하게 작동하는 훌륭한 솔루션을 가지고 있습니다.
내가 만든 사소한 변경은 다음과 같습니다.
LockableScrollView 클래스 :
public boolean setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
return mScrollable;
}
주요 활동:
LockableScrollView sv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sv = new LockableScrollView(this);
sv.setScrollingEnabled(false);
}
터치 이벤트를 사용하는 NestedScrollView 위에 레이아웃이 있고 스크롤을 비활성화했습니다.
progressBarLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return true;
}
});
활성화하려면 :
progressBarLayout.setOnTouchListener(null);
다른보기와의 간섭을 비활성화 할 수있는 CustomScrollView를 만들 수 있습니다. 이것은 때때로 최종 사용자에게 짜증이 날 수 있습니다. 주의해서 사용하십시오.
다음은 코드입니다.
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewParent;
public class CustomScrollView extends android.widget.ScrollView {
public CustomScrollView(Context context) {
super(context);
}
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
/* Prevent parent controls from stealing our events once we've gotten a touch down */
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN)
{
ViewParent p = getParent();
if (p != null)
p.requestDisallowInterceptTouchEvent(true);
}
return false;
}
}
CustomScrollView를 사용하는 방법?
다른 Scrollview를 자식보기로 추가하려는 화면에 CustomScrollView를 부모로 추가 할 수 있으며 전체 화면을 스크롤 할 수 있습니다. 나는 이것을 RelativeLayout에 사용했습니다.
<?xml version="1.0" encoding="utf-8"?>
<**package.**CustomScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/some_id"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:tools="http://schemas.android.com/tools">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
#**Inside this I had a TableLayout and TableRow. Inside the TableRow,**
#**I had a TextView which I made scrollable from Java Code.**
#**textView.setMovementMethod(new ScrollingMovementMethod());**
</RelativeLayout>
</ankit.inventory.ankitarora.inventorymanagementsimple.CustomScrollView>
제 경우에는 효과가있었습니다.
public class LockableScrollView extends ScrollView {
private boolean mScrollable = true;
public LockableScrollView(Context context) {
super(context);
}
public LockableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setScrollable(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return mScrollable && super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mScrollable && super.onInterceptTouchEvent(ev);
}
}
도움이 되나요?
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);
갤러리를 확장하고 원하는 경우 일부 플래그를 사용하여 스크롤을 비활성화 할 수 있습니다.
public class MyGallery extends Gallery {
public boolean canScroll;
public MyGallery(Context context, AttributeSet attrs) {
canScroll = true;
super(context, attrs);
}
public void setCanScroll(boolean flag)
{
canScroll = flag;
}
@Override
public boolean onScroll(android.view.MotionEvent e1, android.view.MotionEvent e2, float distanceX, float distanceY) {
if (canScroll)
return super.onScroll(e1,e2,distancex,distancey);
else
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e)
{
if (canScroll)
return super.onSingleTapUp(ey);
else
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
if (canScroll)
return super.onFling(e1,e2,velocityX,velocityY);
else
return false;
}
}
문서 에서 볼 수 있듯이 가시성을 false로 설정할 수 없습니다. 귀하의 경우에는 다음을 사용해야합니다.
scrollview.setVisibility(Visibility.GONE);
버튼 클릭 리스너에서
ScrollView sView = (ScrollView)findViewById(R.id.ScrollView01);
sView.setVerticalScrollBarEnabled(false);
sView.setHorizontalScrollBarEnabled(false);
버튼 클릭시 스크롤바가 활성화되지 않도록
참고URL : https://stackoverflow.com/questions/5763304/disable-scrollview-programmatically
'programing' 카테고리의 다른 글
JavaScript를 사용하여 스크롤 막대 너비 가져 오기 (0) | 2020.08.17 |
---|---|
Regex를 사용하여 Javascript에서 HTML 태그 제거 (0) | 2020.08.17 |
SSL을 사용하는 Apache-CER를 CRT 인증서로 변환하는 방법은 무엇입니까? (0) | 2020.08.17 |
부울 연산자의 차이점 : & 대 && 및 | (0) | 2020.08.17 |
PHP 날짜를 포함하는 요소로 다차원 배열 정렬 (0) | 2020.08.17 |