سؤال

حتى الآن كنت مطور iPhone فقط ، والآن قررت أن أعطي Android دوامة. شيء لم أتمكن من معرفة أندرويد هو كيفية منع التمرير برمجيًا في أ WebView?

شيء مشابه لمنع iPhone من onTouchMove الحدث سيكون رائعا!

هل كانت مفيدة؟

المحلول

هنا هو رمز بلدي ل تعطيل كل التمرير في WebView:

  // 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 وتعطيل كل التمرير على WebView:

<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. ستسمح Scrollview العمودية بتمرير محتوى WebView.

نصائح أخرى

لا أعرف ما إذا كنت لا تزال بحاجة إليها أم لا ، ولكن هنا هو الحل:

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

جعل 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 الذي يدعو Overcrollby.

ستمنع إضافة تفاصيل الهامش إلى الجسم التمرير إذا كان المحتوى الخاص بك يلف بشكل صحيح ، على النحو التالي:

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

سهل بما فيه الكفاية ، ودرجة أقل بكثير من رمز + علة الحمل :)

اضبط مستمعًا على عرض الويب الخاص بك:

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

لم أجرب هذا لأنني لم أواجه هذه المشكلة بعد ، لكن ربما يمكنك المبالغة في وظيفة OnScroll؟

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

حلي القذر ، ولكن سهل التنفيذ والعمل بشكل جيد:

ما عليك سوى وضع WebView داخل ScrollView. اجعل WebView أكبر بكثير من المحتوى المحتمل (في واحد أو كلاهما ، اعتمادًا على المتطلبات). .. وإعداد شريط التمرير (s) scrollview كما يحلو لك.

مثال على تعطيل شريط التمرير الأفقي على مقابلة الويب:

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

آمل أن يساعد هذا ؛)

لتعطيل التمرير استخدم هذا

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

قد لا يكون هذا هو مصدر مشكلتك ، لكنني قضيت ساعات في محاولة لتعقب سبب عمل طلبي الذي يعمل بشكل جيد على iPhone على أن متصفح Android يرمي باستمرار أشرطة التمرير الرأسية/الأفقية ونقل الصفحة بالفعل. كان لدي علامة جسم HTML مع الارتفاع والعرض على 100 ٪ ، وكان الجسم مليئا بعلامات مختلفة في مواقع مختلفة. بغض النظر عن ما جربته ، ستعرض متصفحات Android أشرطة التمرير الخاصة بها وتحريك الصفحة قليلاً ، خاصة عند القيام بتمرير سريع. كان الحل الذي نجح لي دون الحاجة إلى فعل أي شيء في APK هو إضافة ما يلي إلى علامة الجسم:

leftmargin="0" topmargin="0"

يبدو أنه تم تطبيق الهوامش الافتراضية لعلامة الجسم على الروبوت ولكن تم تجاهله على iPhone

لقد حلت وميض وتوقيت السيارات بواسطة:

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 ، يمكنك ببساطة تجاوز 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);
    }
    ...

إن دراسة الإجابات أعلاه عملت بالنسبة لي تقريبًا ... لكن لا يزال لدي مشكلة في "إرساء" العرض على 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);
}
}

يجب أن يكون هذا هو الإجابة الكاملة. كما اقترح gdanger. قم بتوسيع عرض WebView لتجاوز أساليب التمرير وتضمين عرض الويب المخصص في Layout XML.

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

فقط استخدم android:focusableInTouchMode="false" على الخاص بك WebView.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top