以编程方式禁用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?

几点开始:

  1. 您不能禁用ScrollView的滚动。 您需要扩展到ScrollView,并重写onTouchEvent方法,以便在匹配条件时返回false
  2. 不pipe是否在ScrollView中,Gallery组件都是水平滚动的 – ScrollView只提供垂直滚动(你需要一个Horizo​​ntalScrollView用于水平滚动)
  3. 您似乎认为自己的图像伸缩有问题 – 这与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 OnTouchListeneronTouch() ,如果您想要通过触摸绕过滚动,则返回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点击时不会启用