以编程方式禁用ScrollView?
我想启用ScrollView并通过button单击来禁用它。
禁用意味着像ScrollView wasnt那里..并启用它返回ScrollView ..
我想这是因为我有一个画廊与文字图像,并在一个button上点击屏幕方向的变化,所以在景观文字变得更大..我希望滚动视图,因此图像没有伸展自我和文本变得不可读。
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>
谢谢
编辑1:我不能使用可见性(不见了),因为这也会隐藏画廊,我想要的是隐藏的滚动视图的效果..当有滚动浏览图库中的图像成为scrollabale,不适合在屏幕上,所以你有滚动来看到整个图像,我不想禁用/启用button点击..我试过这个:
((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);
但仍然图库中的图像滚动,不适合屏幕..这是什么解决scheme?
几点开始:
- 您不能禁用ScrollView的滚动。 您需要扩展到ScrollView,并重写
onTouchEvent
方法,以便在匹配条件时返回false
。 - 不pipe是否在ScrollView中,Gallery组件都是水平滚动的 – ScrollView只提供垂直滚动(你需要一个HorizontalScrollView用于水平滚动)
- 您似乎认为自己的图像伸缩有问题 – 这与ScrollView无关,您可以更改ImageView与
android:scaleType
属性(XML)或setScaleType
方法的ScaleType.CENTER
,例如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 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) { // Don't do anything with intercepted touch events if // we are not scrollable if (!mScrollable) return false; else return 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);
禁用视图的滚动。
我认为你不仅仅是禁用滚动的问题来实现你想要的结果(例如,画廊仍然可以通过上面的代码进行滚动) – 我build议对这三个组件(Gallery, ScrollView,ImageView)来查看每个属性的属性以及它的行为。
我走了这条路:
scrollView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return isBlockedScrollView; } });
find这个简单的解决scheme,
ScrollView.requestDisallowInterceptTouchEvent(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是未定义的
我希望这会帮助你
禁用ScrollView
ScrollView sw = (ScrollView) findViewById(R.id.scrollView1); sw.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });
这是一个更简单的解决scheme。 覆盖ScrollView
OnTouchListener
的onTouch()
,如果您想要通过触摸绕过滚动,则返回false。 编程滚动仍然有效,不需要扩展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; } });
@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他有一个很好的解决scheme,这对我来说完美的工作,做一些小的修改,以编程方式。
以下是我所做的小改动:
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); }
这有帮助吗?
((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; } }
我对NestedScrollView进行了布局,消耗了触摸事件并禁用了滚动:
progressBarLayout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return true; } });
并启用:
progressBarLayout.setOnTouchListener(null);
您可以创build一个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?
您可以将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>
它为我的情况工作。
正如您在文档中看到的,您不能将可见性设置为false。 在你的情况下,你应该使用:
scrollview.setVisibility(Visibility.GONE);
在button上点击监听器就行了
ScrollView sView = (ScrollView)findViewById(R.id.ScrollView01); sView.setVerticalScrollBarEnabled(false); sView.setHorizontalScrollBarEnabled(false);
这样滚动条在button点击时不会启用