স্ক্রোলভিউ প্রোগ্রামযুক্তভাবে অক্ষম করবেন?


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>

ধন্যবাদ

সম্পাদনা 1: আমি দৃশ্যমানতা ব্যবহার করতে পারি না (চলে গেছে) যেহেতু এটি গ্যালারীটিও লুকিয়ে রাখবে, আমি যা চাই তা স্ক্রোলভিউয়ের প্রভাবটি আড়াল করা। যখন গ্যালারীটিতে স্ক্রোলভিউ রয়েছে তখন চিত্রগুলি স্ক্রোলবেলে পরিণত হয় এবং স্ক্রিনে ফিট না করে যাতে আপনাকে পুরো চিত্রটি দেখতে স্ক্রোল করতে হয়, আমি বাটন ক্লিকে এটিকে অক্ষম / সক্ষম করতে চাই না।

আমি এটি চেষ্টা করেছি:

((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সম্পত্তি (এক্সএমএল) বা 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);

দেখার স্ক্রোলিং অক্ষম করতে।

আমি মনে করি যে আপনার পছন্দসই ফলাফল অর্জন করার জন্য আপনার কাছে কেবল স্ক্রোলিং অক্ষম করার বিষয়টি ছাড়াও আরও কিছু রয়েছে (উদাহরণস্বরূপ গ্যালারী উপরের কোডের সাথে স্ক্রোলযোগ্য থাকবে) - আমি তিনটি উপাদানের প্রত্যেকটিতে আরও কিছু গবেষণা করার পরামর্শ দেব (গ্যালারী, প্রত্যেকের কী কী বৈশিষ্ট্য রয়েছে এবং এটি কীভাবে আচরণ করে তা দেখতে স্ক্রোলভিউ, ইমেজভিউ)।


এখানে শ্রেণিটি কেমন দেখাচ্ছে: পেস্টবিন.এসডিএসএসএসআরআর 4x তবে ত্রুটিটি পেয়েছি 'লকএবলস্ক্রোলভিউ টাইপ-এর পদ্ধতি অনটিউচ (দেখুন, মোশনইভেন্ট) অবশ্যই একটি সুপার টাইপ পদ্ধতি ওভাররাইড বা প্রয়োগ করতে হবে'
ওমর

দুঃখিত, আমার কোডে ত্রুটিগুলি সংশোধন করে - এটি হওয়া উচিত ছিলonTouchEvent(MotionEvent ev)
জোসেফ আর্ল

1
ঠিক আছে এখন কোডটি মেনে চলে, যদিও আমি অ্যাপটি চালানোর সময় এটি ক্রাশ হয়ে যায় ... এবং যখন আমি এই ক্লাসটি সরিয়ে ফেলি এবং আপনার ক্লাসের পরিবর্তে <স্ক্রোলভিউটি ফিরিয়ে দেব অ্যাপ্লিকেশনটি ভাল কাজ করে!
ওমর

হাই ওমর আপনি যে ত্রুটি পেয়েছেন তা কি পোস্ট করতে পারেন? নিশ্চিত করুন যে <com.mypackagename.LockableScrolView> এ com.mypackagename আপনার নিজের নিজের থেকে তৈরি করুন
জোসেফ আর্ল

1
ভাল উত্তর. আপনি কেস মোশনএভেন্ট.অ্যাকশন_ডাউন: কেস মোশনএভেন্ট.অ্যাকশন_মোভ: কেস মোশনইভেন্ট.অ্যাকশন_ডাউন: যদি আপনি টেনে আনার সময়ও স্ক্রোল অক্ষম করতে সক্ষম হবেন। তবে এটি কীভাবে এটি ব্যবহার করা প্রয়োজন তা সবার উপরে রয়েছে।
লুকি

70

আমি এই পথে চলে গিয়েছিলাম:

        scrollView.setOnTouchListener(new View.OnTouchListener() {

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

3
সাধারণ এবং দুর্দান্ত কাজ করে। মূল বিষয় হ'ল আপনি যখন স্ক্রোলিং সক্ষম করতে চান তখন নিয়ন্ত্রণ করতে একটি ভেরিয়েবল (যেমন, ব্লকস্ক্রোলভিউ) ব্যবহার করা। এটিকে সত্যতে সেট করুন যখন স্ক্রোলিংয়ের অনুমতি দেওয়া উচিত এবং অন্যথায় মিথ্যা।
পিটএইচ

5
@ পিটএইচ, আমি জানি না কেন, তবে আমার ListViewবিপরীত উপায়ে কাজ করে: সত্য যখন স্ক্রোলিং অক্ষম থাকে এবং যখন এটি সক্ষম হয় তখন মিথ্যা।
মাচাডো

@ হোমস: আপনি ঠিক, সত্য আপনি যখন স্ক্রোলিং ব্লক করতে চান
লিলি

1
সুন্দরভাবে কাজ করে A এছাড়াও, স্ক্রোলভিউয়ের মধ্যে আমার বাচ্চার দৃষ্টিভঙ্গি (বোতাম) রয়েছে এবং আমি এখনও তাদের সাথে ইন্টারঅ্যাক্ট করতে পারি ইনটারসেপ্টটাইচ ()! মার্জিত সমাধান।
কোডি

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

}

তাহলে আমি এটিকে এটিকে ডাকলাম called

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

কারণ আমি চেষ্টা করেছি

((LockableScrollView)findViewById(R.id.scrollV)).setIsScrollable(false);

কিন্তু এটা বলেন যে setIsScrollable অনির্ধারিত হয়

আমি আশা করি এটা তোমাকে সাহায্য করবে


দ্রষ্টব্য: ScrollViewআপনার লেআউট ক্লাসের প্রধান লেআউট ধারক হলে প্রথম দুটি কনস্ট্রাক্টর প্রয়োজন ।
অ্যাক্টরম

আপনি যদি কোনও বোতাম বা অন্য কোনও কিছু স্পর্শ করেন যা প্রথমে স্পর্শগুলিকে বাধা দেয় তবে
স্ক্রোলভিউটি

3

এখানে একটি সহজ সমাধান। এর onTouch()জন্য ওভাররাইড করুন ScrollView OnTouchListenerএবং যদি আপনি স্পর্শ করে স্ক্রলটিকে বাইপাস করতে চান তবে মিথ্যা প্রত্যাবর্তন করুন। প্রোগ্রামমেটিক স্ক্রোলিং এখনও কাজ করে এবং ScrollViewক্লাস প্রসারিত করার প্রয়োজন নেই ।

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

1
! ইস্ক্রোলযোগ্য যেহেতু সত্যিকারের ফেরতের মান মানে ইভেন্টটি বাধা দেওয়া হয়েছিল।
goRGon

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

@ জোসেফারেল +1 এর এখানে একটি দুর্দান্ত সমাধান রয়েছে যা প্রোগ্রামের মাধ্যমে এটি করার জন্য কিছুটা ছোটখাট পরিবর্তন করে আমার জন্য নিখুঁতভাবে কাজ করেছিল।


আমি যে ছোট ছোট পরিবর্তনগুলি করেছি তা এখানে:

লকএবলস্ক্রোলভিউ ক্লাস:

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

নেস্টেডস্ক্রোলভিউয়ের উপরে আমার একটি বিন্যাস ছিল যা টাচ ইভেন্টটি গ্রহন করেছে এবং স্ক্রোলটি অক্ষম করেছে:

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

এবং সক্ষম করতে:

progressBarLayout.setOnTouchListener(null);

1

আপনি একটি কাস্টমস্ক্রোলভিউ তৈরি করতে পারেন, যার জন্য আপনি অন্যান্য দর্শনগুলির সাথে এর হস্তক্ষেপ অক্ষম করতে পারেন। যদিও এটি শেষ ব্যবহারকারীর জন্য মাঝে মাঝে বিরক্তিকর হতে পারে। সাবধানতার সাথে এটি ব্যবহার করুন।

এই কোড:

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

কীভাবে কাস্টমস্ক্রোলভিউ ব্যবহার করবেন?

আপনি যে স্ক্রিনে শিশু দৃষ্টিভঙ্গি হিসাবে অন্য একটি স্ক্রোলভিউ যুক্ত করতে চান তাতে আপনি কাস্টমস্ক্রোলভিউকে পিতামাতার হিসাবে যুক্ত করতে পারেন এবং পুরো স্ক্রিনটি স্ক্রোলযোগ্য। আমি এটি রিলেটিভলআউটের জন্য ব্যবহার করেছি।

<?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
এটি আপনাকে স্ক্রোল করতে দেয় না এটি গ্যালারী
ভিউটিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.