Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否以编程方式禁用ScrollView?_Android_Android Scrollview - Fatal编程技术网

Android 是否以编程方式禁用ScrollView?

Android 是否以编程方式禁用ScrollView?,android,android-scrollview,Android,Android Scrollview,我想启用ScrollView并通过单击按钮禁用它。 禁用意味着如果ScrollView不在那里,启用则返回ScrollView 我想要它,因为我有一个带有文本图像的图库,在一个按钮上单击屏幕方向会改变,所以在横向中文本会变大。我想要滚动视图,这样图像就不会自我拉伸,文本就变得不可读了 scrollview.Enabled=false/setVisibility(false)不做任何事情 xml: 但是图库中的图像仍然是可滚动的,不适合屏幕。此问题的解决方案是什么?如中所示,您不能将可见性设置为f

我想启用ScrollView并通过单击按钮禁用它。
禁用意味着如果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);

要使滚动条在按钮上未启用,请单击以下几点开始:

  • 不能禁用滚动视图的滚动。您需要扩展到ScrollView并覆盖
    onTouchEvent
    方法,以便在某些条件匹配时返回
    false
  • Gallery组件水平滚动,无论它是否在ScrollView中-ScrollView仅提供垂直滚动(水平滚动需要水平滚动视图)
  • 您似乎说图像拉伸本身有问题——这与ScrollView无关,您可以使用
    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