स्क्रॉल करें प्रोग्रामेटिक रूप से अक्षम करें?


108

मैं स्क्रॉल दृश्य को सक्षम करना चाहूंगा और इसे एक बटन क्लिक द्वारा अक्षम कर सकता हूं।
अगर इसका मतलब है कि स्क्रॉलव्यू नहीं था, तो इसे अक्षम करें .. और इसे स्क्रॉल दृश्य वापस करने में सक्षम करें।

मैं चाहता हूं कि क्योंकि मेरे पास पाठ छवियों के साथ एक गैलरी है, और एक बटन पर स्क्रीन उन्मुखीकरण परिवर्तनों पर क्लिक करें, इसलिए लैंडस्केप में पाठ बड़ा हो जाता है। और मैं स्क्रॉल दृश्य चाहता हूं ताकि छवि अपने आप न खिंचे और पाठ अप्राप्य हो जाए।

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)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);

लेकिन फिर भी गैलरी में चित्र स्क्रॉल करने योग्य हैं और स्क्रीन पर फिट नहीं हैं .. इसका समाधान क्या है?

जवाबों:


187

के साथ शुरू करने के लिए कई बिंदु:

  1. आप एक स्क्रॉल दृश्य की स्क्रॉलिंग को अक्षम नहीं कर सकते। आपको स्क्रॉल दृश्य में विस्तार करने और कुछ स्थिति के मिलान होने onTouchEventपर वापस लौटने की विधि को ओवरराइड करने की आवश्यकता होगी false
  2. गैलरी घटक क्षैतिज रूप से स्क्रॉल करता है चाहे वह स्क्रॉल दृश्य में हो या नहीं - एक स्क्रॉल दृश्य केवल ऊर्ध्वाधर स्क्रॉल प्रदान करता है (आपको क्षैतिज स्क्रॉलिंग के लिए क्षैतिज क्षैतिज नियंत्रण की आवश्यकता है)
  3. आपको लगता है कि आपको अपने आप को स्ट्रेच करने वाली छवि में कोई समस्या है - इसका स्क्रॉलव्यू से कोई लेना-देना नहीं है, आप यह बदल सकते हैं कि कैसे एक छवि दृश्य android:scaleTypeगुण (XML) या 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>

अपनी XML फ़ाइल में (बस ScrollViewअपने विशेष में बदल दिया LockableScrollView)।

फिर कॉल करो

((LockableScrollView)findViewById(R.id.QuranGalleryScrollView)).setScrollingEnabled(false);

दृश्य की स्क्रॉलिंग को अक्षम करने के लिए।

मुझे लगता है कि आपके पास अपने इच्छित परिणाम प्राप्त करने के लिए स्क्रॉलिंग को अक्षम करने के मुद्दे से अधिक है (उदाहरण के लिए गैलरी उपरोक्त कोड के साथ स्क्रॉल करने योग्य रहेगी) - मैं तीन घटकों में से प्रत्येक पर कुछ अधिक शोध करने की सलाह दूंगा (गैलरी) स्क्रॉलव्यू, इमेजव्यू) यह देखने के लिए कि प्रत्येक के पास क्या गुण हैं और यह कैसे व्यवहार करता है।


यहां तरीका देखें: वर्ग दिखता है pastebin.com/dsWSWR4x लेकिन मैं त्रुटि 'प्रकार LockableScrollView की विधि onTouch (देखें, MotionEvent) ओवरराइड या एक महाप्रकार विधि को लागू करना चाहिए' मिल
उमर

माफी, मेरे कोड में त्रुटियों को ठीक किया - यह होना चाहिए थाonTouchEvent(MotionEvent ev)
यूसुफ अर्ल

1
ठीक है अब कोड अनुपालन करता है, हालांकि जब मैं एप्लिकेशन चलाता हूं तो यह दुर्घटनाग्रस्त हो जाता है ... और जब मैं इस वर्ग को हटाता हूं और आपकी कक्षा के बजाय <स्क्रॉल दृश्य वापस करता है तो एप्लिकेशन ठीक काम करता है!
उमर

हाय उमर क्या आप त्रुटि प्राप्त कर सकते हैं? सुनिश्चित करें कि com.mypackagename को <com.mypackagename.LockableScrollView> में अपने स्वयं के लिए बदलें
यूसुफ अर्ल

1
अच्छा उत्तर। यदि आप केस में बदलाव करते हैं MotionEvent.ACTION_DOWN: to case MotionEvent.ACTION_MOVE: केस MotionEvent.ACTION_DOWN: आप स्क्रॉल करते समय स्क्रॉल को भी अक्षम कर पाएंगे। लेकिन यह निश्चित रूप से सभी पर है कि उसे इसका उपयोग कैसे करना है।
लुकी

70

मैं इस तरह से गया था:

        scrollView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return isBlockedScrollView;
        }
    });

3
सरल और महान काम करता है। जब आप स्क्रॉलिंग को सक्षम करना चाहते हैं तो नियंत्रण के लिए एक चर (जैसे, islockedScrollView) का उपयोग करना महत्वपूर्ण बिंदु है। इसे सच पर सेट करें जब स्क्रॉल करने की अनुमति दी जानी चाहिए और अन्यथा गलत होना चाहिए।
पेटे

