স্ক্রোলভিউ টাচ হ্যান্ডলিংয়ের মধ্যে অনুভূমিকস্ক্রোলভিউ


226

আমার একটি স্ক্রোলভিউ রয়েছে যা আমার পুরো লেআউটটিকে ঘিরে যাতে পুরো স্ক্রিনটি স্ক্রোলযোগ্য হয়। এই স্ক্রোলভিউতে আমার প্রথম উপাদানটি হরাইজেন্টালস্ক্রোলভিউ ব্লক যা এমন বৈশিষ্ট্যগুলি রয়েছে যা অনুভূমিকভাবে স্ক্রোল করা যায়। আমি স্পর্শ ইভেন্টগুলি পরিচালনা করতে এবং অ্যাকশন_আপ ইভেন্টের নিকটতম চিত্রটিতে "স্ন্যাপ" করতে বাধ্য করার জন্য অনুভূমিক স্ক্রোলভিউতে একটি অন্টচল্টিস্টার যুক্ত করেছি।

সুতরাং আমি যে প্রভাবটির জন্য যাচ্ছি তা হ'ল স্টক অ্যান্ড্রয়েড হোমস্ক্রিনের মতো যেখানে আপনি এক থেকে অন্যটিতে স্ক্রোল করতে পারেন এবং যখন আপনি আপনার আঙুলটি তুলবেন তখন এটি একটি স্ক্রিনে যায়।

এটি একটি সমস্যা ব্যতীত সমস্ত দুর্দান্ত কাজ করে: একটি ACTION_UP সর্বদা নিবন্ধ করার জন্য আমাকে বামে থেকে ডানে প্রায় পুরোপুরি অনুভূমিকভাবে সোয়াইপ করতে হবে। যদি আমি খুব স্বল্পত্বে উল্লম্বভাবে সোয়াইপ করি (যা আমি মনে করি যে পাশে থাকা লোকেরা সোয়াইপ করার সময় অনেক লোকই তাদের ফোনে ঝোঁক থাকে) তবে আমি একটি অ্যাকশন_আপের পরিবর্তে একটি অ্যাকশন_সিএনএসএল পাব। আমার তত্ত্বটি হ'ল এটি হ'ল কারণ দিগন্তের স্ক্রোলভিউ একটি স্ক্রোলভিউর মধ্যে রয়েছে এবং স্ক্রোলভিউ উল্লম্ব স্ক্রোলিংয়ের জন্য উল্লম্ব স্পর্শটিকে হাইজ্যাক করছে।

আমার অনুভূমিক স্ক্রোলভিউয়ের মধ্যে থেকে আমি কীভাবে স্ক্রোলভিউয়ের জন্য স্পর্শ ইভেন্টগুলি অক্ষম করতে পারি, তবে তবুও স্ক্রোলভিউয়ের অন্য কোথাও স্বাভাবিক উল্লম্ব স্ক্রোলিংয়ের অনুমতি দেব?

এখানে আমার কোডের একটি নমুনা রয়েছে:

   public class HomeFeatureLayout extends HorizontalScrollView {
    private ArrayList<ListItem> items = null;
    private GestureDetector gestureDetector;
    View.OnTouchListener gestureListener;
    private static final int SWIPE_MIN_DISTANCE = 5;
    private static final int SWIPE_THRESHOLD_VELOCITY = 300;
    private int activeFeature = 0;

    public HomeFeatureLayout(Context context, ArrayList<ListItem> items){
        super(context);
        setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        setFadingEdgeLength(0);
        this.setHorizontalScrollBarEnabled(false);
        this.setVerticalScrollBarEnabled(false);
        LinearLayout internalWrapper = new LinearLayout(context);
        internalWrapper.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        internalWrapper.setOrientation(LinearLayout.HORIZONTAL);
        addView(internalWrapper);
        this.items = items;
        for(int i = 0; i< items.size();i++){
            LinearLayout featureLayout = (LinearLayout) View.inflate(this.getContext(),R.layout.homefeature,null);
            TextView header = (TextView) featureLayout.findViewById(R.id.featureheader);
            ImageView image = (ImageView) featureLayout.findViewById(R.id.featureimage);
            TextView title = (TextView) featureLayout.findViewById(R.id.featuretitle);
            title.setTag(items.get(i).GetLinkURL());
            TextView date = (TextView) featureLayout.findViewById(R.id.featuredate);
            header.setText("FEATURED");
            Image cachedImage = new Image(this.getContext(), items.get(i).GetImageURL());
            image.setImageDrawable(cachedImage.getImage());
            title.setText(items.get(i).GetTitle());
            date.setText(items.get(i).GetDate());
            internalWrapper.addView(featureLayout);
        }
        gestureDetector = new GestureDetector(new MyGestureDetector());
        setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL ){
                    int scrollX = getScrollX();
                    int featureWidth = getMeasuredWidth();
                    activeFeature = ((scrollX + (featureWidth/2))/featureWidth);
                    int scrollTo = activeFeature*featureWidth;
                    smoothScrollTo(scrollTo, 0);
                    return true;
                }
                else{
                    return false;
                }
            }
        });
    }

    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                //right to left 
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    activeFeature = (activeFeature < (items.size() - 1))? activeFeature + 1:items.size() -1;
                    smoothScrollTo(activeFeature*getMeasuredWidth(), 0);
                    return true;
                }  
                //left to right
                else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    activeFeature = (activeFeature > 0)? activeFeature - 1:0;
                    smoothScrollTo(activeFeature*getMeasuredWidth(), 0);
                    return true;
                }
            } catch (Exception e) {
                // nothing
            }
            return false;
        }
    }
}

আমি এই পোস্টে সমস্ত পদ্ধতি চেষ্টা করেছি, কিন্তু সেগুলির কোনওোটাই আমার পক্ষে কাজ করে না। আমি MeetMe's HorizontalListViewগ্রন্থাগার ব্যবহার করছি ।
যাযাবর

এখানে কিছু অনুরূপ কোড ( HomeFeatureLayout extends HorizontalScrollView) সহ একটি নিবন্ধ রয়েছে velir.com/blog/index.php/2010/11/17/… কাস্টম স্ক্রোল শ্রেণিটি রচিত হওয়ায় কী চলছে সে সম্পর্কে কিছু অতিরিক্ত মন্তব্য রয়েছে।
সিজেবিএস

উত্তর:


280

আপডেট: আমি এটি বুঝতে পেরেছি। আমার স্ক্রোলভিউতে, ওয়াই মোশন> এক্স মোশনটি থাকলে কেবলমাত্র টাচের ইভেন্টটিকে বাধা দেওয়ার জন্য আমাকে অনির্সেপ্ট টাচ এভেন্ট পদ্ধতিটি ওভাররাইড করতে হবে। দেখে মনে হচ্ছে কোনও স্ক্রোলভিউর ডিফল্ট আচরণ হ'ল যখনই কোনও ওয়াই মোশন নেই তখন টাচ ইভেন্টটিকে বাধা দেওয়া। সুতরাং স্থিরতার সাথে, যদি স্ক্রোলভিউটি ইভেন্টটি কেবল তখনই বিরত রাখবে যদি ব্যবহারকারী ইচ্ছাকৃতভাবে Y দিকের দিকে স্ক্রল করে থাকে এবং সেই ক্ষেত্রে ACTION_CANCEL কে বাচ্চাদের কাছে দেয়।

আমার স্ক্রোল ভিউ ক্লাসের কোড এখানে হরাইজেন্টালস্ক্রোলভিউ রয়েছে:

public class CustomScrollView extends ScrollView {
    private GestureDetector mGestureDetector;

    public CustomScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mGestureDetector = new GestureDetector(context, new YScrollDetector());
        setFadingEdgeLength(0);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
    }

    // Return false if we're scrolling in the x direction  
    class YScrollDetector extends SimpleOnGestureListener {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {             
            return Math.abs(distanceY) > Math.abs(distanceX);
        }
    }
}

আমি এটি একই ব্যবহার করছি তবে এক্স দিকের দিকে স্ক্রোল করার সময় আমি ব্যতিক্রম পাচ্ছি পাবলিক বুলিয়ান অনুলিপিটিউচইভেন্ট (মোশনইভেন্ট ইভ) এ UL ফিরে আসুন সুপার.অনটারসেপ্টটিউচভেন্ট (এমও) এবং & জেস্টচারডেটেকটর.অনু স্পর্শ (ইও); } আমি
স্ক্রোলভিউয়ের

@ সমস্ত ধন্যবাদ এটি কাজ করছে, আমি স্ক্রোলভিউ কনস্ট্রাক্টরের অঙ্গভঙ্গি ডিটেক্টরটি শুরু করতে ভুলে গেছি
বিপিন সাহু

স্ক্রোলভিউয়ের মধ্যে ভিউপ্যাজার বাস্তবায়নের জন্য আমার এই কোডটি কীভাবে ব্যবহার করা উচিত
হর্ষ এমভি

এই কোডটি নিয়ে আমার কিছু সমস্যা ছিল যখন আমার এতে সর্বদা প্রসারিত গ্রিড ভিউ ছিল, কখনও কখনও এটি স্ক্রোল করে না। ডকুমেন্টেশন জুড়ে দেওয়া পরামর্শ অনুসারে সর্বদা সত্য প্রত্যাবর্তনের জন্য ওয়াইস্ক্রোলডিটেক্টরে অনডাউন (...) পদ্ধতিটি আমি ওভাররাইড করতে হয়েছিল (যেমন ডেভেলপার.অ্যান্ড্রয়েড / ট্রেনিং / কাস্টম-ভিউস / ৮ ) এটি আমার সমস্যার সমাধান করে।
নেমানজা কোভাসেভিক

3
আমি কেবল একটি ছোট বাগের মধ্যে দৌড়েছি যা উল্লেখযোগ্য worth আমি বিশ্বাস করি যে অনির্সেপ্ট টাচ এভেন্টের কোডটি দুটি বুলিয়ান কলকে আলাদা করে দেবে, mGestureDetector.onTouchEvent(ev)তার গ্যারান্টি দেওয়ার জন্য এটি কল হয়ে যাবে । এটি এখন super.onInterceptTouchEvent(ev)যেমন রয়েছে, মিথ্যা হলে এটি কল হবে না । আমি সবেমাত্র এমন একটি ক্ষেত্রে দৌড়েছি যেখানে স্ক্রোলভিউতে ক্লিকযোগ্য বাচ্চারা স্পর্শ ইভেন্টগুলি দখল করতে পারে এবং অনস্ক্রোলটি একেবারেই ডাকবে না। অন্যথায়, ধন্যবাদ, দুর্দান্ত উত্তর!
GLee

176

এই সমস্যাটি কীভাবে সমাধান করবেন সে সম্পর্কে আমাকে একটি ক্লু দেওয়ার জন্য জোয়েলকে ধন্যবাদ জানাই।

একই প্রভাবটি অর্জনের জন্য আমি কোডটি ( গেসচারডেক্টর প্রয়োজন ছাড়াই ) সরল করেছি :

public class VerticalScrollView extends ScrollView {
    private float xDistance, yDistance, lastX, lastY;

    public VerticalScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                xDistance = yDistance = 0f;
                lastX = ev.getX();
                lastY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                xDistance += Math.abs(curX - lastX);
                yDistance += Math.abs(curY - lastY);
                lastX = curX;
                lastY = curY;
                if(xDistance > yDistance)
                    return false;
        }

        return super.onInterceptTouchEvent(ev);
    }
}

চমৎকার, এই চুল্লী জন্য ধন্যবাদ। তালিকার নীচে স্ক্রোল করার সময় আমি উপরোক্ত পদ্ধতির সাথে সমস্যাগুলি পেয়ে যাচ্ছিলাম যখন শিশু উপাদানগুলির সাথে কোনও স্পর্শ আচরণ বাধাগ্রস্থ হতে শুরু করল না কেন Y / X আন্দোলনের অনুপাত যাই হোক না কেন। অদ্ভুত!
ডোরি

1
ধন্যবাদ! কাস্টম তালিকাভিউর সাথে তালিকার ভিউপেজারের সাথেও কাজ করেছে।
শরিফ শাইক

2
সবেমাত্র এটির সাথে গৃহীত উত্তরটি প্রতিস্থাপন করুন এবং এটি এখন আমার জন্য আরও ভালভাবে কাজ করছে। ধন্যবাদ!
ডেভিড স্কট

1
@ বিপিনসাহু, স্পর্শের সরানোর দিকনির্দেশটি বলতে, আপনি বর্তমান এক্স স্থানাঙ্ক এবং লাস্টএক্স এর ব-দ্বীপ নিতে পারেন, যদি এটি 0 এর চেয়ে বড় হয় তবে স্পর্শ বাম থেকে ডানে সরে চলেছে, অন্যথায় ডানে বামে। এবং তারপরে আপনি পরবর্তী গণনার জন্য শেষ এক্স হিসাবে বর্তমান এক্সটি সংরক্ষণ করুন।
nevevek

1
অনুভূমিক স্ক্রোলভিউ সম্পর্কে কি?
জিন উইন হেটেট

60

আমি মনে করি আমি একটি সহজ সমাধান পেয়েছি, এটি কেবল (এর প্যারেন্ট) স্ক্রোলভিউয়ের পরিবর্তে ভিউপ্যাজারের একটি সাবক্লাস ব্যবহার করে।

