वेबव्यू में स्क्रॉल करना अक्षम करें?


86

अब तक मैं केवल एक iPhone डेवलपर रहा हूं और अब मैंने Android को एक चक्कर देने का फैसला किया है। कुछ मैं Android पर पता लगाने में सक्षम नहीं किया गया है कैसे प्रोग्रामेटिक रूप से स्क्रॉलिंग को रोकने के लिए है WebView?

onTouchMoveघटना की रोकथाम के लिए iPhones के समान कुछ और बढ़िया होगा!

जवाबों:


179

यहाँ वेबव्यू में सभी स्क्रॉलिंग को अक्षम करने के लिए मेरा कोड है :

  // disable scroll on touch
  webview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
  });

केवल स्क्रॉलबार छुपाने के लिए, लेकिन स्क्रॉलिंग अक्षम न करें:

WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);

या आप सिंगल कॉलम लेआउट का उपयोग करने का प्रयास कर सकते हैं लेकिन यह केवल साधारण पृष्ठों के साथ काम करता है और यह क्षैतिज स्क्रॉलिंग को निष्क्रिय करता है:

   //Only disabled the horizontal scrolling:
   webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

आप अपने वेबव्यू को लंबवत स्क्रॉल स्क्रॉलव्यू के साथ लपेटने का प्रयास कर सकते हैं और वेब पर सभी स्क्रॉलिंग को अक्षम कर सकते हैं:

<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"    >
  <WebView
    android:id="@+id/mywebview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="none" />
</ScrollView>

और सेट करें

webview.setScrollContainer(false);

webview.setOnTouchListener(...)Webview में सभी स्क्रॉलिंग को अक्षम करने के लिए ऊपर दिए गए कोड को जोड़ना न भूलें । वर्टिकल स्क्रोल व्यू वेबवे के कंटेंट को स्क्रॉल करने की अनुमति देगा।


ठीक काम करता है, लेकिन कुछ सेकंड बाद सैमसंग i5700 spica in /system/lib/libwebcore.so पर क्रैश हो जाता है।
लुकास

LayoutAlgorithm.SINGLE_COLUMN या webview.setOnTouchListener?
peceps

3
यदि आप एक स्क्रॉल में एक WebView डालते हैं, तो एंड्रॉइड सेट करें: WebView का isScrollContainer विशेषता "एंड्रॉइड: स्क्रॉलबार्स" को "सेट" करने के बजाय "झूठा" करने के लिए है। यह वेबव्यू की स्क्रॉल हैंडलिंग को पूरी तरह से अक्षम करने का प्रभाव है और इसे अपनी सामग्री के अनुसार विस्तार करने की अनुमति देता है। फिर स्क्रॉल को मूल रूप से मूल स्क्रॉल द्वारा नियंत्रित किया जाएगा।
ब्लेडरोडर

1
यदि आपको अपने उत्तर MotionEvent.ACTION_MOVEमें घटनाओं को संभालने की आवश्यकता है, तो WebViewनीचे मेरा उत्तर देखें।
गंगांग

1
की उपेक्षा ACTION_MOVEपर setOnTouchListenerघटना कुछ साइड इफेक्ट तो मैं इस सवाल का जवाब नहीं की सिफारिश करेंगे; 1. त्वरित स्वाइप को onclickपृष्ठ की घटनाओं के रूप में गिना जाता है । 2. पेज पर तत्वों की स्क्रॉलिंग को ओवरफ्लो करने से रोकता है, साइट के आधार पर उचित इंटरैक्शन के लिए इसकी आवश्यकता हो सकती है। 3. जेएस touchmoveघटना। @GDanger के पास सही उत्तर है जो किसी भी अन्य प्रभाव overScrollByके WebViewरूप में विस्तार करके ओवरराइडिंग कर रहा है , बस पेज स्क्रॉलिंग को रोकता है। stackoverflow.com/a/26129301/1244574
jkasten

22

मुझे नहीं पता कि आपको अभी भी इसकी आवश्यकता है या नहीं, लेकिन यहां समाधान है:

appView = (WebView) findViewById(R.id.appView); 
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);

18
ठीक है। यह स्क्रॉलबार को अक्षम करता है, लेकिन यह स्क्रॉल करके स्क्रॉल करने से नहीं रोकता है। ऐसा लगता है कि html को भी फिट होना चाहिए ...
rdmueller

