IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

AutoScroll ou texte auto-défilant


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut AutoScroll ou texte auto-défilant
    Bonjour,

    J'essaye de faire des pauses Thread.sleep() dans une boucle (for) pour que mon ScrollView scroll tout seul, donc faire un AutoScroll ou texte auto-défilant.

    J'ai googlé presque tout ce qui est possible à ce sujet. J'ai beaucoup lu sur les Threads.sleep() mais rien n'aboutit.

    Voici mon code, je l'ai réduit au plus simple. J'utilise API 7 comme minimum SDK.

    Mon MainActivity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package com.example.testsleep;
     
    import com.example.testsleep.R.id;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ScrollView;
    import android.widget.TextView;
    import android.app.Activity;
     
    public class MainActivity extends Activity {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     
        Button Button_AutoScroll = (Button)findViewById(id.Button_AutoScroll);
        Button_AutoScroll.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
     
                TextView Text_Scrolable = (TextView) findViewById(id.Text_Scrollable);                
                ScrollView Scroll_Window = (ScrollView)findViewById(id.Scroll_Window);
     
               for (int ScrollPos = 0; ScrollPos < Text_Scrolable.getHeight();++ScrollPos)
                    {
                    try {Thread.sleep(10000);}     ////ici ca plante 
                    catch (InterruptedException e) {return;}
     
                Scroll_Window.smoothScrollTo(0, ScrollPos);                                        
                }
                }
            });
        }
    }
    Et mon fichier XML activity_main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/Layout_MainLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     
        <ScrollView 
            android:id="@+id/Scroll_Window"
            android:layout_width="300dp"
            android:layout_height="175dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" >
     
                    <TextView
                    android:id="@+id/Text_Scrollable"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="blablablblablalblablalblabllablalblablalbla
                    lbalbalblbllablalblablalblablablablalblablalbalblablalbla
                    blablablalbalblablablalbalblablablalblablalblabllbalalbal
                    lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
                    blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
                    lblbalblablalblablablalblablablalbalblablablalblablablblb
                    lblablalbalblablablablablblablablalablalblablablalblablba
                    lblabllablalblablalblablalblalblablalblalblblablalblalblb
                    lbalbalblbllablalblablalblablablablalblablalbalblablalbla
                    blablablalbalblablablalbalblablablalblablalblabllbalalbal
                    lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
                    blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
                    lblbalblablalblablablalblablablalbalblablablalblablablblb
                    lblablalbalblablablablablblablablalablalblablablalblablba
                    lblabllablalblablalblablalblalblablalblalblblablalblalblb
                    lbalbalblbllablalblablalblablablablalblablalbalblablalbla
                    blablablalbalblablablalbalblablablalblablalblabllbalalbal
                    lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
                    blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
                    lblbalblablalblablablalblablablalbalblablablalblablablblb
                    lblablalbalblablablablablblablablalablalblablablalblablba
                    lblabllablalblablalblablalblalblablalblalblblablalblalbl"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#673F18" />
     
        </ScrollView>
     
        <Button
            android:id="@+id/Button_AutoScroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="AutoScroll" />
     
    </RelativeLayout>
    Quand je mets la portion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try {Thread.sleep(10000);} catch (InterruptedException e {return;}
    dans la boucle for ca plante. Comme s'il compilait le Thread.sleep() un par-dessus l'autre sans l'executer et faire une pause comme prévu et saturer la mémoire. Pourtant c'est ce que je vois partout sur le net pour faire une pause dans un for.

    Quand je mets ces 2 lignes en dehors de la boucle for, avant ou après, il fait une pause de 10 sec avant d'effectuer la boucle for d'un coup. Mais rien à faire dans la boucle.

    Qu'y a-t-il que j'aurais mal compris à propos des Threads ?

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Bonjour,

    Je ne suis pas expert Android, mais il semblerait que l'usage du sleep() soit discuté voir déconseillé dans ce type de cas.
    As tu essayé avec postDelayed() comme ci dessus?
    Signature à venir...
    Ancienne : Divers NTIC (PHP, Dojo, à venir...) : http://tif44.fr/blog/

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    J'ai beaucoup lu sur les Thread.sleep() mais rien n'aboutit.
    Bizarre, ... pourtant la règle revient souvent:

    On ne devrait *jamais* utiliser Thread.sleep(). Et quand je dis jamais, c'est vraiment jamais
    Un programme n'attend jamais "un certain temps", au pire un programme attend un évenement (Object.wait()) .
    La fonction Thread.sleep() est super pour faire des unit-test, mais c'est grosso-modo sa seule fonction, elle devrait être bannie de tout autre code.

    Comme dit plus haut postDelayed() est *la* fonction à utiliser.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par nicroman Voir le message
    La fonction Thread.sleep() est super pour faire des unit-test, mais c'est grosso-modo sa seule fonction, elle devrait être bannie de tout autre code.

    Comme dit plus haut postDelayed() est *la* fonction à utiliser.
    Mouais, je ne serais pas aussi catégorique. Si je dois attendre, dans un programme, 1 secondes avant de tenter une reconnexion en cas d'erreur avec un serveur, afin d'éviter de le saturer. J'ai le choix entre amener dans mon code toute l'infrastructure d'un outil comme quartz pour scheduler ma tache dans 1 secondes (ou 1 minute), ou mettre un thread.sleep pour ranger le thread concerné dans un coin. Sachant que quartz, en interne, utilise aussi des sleep pour pas saturer le proco entre deux tâche.

    C'est bien de se mettre sur un wait, mais tu tourne en rond, comment tu code un truc qui fait le notify dans 1 minutes

    Il ne faut pas utiliser le sleep pour faire une boucle active, c'est vrai par contre.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Object.wait(60000) ça marche bien aussi pour attendre une minute
    (et s'arrêter dès que quelqu'un fait un Object.notify(): le "cancel" quoi)
    Tu vas me dire, mais c'est exactement ce que fait "Thread.sleep()" et je suis "presque" d'accord

    Le truc c'est que Thread.sleep() ne devrait pouvoir être appelé que lorsqu'on est maître du thread en question, hors c'est très rarement le cas, sauf cas hyper particuliers (comme ton exemple qui nécessite obligatoirement l'exécution dans un thread à part que l'on maîtrise à 100%), et jamais dans le cas du thread UI.

    Le problème de Thread.sleep() est qu'il est tellement facile d'utilisation que ceux qui n'ont pas la notion de programmation concurrente ou par message (comme la plupart des UI) risquent de l'utiliser sans comprendre "pourquoi ça ne marche pas".

    Donc non ... il faut bannir Thread.sleep() à jamais !!
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

Discussions similaires

  1. Taille zone de texte auto extensible
    Par tib59 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/10/2014, 11h15
  2. Réponses: 3
    Dernier message: 07/10/2014, 10h53
  3. Réponses: 1
    Dernier message: 01/12/2007, 18h37
  4. [Formulaire]Zone de texte auto extensible
    Par Jean-Luc80 dans le forum IHM
    Réponses: 3
    Dernier message: 05/04/2007, 09h25
  5. [débutant] zone de texte auto extensible dans un état
    Par Anthony17 dans le forum Access
    Réponses: 2
    Dernier message: 07/06/2006, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo