Android 是否以编程方式禁用ScrollView?
我想启用ScrollView并通过单击按钮禁用它。Android 是否以编程方式禁用ScrollView?,android,android-scrollview,Android,Android Scrollview,我想启用ScrollView并通过单击按钮禁用它。 禁用意味着如果ScrollView不在那里,启用则返回ScrollView 我想要它,因为我有一个带有文本图像的图库,在一个按钮上单击屏幕方向会改变,所以在横向中文本会变大。我想要滚动视图,这样图像就不会自我拉伸,文本就变得不可读了 scrollview.Enabled=false/setVisibility(false)不做任何事情 xml: 但是图库中的图像仍然是可滚动的,不适合屏幕。此问题的解决方案是什么?如中所示,您不能将可见性设置为f
禁用意味着如果ScrollView不在那里,启用则返回ScrollView 我想要它,因为我有一个带有文本图像的图库,在一个按钮上单击屏幕方向会改变,所以在横向中文本会变大。我想要滚动视图,这样图像就不会自我拉伸,文本就变得不可读了
scrollview.Enabled=false/setVisibility(false)
不做任何事情
xml:
但是图库中的图像仍然是可滚动的,不适合屏幕。此问题的解决方案是什么?如中所示,您不能将可见性设置为false。在您的情况下,您可能应该使用:
scrollview.setVisibility(Visibility.GONE);
这有用吗
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);
在按钮上单击listener就可以了
ScrollView sView = (ScrollView)findViewById(R.id.ScrollView01);
sView.setVerticalScrollBarEnabled(false);
sView.setHorizontalScrollBarEnabled(false);
要使滚动条在按钮上未启用,请单击以下几点开始:
onTouchEvent
方法,以便在某些条件匹配时返回false
android:scaleType
属性(XML)更改ImageView的缩放方式或者使用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>
禁用视图的滚动
我认为你不仅仅是为了达到你想要的结果而禁用滚动的问题(例如,图库将使用上面的代码保持滚动)-我建议对三个组件(图库、滚动视图、图像视图)中的每一个进行更多的研究查看每个属性及其行为。这里有一个更简单的解决方案。覆盖
滚动视图的onTouch()
onTouch Listener
,如果要通过触摸绕过滚动,则返回false。编程滚动仍然有效,无需扩展ScrollView
类
@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);
}
}
mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return isScrollable;
}
});
我没有足够的分数来评论一个答案,但我想说的是,mikec的答案对我来说是有效的,除了我必须改变它才能返回!可以这样做:
mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return !isScrollable;
}
});
您可以在需要时扩展库并使用某些标志来禁用滚动:
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;
}
}
@Josepheral+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);
}
main活动:
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.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return isBlockedScrollView;
}
});
取消混合滚动视图
ScrollView sw = (ScrollView) findViewById(R.id.scrollView1);
sw.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
找到了这个简单的解决方案
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);
但是它说,setiscrowllable是未定义的
我希望这将帮助您我在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
您可以将CustomScrollView作为父视图添加到要将另一个Scrollview添加为子视图的屏幕中,整个屏幕是可滚动的。我用这个做相亲
<?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>
#**在这里面我有一个TableLayout和TableRow。在桌子里**
#**我有一个TextView,我用Java代码使它可以滚动**
#**setMovementMethod(新的ScrollingMovementMethod())**
这对我的案子很有效。我可能会迟到,但还是
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);
}
}
这个答案基于动态删除和添加视图
要禁用滚动,请执行以下操作:
View child = scoll.getChildAt(0);// since scrollView can only have one direct child
ViewGroup parent = (ViewGroup) scroll.getParent();
scroll.removeView(child); // remove child from scrollview
parent.addView(child,parent.indexOfChild(scroll));// add scroll child at the position of scrollview
parent.removeView(scroll);// remove scrollView from parent
要启用ScrollView,只需反向操作即可这也会隐藏图库,因此这不是解决方案,我编辑了文章并提供了更多详细信息。这只会隐藏我猜的条形图。。但不是ScrollView的效果它不允许你滚动也不会隐藏gallery视图我不认为它有任何区别,我仍然有相同的问题类的外观:但我得到错误“LockableScrollView类型的onTouch(View,MotionEvent)方法必须覆盖或实现一个超类型方法”抱歉,更正了我代码中的错误-应该是onTouchEvent(MotionEvent ev)
Ok现在代码符合要求了,不过当我运行应用程序时它崩溃了。。。当我删除这个类并返回Hi-Omar时,你能发布你得到的错误吗?确保将com.mypackagename改为您自己的oneGood答案。如果您将case MotionEvent.ACTION\u DOWN:更改为case MotionEvent.ACTION\u MOVE:case MotionEvent.ACTION\u DOWN:您还可以在拖动时禁用滚动。但这当然取决于每个人需要如何使用它。requestDisallowerWinterCeptTouchEvent
只适用于锁定视图的子视图。所以它更像是mLinearLayout.requestDisallowWinterCeptTouchEvent(true)代码>简单,效果很好。关键点是使用变量(例如isBlockedScrollView)来控制何时启用滚动。当允许滚动时将其设置为true,否则设置为false。@PeteH,我不知道为什么,但我的ListView
的工作方式正好相反:当滚动被禁用时为true,当滚动被启用时为false。@Holmes
View child = scoll.getChildAt(0);// since scrollView can only have one direct child
ViewGroup parent = (ViewGroup) scroll.getParent();
scroll.removeView(child); // remove child from scrollview
parent.addView(child,parent.indexOfChild(scroll));// add scroll child at the position of scrollview
parent.removeView(scroll);// remove scrollView from parent