Désactiver ScrollView par programme?

Je voudrais activer ScrollView et le désactiver par un clic de bouton.
Désactiver signifie que si ScrollView n’était pas là .. et permet de retourner le ScrollView ..
Je veux cela parce que j’ai une galerie avec des images de texte, et sur un bouton, l’orientation de l’écran change, donc dans Paysage, le texte devient plus grand. Et je veux la défilement pour que l’image ne s’étire pas et le texte devient illisible.
scrollview.Enabled=false / setVisibility(false) fait rien .. xml:

    

Merci

Edit1: Je ne peux pas utiliser la Visibilité (disparue) car cela masquerait également la Galerie, ce que je veux, c’est cacher l’effet de la vue de défilement .. Quand il y a ScrollView les images dans la Galerie deviennent scrollabale et ne rentrent pas dans l’écran pour faire défiler pour voir l’image entière, je ne veux pas désactiver / activer que 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 toujours les images dans la galerie sont défilables et ne correspondent pas à l’écran .. quelle est la solution à cela?

Plusieurs points à commencer par:

  1. Vous ne pouvez pas désactiver le défilement d’un ScrollView. Vous devez étendre à ScrollView et remplacer la méthode onTouchEvent pour renvoyer false lorsqu’une condition est trouvée.
  2. Le composant Gallery défile horizontalement, qu’il soit dans un ScrollView ou non – un 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 changer la façon dont ImageView évolue avec la propriété android:scaleType (XML) ou setScaleType – par exemple ScaleType.CENTER ne va pas étirer votre image et le centrera à sa taille d’origine

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

Vous utiliseriez alors

     

dans votre fichier XML (il suffit de changer le ScrollView pour votre ScrollView spécial).

Appelle alors

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

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

Je pense que vous avez plus que le simple problème de désactiver le défilement pour obtenir le résultat souhaité (la galerie restra par exemple défilable avec le code ci-dessus) – je vous recommande de faire plus de recherches sur chacun des trois composants (Galerie, ScrollView, ImageView) pour voir quelles propriétés chacun a et comment il se comporte.

Je suis allé de cette façon:

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

Trouvé cette solution simple vient de définir

 ScrollView.requestDisallowInterceptTouchEvent(true); 

pour commencer, j’ai utilisé le code posté dans le premier commentaire, mais je l’ai changé comme suit:

  public class LockableScrollView extends ScrollView { public LockableScrollView(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public LockableScrollView(Context context, AtsortingbuteSet 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 sharepointfault: 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 sharepointfault: 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

Désactiver 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 ScrollView OnTouchListener et retournez false si vous souhaitez OnTouchListener le défilement au toucher. Le défilement par programmation 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 qu’elle revienne!

 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 sharepointfault: 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 programmation.


Voici les modifications mineures que j’ai apscopes:

LockableScrollView Classe:

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

J’avais une mise en page sur NestedScrollView 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 permettre:

 progressBarLayout.setOnTouchListener(null); 
 public class LockableScrollView extends ScrollView { private boolean mScrollable = true; public LockableScrollView(Context context) { super(context); } public LockableScrollView(Context context, AtsortingbuteSet attrs) { super(context, attrs); } public LockableScrollView(Context context, AtsortingbuteSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) public LockableScrollView(Context context, AtsortingbuteSet 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); } } 

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

Vous pouvez créer un CustomScrollView, pour lequel vous pouvez désactiver ses interférences avec d’autres vues. Bien que cela puisse être parfois irritant pour l’utilisateur final. Utilisez-le avec prudence.

Ceci est le code:

 import android.content.Context; import android.util.AtsortingbuteSet; 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, AtsortingbuteSet attrs) { super(context, attrs); } public CustomScrollView(Context context, AtsortingbuteSet 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; } } 

Comment utiliser le CustomScrollView?

Vous pouvez append CustomScrollView en tant que parent à l’écran dans lequel vous souhaitez append une autre vue de défilement en tant que vue enfant et tout l’écran est défilant. Je l’ai utilisé pour un RelativeLayout.

  <**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">  #**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());**   

Cela a fonctionné pour mon cas.

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 le bouton cliquez sur auditeur 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 du bouton