अगर u आपके वेब पेजों को केवल एंड्रॉइड वेब व्यू के लिए डिजाइन कर रहे हैं तो मैं आपके वेब पेजों को तालिका में बनाने की सलाह देता हूं। चौड़ाई चौड़ाई = "100%" और ऊंचाई के लिए समान होनी चाहिए। इसलिए कोई और खींच नहीं होगा।
--मर

चौड़ाई = 100% हमेशा काम नहीं करती है, उदाहरण के लिए: stackoverflow.com/questions/6460871/…
NoBugs

कमाल .. यह मुझे क्या चाहिए। साभार
पीटर

21

बनाने WebViewकी अनदेखी गति घटनाओं इसके बारे में जाने के लिए गलत तरीका है। क्या होगा अगर WebViewइन घटनाओं के बारे में सुनने की जरूरत है?

इसके बजाय उप WebView-निजी और गैर-निजी स्क्रॉल विधियों को ओवरराइड करें।

public class NoScrollWebView extends WebView {
    ...
    @Override
    public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, 
                                int scrollRangeX, int scrollRangeY, int maxOverScrollX, 
                                int maxOverScrollY, boolean isTouchEvent) {
        return false;
    }

    @Override
    public void scrollTo(int x, int y) {
        // Do nothing
    }

    @Override
    public void computeScroll() {
        // Do nothing
    }
}

आप को देखो, तो स्रोत के लिए WebViewआप देख सकते हैं कि onTouchEventकॉल doDragजो कहता है overScrollBy


1
यदि आपको इस gist को बनाए गए स्क्रॉल प्रोग्राम को अक्षम करने / सक्षम करने की आवश्यकता है ।
GDanger

1
आपका तरीका मेरे लिए काम करता है। और मैं आपसे काफी सहमत हूँ। मेरे मामले में, मैं वेबव्यू में वीडियो और ऑडियो प्रगति बार एंबेड को स्वीकार जवाब का उपयोग करके नहीं खींच सकता।
codezjx

यह सही जवाब है। हालांकि इसे ओवरराइडिंग कंस्ट्रक्टर्स में कुछ बदलावों की जरूरत है। कृपया नीचे मेरा पूरा जवाब देखें। stackoverflow.com/a/51936944/393502
वंशी

13

यदि आपकी सामग्री ठीक से लपेटती है तो बॉडी में मार्जिन विवरण जोड़ने से स्क्रॉलिंग को रोका जा सकेगा:

<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">

काफी आसान है, और बहुत कम कोड + बग उपरि :)


1
प्रतिभाशाली! एक साधारण HTML केवल समाधान के लिए +1। कभी-कभी मैं कामना करता हूं, एंड्रॉइड में लेआउट सीएसएस जितना आसान था ...
प्रीतेश देसाई

स्टॉक एंड्रॉइड ब्राउज़र में अच्छा दिखता है, लेकिन फ़ायरफ़ॉक्स (फेनिक) में काम नहीं करता है ... क्षैतिज रूप से स्क्रॉल करने के लिए कुछ भी नहीं होने के बावजूद, फ़ायरफ़ॉक्स अभी भी मुझे उस बिंदु तक दाईं ओर स्क्रॉल करने देता है जहां सभी सामग्री स्क्रॉल की गई है स्क्रीन बंद।
माइकल

1
आधुनिक WebView (Android 5 और उच्चतर) पर काम नहीं करता है
Roel

8

अपने WebView पर एक श्रोता सेट करें:

webView.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return(event.getAction() == MotionEvent.ACTION_MOVE));
            }
        });

3
वहाँ returnलाइन के अंत में एक अतिरिक्त कोष्ठक है । इसके अलावा यह HTML5 कैनवास और जावास्क्रिप्ट स्पर्श घटनाओं को तोड़ता है।
रोहन सिंह

यह निश्चित रूप से इसे निष्क्रिय कर देता है, लेकिन मैं बाद में सुनने वाले को इनपुट के योग्य कैसे मार सकता हूं? मैंने कोशिश की event.getAction() != MotionEvent.ACTION_MOVEहै और साथ हीreturn true
CQM

मानक "कुछ भी नहीं" मामला है return false, नहीं return true
मैथ्यू 1

6