আপডেট 2013-07-16 : আমি onTouchEventপাশাপাশি একটি ওভাররাইড যোগ করেছি। এটি মন্তব্যগুলিতে উল্লিখিত সমস্যাগুলির সাথে সম্ভবত সহায়তা করতে পারে, যদিও ওয়াইএমএমভি।

public class UninterceptableViewPager extends ViewPager {

    public UninterceptableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean ret = super.onInterceptTouchEvent(ev);
        if (ret)
            getParent().requestDisallowInterceptTouchEvent(true);
        return ret;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        boolean ret = super.onTouchEvent(ev);
        if (ret)
            getParent().requestDisallowInterceptTouchEvent(true);
        return ret;
    }
}

এটি অ্যান্ড্রয়েড.উইজেট.গ্যালারি এর অনস্ক্রোল () এ ব্যবহৃত কৌশলটির মতো । এটি আরও Android এর জন্য কাস্টম ভিউগুলি লিখে Google I / O 2013 উপস্থাপনা দ্বারা ব্যাখ্যা করা হয়েছে ।

আপডেট 2013-12-10 : কিরিল গ্রুপ্চনিকভের (তত্কালীন) অ্যান্ড্রয়েড বাজার অ্যাপ্লিকেশন সম্পর্কে একটি পোস্টে অনুরূপ পদ্ধতির বর্ণনা দেওয়া হয়েছে ।


বুলিয়ান ret = super.onIntercepTouchEvent (ev); শুধুমাত্র কখনও আমার জন্য মিথ্যা ফিরে। স্ক্রোলভিউতে আনইনসেপ্টেবল ভিউপাগার ব্যবহার করে
স্কটিয়াব

এটি আমার পক্ষে কার্যকর নয়, যদিও আমি এটি সরলতা পছন্দ করি। আমি একটি ব্যবহার করি যেখানে ScrollViewএকটি স্থাপন করা হয়। আসলে, সর্বদা মিথ্যা ... কীভাবে এটি সমাধান করতে হবে তার কোনও ক্লু? LinearLayoutUninterceptableViewPagerret
পিটারডকে

@ স্কটিয়াব এবং @ পিটারডক: আচ্ছা, আমার মধ্যে TableRowযা আছে তার ভিতরে TableLayoutযা একটি অভ্যন্তরে থাকে ScrollView(হ্যাঁ, আমি জানি ...), এবং এটি উদ্দেশ্য হিসাবে কাজ করছে। গুগলের মতো এটিরonScroll পরিবর্তে আপনি ওভাররাইড করার চেষ্টা করতে পারেন (1010 লাইন)onInterceptTouchEvent
জর্গোস কিলাফাস

আমি ঠিক হার্ডকোড করেছি সত্য হিসাবে এবং এটি দুর্দান্ত কাজ করে। এটি আগে মিথ্যা ফিরে আসছিল তবে আমি বিশ্বাস করি কারণ
স্ক্রোলভিউতে

11

আমি খুঁজে পেয়েছি যে কিছু স্ক্রোলভিউ আবার ফোকাস ফিরে পায় এবং অন্যটি ফোকাস হারায়। আপনি কেবল এটিকে স্ক্রোলভিউ ফোকাসের মধ্যে একটি মঞ্জুর করে তা প্রতিরোধ করতে পারেন:

    scrollView1= (ScrollView) findViewById(R.id.scrollscroll);
    scrollView1.setAdapter(adapter);
    scrollView1.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            scrollView1.getParent().requestDisallowInterceptTouchEvent(true);
            return false;
        }
    });

আপনি কোন অ্যাডাপ্টারটি পার করছেন?
হর্ষ এমভি

আমি আবার যাচাই করে বুঝতে পেরেছিলাম যে এটি আসলে আমি ব্যবহার করছি এমন কোনও স্ক্রোলভিউ নয়, তবে একটি ভিউপাগার এবং আমি এটিকে একটি ফ্রেগমেন্টস্টেটপেজার অ্যাডাপ্টার দিয়ে যাচ্ছি যা গ্যালারীটির জন্য সমস্ত চিত্র অন্তর্ভুক্ত করে।
মারিউস হিলারিওস

8

এটি আমার পক্ষে ভাল কাজ করছিল না। আমি এটি পরিবর্তন করেছি এবং এখন এটি কার্যকরভাবে কাজ করে। আগ্রহী হলে কারও।

public class ScrollViewForNesting extends ScrollView {
    private final int DIRECTION_VERTICAL = 0;
    private final int DIRECTION_HORIZONTAL = 1;
    private final int DIRECTION_NO_VALUE = -1;

    private final int mTouchSlop;
    private int mGestureDirection;

