Désactiver ScrollView par programme?

Je souhaite activer ScrollView et le désactiver par un clic de bouton.
Désactiver signifie comme si ScrollView n'était pas là .. et l'activer renvoie ScrollView ..
Je le veux parce que j'ai une galerie avec des images de texte, et sur un bouton, cliquez sur l'orientation de l'écran, alors, dans Paysage, le texte devient plus grand … Et je veux la représentation de défilement pour que l'image ne l'étira pas et que le texte devienne illisible.
scrollview.Enabled=false / setVisibility(false) fait rien .. 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> 

Merci

  • Image desséchable sur un canevas
  • Catching OutOfMemoryError dans le décodage Bitmap
  • Suggestions pour entrer dans le développement mobile - iPhone SDK, Android SDK, Mono Touch ou Titanium?
  • Outil de conversion par lots des bitmaps de ressources Android à différentes densités
  • Vérifiez si 'Accès à mon emplacement' est activé - Android
  • Appcompat manquant dans le dossier sdk
  • Edit1: Je ne peux pas utiliser Visibilité (disparue) car cela cacherait également la Galerie, ce que je veux, c'est cacher l'effet de la vue en mode défilement. Quand il y a ScrollView, les images dans Gallery deviennent scrollabale et ne correspondent pas à l'écran, donc tu as Pour faire défiler pour voir l'image entière, je ne veux pas désactiver / activer cela sur un clic de bouton … J'ai essayé ceci:

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

    Mais encore, les images de la Galerie sont défilables et ne correspondent pas à l'écran … Quelle est la solution à cela?

    15 Solutions collect form web for “Désactiver ScrollView par programme?”

    Plusieurs points pour commencer:

    1. Vous ne pouvez pas désactiver le défilement d'un ScrollView. Vous devriez étendre à ScrollView et remplacer la méthode onTouchEvent pour renvoyer false lorsque certaines conditions correspondent.
    2. Le composant Galerie se défile horizontalement, que ce soit dans une ScrollView ou non – une ScrollView ne fournit que le défilement vertical (vous avez besoin d'un HorizontalScrollView pour le défilement horizontal)
    3. Vous semblez dire que vous avez un problème avec l'étirement de l'image elle-même – cela n'a rien à voir avec ScrollView, vous pouvez modifier la façon dont un ImageView évolue avec la propriété android:scaleType (XML) ou la méthode setScaleType – par exemple ScaleType.CENTER N'élargira pas votre image et la concentrera à sa taille originale

    Vous pouvez modifier ScrollView comme suit pour désactiver le défilement

     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 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) { // Don't do anything with intercepted touch events if // we are not scrollable if (!mScrollable) return false; else return super.onInterceptTouchEvent(ev); } } 

    Vous utiliserez alors

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

    Dans votre fichier XML (il suffit de changer la ScrollView à votre ScrollView spécial).

    Ensuite appeler

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

    Pour désactiver le défilement de la vue.

    Je pense que vous avez plus que le problème de désactiver le défilement pour atteindre le résultat souhaité (la galerie restera en spirale avec le code ci-dessus par exemple) – Je recommanderais de faire plus de recherches sur chacun des trois composants (Galerie, ScrollView, ImageView) pour voir quelles sont les propriétés de chacun et comment il se comporte.

    J'étais ainsi:

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

    Trouvé cette solution simple juste établie

     ScrollView.requestDisallowInterceptTouchEvent(true); 

    Pour commencer, j'ai utilisé le code publié posté dans le premier commentaire, mais je l'ai changé comme ceci:

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

    Alors je l'ai appelé de cette façon

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

    Parce que j'ai essayé

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

    Mais il a dit que setIsScrollable est indéfini

    J'espère que cela t'aidera

    Disablend ScrollView

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

    Voici une solution plus simple. Remplacez le onTouch() pour le ScrollView OnTouchListener et renvoie false si vous souhaitez contourner le défilement par touche. Le défilement programmé fonctionne toujours et il n'est pas nécessaire d'étendre la classe ScrollView .

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

    Je n'ai pas assez de points pour commenter une réponse, mais je voulais dire que la réponse de mikec a fonctionné pour moi, sauf que je devais la changer pour revenir! IsScrollable like so:

     mScroller.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return !isScrollable; } }); 
     @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); } } 

    @JosephEarl +1 Il a une excellente solution ici qui a parfaitement fonctionné pour moi avec quelques modifications mineures pour le faire par programme.


    Voici les modifications mineures que j'ai faites:

    Classe LockableScrollView:

     public boolean setScrollingEnabled(boolean enabled) { mScrollable = enabled; return mScrollable; } 

    Activité principale:

     LockableScrollView sv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sv = new LockableScrollView(this); sv.setScrollingEnabled(false); } 

    Vous pouvez créer un CustomScrollView, pour lequel vous pouvez désactiver son interférence avec d'autres vues. Bien que cela puisse parfois irriter l'utilisateur final. Utilisez-le avec prudence.

    C'est le code:

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

    est-ce que cela aide?

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

    Vous pouvez étendre la galerie et utiliser un drapeau pour désactiver le défilement lorsque vous le souhaitez:

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

    J'ai eu une mise en page sur NestedScrollView en consommant l'événement tactile et désactivez le défilement:

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

    Et pour activer:

     progressBarLayout.setOnTouchListener(null); 

    Comme vous pouvez le voir dans la documentation , vous ne pouvez pas définir la visibilité sur false. Dans votre cas, vous devriez probablement utiliser:

     scrollview.setVisibility(Visibility.GONE); 

    Sur l'écouteur de clic bouton juste faire

     ScrollView sView = (ScrollView)findViewById(R.id.ScrollView01); sView.setVerticalScrollBarEnabled(false); sView.setHorizontalScrollBarEnabled(false); 

    De sorte que la barre de défilement n'est pas activée sur le clic de bouton

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.