5
@ पेथे, मुझे नहीं पता कि क्यों, लेकिन मेरा ListViewकाम इसके विपरीत है: जब सक्षम किया जाता है तो स्क्रॉल अक्षम और गलत होता है।
मचाडो

@ होम्स: आप सही हैं, सच है जब आप स्क्रॉलिंग को ब्लॉक करना चाहते हैं
लिली

1
खूबसूरती से काम करता है। इसके अलावा, मेरे पास स्क्रॉलव्यू के भीतर बच्चों के विचार (बटन) हैं और मैं अभी भी उनके साथ बातचीत कर सकता हूं, इसके बावजूद onInceptceptTouchEvent () में नहीं! सुरुचिपूर्ण समाधान।
कोडी

1
@ माचाडो स्क्रॉलिंग को ब्लॉक करने के लिए आपको सही कारण बताना चाहिए क्योंकि टच श्रोता यह निर्धारित करने के लिए बूलियन वैल्यू लेता है कि टच ईवेंट का उपभोग किया जाना चाहिए या नहीं। यदि आप झूठे दृश्य को वापस लौटाते हैं तो स्क्रॉल इवेंट को उसके स्क्रॉल श्रोता के पास भेजने के लिए आगे बढ़ेंगे।
विंस

11

यह सरल समाधान बस सेट मिला

ScrollView.requestDisallowInterceptTouchEvent(true);

5
requestDisallowInterceptTouchEventकेवल दृश्य बंद किए जाने वाले बच्चे के लिए काम करता है । तो यह और अधिक पसंद होगाmLinearLayout.requestDisallowInterceptTouchEvent(true);
मग

6

स्क्रॉल स्क्रॉल देखें

ScrollView sw = (ScrollView) findViewById(R.id.scrollView1);
sw.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});

5

शुरू करने के लिए, मैंने पहली टिप्पणी में पोस्ट किए गए कोड का उपयोग किया लेकिन मैंने इसे इस तरह बदल दिया:

    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);

लेकिन यह कहा गया कि setIscrollable अपरिभाषित है

उम्मीद है इससे आपको मदद मिलेगी


नोट: यदि ScrollViewआपके लेआउट वर्ग का मुख्य लेआउट कंटेनर है तो पहले दो कंस्ट्रक्टरों की आवश्यकता है।
एक्टाराम

यदि आप एक बटन या किसी और चीज को छूते हैं जो पहले स्पर्श को रोकती है, तो
स्क्रॉलव्यू

3

यहाँ एक सरल उपाय है। के onTouch()लिए ओवरराइड करें ScrollView OnTouchListenerऔर यदि आप टच द्वारा स्क्रॉल को बायपास करना चाहते हैं तो गलत लौटें। प्रोग्रामेटिक स्क्रॉल अभी भी काम करता है और ScrollViewकक्षा को विस्तारित करने की आवश्यकता नहीं है ।

mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
  return isScrollable;
}
});

1
; isScrollable क्योंकि सच्चा रिटर्न वैल्यू का मतलब है कि घटना इंटरसेप्टेड थी।
गो रॉन

3

मेरे पास एक उत्तर पर टिप्पणी करने के लिए पर्याप्त अंक नहीं हैं, लेकिन मैं यह कहना चाहता था कि मिकेक के उत्तर ने मेरे लिए काम किया, सिवाय इसके कि मुझे इसे वापस करने के लिए बदलना पड़ा!

mScroller.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      return !isScrollable;
    }
});

1
@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);      
            }
    }

1

@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);
}

1

मेरे पास NestedScrollView पर एक लेआउट था जो टच इवेंट का उपभोग करता था और स्क्रॉल को अक्षम करता था:

progressBarLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return true;
            }
        });

और सक्षम करने के लिए:

progressBarLayout.setOnTouchListener(null);

1

आप एक 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>

इसने मेरे केस के लिए काम किया।


1
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);
    }
}

0

क्या यह मदद करता है?

((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);

1
मुझे नहीं लगता कि इससे कोई अंतर आया, मेरे पास अभी भी एक ही मुद्दा है
उमर

0

आप गैलरी का विस्तार कर सकते हैं और जब चाहें स्क्रॉल को अक्षम करने के लिए कुछ ध्वज का उपयोग कर सकते हैं:

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;
}
}

-3

जैसा कि आप प्रलेखन में देख सकते हैं , आप दृश्यता को असत्य पर सेट नहीं कर सकते। आपके मामले में आपको संभवतः उपयोग करना चाहिए:

scrollview.setVisibility(Visibility.GONE);

2
यह गैलरी को भी छिपाएगा इसलिए इसका समाधान नहीं है, मैंने पोस्ट को अधिक विवरण के साथ संपादित किया
उमर

-6

बटन पर क्लिक करें श्रोता बस करो

ScrollView sView = (ScrollView)findViewById(R.id.ScrollView01);

sView.setVerticalScrollBarEnabled(false);
sView.setHorizontalScrollBarEnabled(false);

ताकि बटन क्लिक पर स्क्रॉल बार सक्षम न हो


2
यह केवल मुझे लगता है कि सलाखों को छुपाता है .. लेकिन स्क्रोलव्यू का प्रभाव नहीं
उमर

1
यह आपको स्क्रॉल करने की भी अनुमति नहीं देगा, यह गैलरी दृश्य को नहीं छिपाएगा
सुमंत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.