    private float mDistanceX;
    private float mDistanceY;
    private float mLastX;
    private float mLastY;

    public ScrollViewForNesting(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);

        final ViewConfiguration configuration = ViewConfiguration.get(context);
        mTouchSlop = configuration.getScaledTouchSlop();
    }

    public ScrollViewForNesting(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public ScrollViewForNesting(Context context) {
        this(context,null);
    }    


    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {      
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDistanceY = mDistanceX = 0f;
                mLastX = ev.getX();
                mLastY = ev.getY();
                mGestureDirection = DIRECTION_NO_VALUE;
                break;
            case MotionEvent.ACTION_MOVE:
                final float curX = ev.getX();
                final float curY = ev.getY();
                mDistanceX += Math.abs(curX - mLastX);
                mDistanceY += Math.abs(curY - mLastY);
                mLastX = curX;
                mLastY = curY;
                break;
        }

        return super.onInterceptTouchEvent(ev) && shouldIntercept();
    }


    private boolean shouldIntercept(){
        if((mDistanceY > mTouchSlop || mDistanceX > mTouchSlop) && mGestureDirection == DIRECTION_NO_VALUE){
            if(Math.abs(mDistanceY) > Math.abs(mDistanceX)){
                mGestureDirection = DIRECTION_VERTICAL;
            }
            else{
                mGestureDirection = DIRECTION_HORIZONTAL;
            }
        }

        if(mGestureDirection == DIRECTION_VERTICAL){
            return true;
        }
        else{
            return false;
        }
    }
}

এটি আমার প্রকল্পের উত্তর। আমার কাছে একটি ভিউ পেজার রয়েছে যা গ্যালারী হিসাবে কাজ করে একটি স্ক্রোলভিউতে ক্লিক করা যায়। আমি উপরের সরবরাহিত সমাধানটি ব্যবহার করি, এটি অনুভূমিক স্ক্রোলটিতে কাজ করে তবে আমি পেজারের চিত্রটিতে ক্লিক করার পরে যা একটি নতুন ক্রিয়াকলাপ শুরু করে এবং ফিরে যায়, পেজারটি স্ক্রোল করতে পারে না। এটি ভাল কাজ করে!
দীর্ঘকাই

আমার জন্য পুরোপুরি কাজ করে। আমার কাছে একটি কাস্টম "আনলক করতে আনলক করা" ভিউয়ের ভিতরে একটি ভিউ ছিল যা আমাকে একই সমস্যা দিচ্ছিল। এই সমাধানটি সমস্যার সমাধান করেছে।
হাইব্রিড

6

নীভেককে তার উত্তরটি আমার পক্ষে কাজ করেছে বলে ধন্যবাদ জানায় কিন্তু ব্যবহারকারী যখন অনুভূমিক দিক (ভিউপাগার) অনুভূমিক দিকের দিকে স্ক্রোল করা শুরু করে এবং তারপরে আঙ্গুলের স্ক্রোলটি উল্লম্বভাবে উপরে তোলা ছাড়াই এটি অন্তর্নিহিত ধারক ভিউ স্ক্রল করা শুরু করে (স্ক্রোলভিউ) । আমি এটিকে নীভকের কোডে কিছুটা পরিবর্তন করে ঠিক করেছি:

private float xDistance, yDistance, lastX, lastY;

int lastEvent=-1;

boolean isLastEventIntercepted=false;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            xDistance = yDistance = 0f;
            lastX = ev.getX();
            lastY = ev.getY();


            break;

        case MotionEvent.ACTION_MOVE:
            final float curX = ev.getX();
            final float curY = ev.getY();
            xDistance += Math.abs(curX - lastX);
            yDistance += Math.abs(curY - lastY);
            lastX = curX;
            lastY = curY;

            if(isLastEventIntercepted && lastEvent== MotionEvent.ACTION_MOVE){
                return false;
            }

            if(xDistance > yDistance )
                {

                isLastEventIntercepted=true;
                lastEvent = MotionEvent.ACTION_MOVE;
                return false;
                }


    }

    lastEvent=ev.getAction();

    isLastEventIntercepted=false;
    return super.onInterceptTouchEvent(ev);

}

5

এটি অবশেষে নেস্টেডস্ক্রোলভিউ , সমর্থন ভি 4 লাইব্রেরির একটি অংশে পরিণত হয়েছিল । সুতরাং, বেশিরভাগ ক্ষেত্রেই আমি অনুমান করি যে স্থানীয় হ্যাকগুলির প্রয়োজন নেই।


1

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

http://code.google.com/p/android/issues/detail?id=18990

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.