मैंने यह कोशिश नहीं की है क्योंकि मुझे अभी तक इस समस्या का सामना करना पड़ा है, लेकिन शायद आप onScroll फ़ंक्शन को ओवरराइड कर सकते हैं?

@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}

इसे हम भारत में एक जुगाड़ कहते हैं ... हालाँकि ठीक काम किया है
R4chi7

4

मेरा गंदा, लेकिन आसानी से लागू होने वाला और अच्छा काम करने वाला उपाय:

बस स्क्रॉल के अंदर वेबव्यू लगाएं। वेबव्यू को संभावित सामग्री (आवश्यकताओं के आधार पर एक या दोनों आयामों में) की तुलना में बहुत बड़ा होने के लिए बनाएं। ..और आप अपनी इच्छानुसार स्क्रोलव्यू के स्क्रॉलबार (ओं) को स्थापित करें।

वेबपृष्ठ पर क्षैतिज स्क्रॉलबार को अक्षम करने के लिए उदाहरण:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="vertical"
>
    <WebView
        android:id="@+id/mywebview"
        android:layout_width="1000dip"
        android:layout_height="fill_parent"
    />
</ScrollView>

आशा है कि ये आपकी मदद करेगा ;)


हाँ, लेकिन फिर नीचे में बहुत सारे सफेद स्थान के साथ स्क्रॉल आकार बहुत बड़ा नहीं होगा?
राफेल बेंच

1
क्या होगा यदि सामग्री की चौड़ाई 1001dp होगी?
वाल्त्सु

3

मैंने फ़्लिकर और ऑटो-स्क्रॉल को हल किया:

webView.setFocusable(false);
webView.setFocusableInTouchMode(false);

हालांकि अगर यह अभी भी किसी कारण से काम नहीं करता है, तो बस एक वर्ग बनाएं जो WebView का विस्तार करता है, और इस पद्धति को इस पर रखें:

// disable scroll on touch
  setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
      return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
  });

मैं WebView का विस्तार करने के लिए सुझाव दे रहा हूं, ताकि अधिक प्रभावी नियंत्रण प्रदान किया जा सके, जैसे कि अक्षम / सक्षम स्वाइप, सक्षम / अक्षम स्पर्श, श्रोताओं, नियंत्रण संक्रमण, एनिमेशन, आंतरिक रूप से सेटिंग्स को परिभाषित करें।


3

स्क्रॉल को अक्षम करने के लिए इसका उपयोग करें

webView.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) 
    {
        return (event.getAction() == MotionEvent.ACTION_MOVE);
    }
});

2

यह आपकी समस्या का स्रोत नहीं हो सकता है, लेकिन मैंने यह पता लगाने में घंटों समय बिताया है कि मेरे आवेदन ने क्यों iPhone पर ठीक काम किया, एंड्रॉइड ब्राउज़र को लगातार ऊर्ध्वाधर / क्षैतिज स्क्रॉलबर्स को फेंकने और वास्तव में पृष्ठ को स्थानांतरित करने का कारण बनता है। मेरे पास एक html बॉडी टैग था जिसकी ऊँचाई और चौड़ाई 100% थी, और शरीर विभिन्न स्थानों में विभिन्न टैग से भरा था। कोई फर्क नहीं पड़ता कि मैंने क्या कोशिश की, एंड्रॉइड ब्राउज़र अपने स्क्रॉल बार दिखाएगा और पृष्ठ को थोड़ा-थोड़ा स्थानांतरित करेगा, खासकर जब एक तेज स्वाइप कर रहा हो। एपीके में कुछ भी करने के बिना मेरे लिए काम करने वाला समाधान निम्नलिखित को शरीर के टैग में जोड़ना था:

leftmargin="0" topmargin="0"

ऐसा लगता है कि बॉडी टैग के लिए डिफ़ॉल्ट मार्जिन को ड्रॉइड पर लागू किया जा रहा था, लेकिन iphone पर ध्यान नहीं दिया गया


1

यदि आप उपवर्ग वेब-दृश्य, तो आप बस को फिल्टर करने की है कि ट्रिगर स्क्रॉल चाल-घटनाओं onTouchEvent ओवरराइड कर सकते हैं।

public class SubWebView extends WebView {

    @Override
    public boolean onTouchEvent (MotionEvent ev)    {
        if(ev.getAction() == MotionEvent.ACTION_MOVE) {
            postInvalidate();
            return true;
        }
        return super.onTouchEvent(ev);
    }
    ...

0

उपरोक्त उत्तरों का अध्ययन करना मेरे लिए लगभग काम कर गया ... लेकिन मुझे अभी भी एक समस्या थी कि मैं 2.1 पर दृश्य को 'फ़्लिंग' कर सकता था (2.2 और 2.3 के साथ तय किया जा रहा था)।

यहाँ मेरा अंतिम समाधान है

public class MyWebView extends WebView
{
private boolean bAllowScroll = true;
@SuppressWarnings("unused") // it is used, just java is dumb
private long downtime;

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

public void setAllowScroll(int allowScroll)
{
    bAllowScroll = allowScroll!=0;
    if (!bAllowScroll)
        super.scrollTo(0,0);
    setHorizontalScrollBarEnabled(bAllowScroll);
    setVerticalScrollBarEnabled(bAllowScroll);
}

@Override
public boolean onTouchEvent(MotionEvent ev) 
{
    switch (ev.getAction())
    {
    case MotionEvent.ACTION_DOWN:
        if (!bAllowScroll)
            downtime = ev.getEventTime();
        break;
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
        if (!bAllowScroll)
        {
            try {
                Field fmNumSamples = ev.getClass().getDeclaredField("mNumSamples");
                fmNumSamples.setAccessible(true);
                Field fmTimeSamples = ev.getClass().getDeclaredField("mTimeSamples");
                fmTimeSamples.setAccessible(true);
                long newTimeSamples[] = new long[fmNumSamples.getInt(ev)];
                newTimeSamples[0] = ev.getEventTime()+250;
                fmTimeSamples.set(ev,newTimeSamples);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        break;
    }
    return super.onTouchEvent(ev);
}

@Override
public void flingScroll(int vx, int vy)
{
    if (bAllowScroll)
        super.flingScroll(vx,vy);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
    if (bAllowScroll)
        super.onScrollChanged(l, t, oldl, oldt);
    else if (l!=0 || t!=0)
        super.scrollTo(0,0);
}

@Override
public void scrollTo(int x, int y)
{
    if (bAllowScroll)
        super.scrollTo(x,y);
}

@Override
public void scrollBy(int x, int y)
{
    if (bAllowScroll)
        super.scrollBy(x,y);
}
}

OnScrollChanged () पद्धति को ओवरराइड करने के लिए मेरे लिए काम करता है। मेरे मामले में, मैं वेबव्यू में वीडियो और ऑडियो प्रगति बार एंबेड को स्वीकार जवाब का उपयोग करके नहीं खींच सकता। आपका बहुत बहुत धन्यवाद!
codezjx

-1

इसका पूरा जवाब होना चाहिए। जैसा कि @GDanger द्वारा सुझाया गया है। स्क्रॉल विधियों को ओवरराइड करने और लेआउट xml के भीतर कस्टम वेबव्यू एम्बेड करने के लिए WebView बढ़ाएँ।

public class ScrollDisabledWebView extends WebView {

    private boolean scrollEnabled = false;

    public ScrollDisabledWebView(Context context) {
        super(context);
        initView(context);
    }

    public ScrollDisabledWebView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
        initView(context);
    }
    // this is important. Otherwise it throws Binary Inflate Exception.
    private void initView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
                                   int scrollRangeX, int scrollRangeY, int maxOverScrollX,
                                   int maxOverScrollY, boolean isTouchEvent) {
        if (scrollEnabled) {
            return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
        }
        return false;
    }

    @Override
    public void scrollTo(int x, int y) {
        if (scrollEnabled) {
            super.scrollTo(x, y);
        }
    }

    @Override
    public void computeScroll() {
        if (scrollEnabled) {
            super.computeScroll();
        }
    }
}

और फिर लेआउट फाइल में निम्नानुसार एम्बेड करें

<com.sample.apps.ScrollDisabledWebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerInParent="true"
    tools:context="com.sample.apps.HomeActivity"/>

फिर गतिविधि में, स्क्रॉलबार को अक्षम करने के लिए कुछ अतिरिक्त विधियों का उपयोग करें।

ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);

-3

बस android:focusableInTouchMode="false"अपने webView पर उपयोग करें ।

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