web-dev-qa-db-fra.com

Le champ de sélection TextView ne fonctionne pas

J'ai essayé d'utiliser Marquee et son ne fonctionne pas ici est mon code, s'il vous plaît laissez-moi savoir où im va mal

<TextView
   Android:text="lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00"
   Android:id="@+id/TextView02"
   Android:layout_width="200dip"
   Android:layout_height="wrap_content"
   Android:marqueeRepeatLimit="Marquee_forever"
   Android:ellipsize="Marquee"
   Android:singleLine="true"
   Android:focusable="true"
   Android:inputType="text"
   Android:maxLines="1">
</TextView>

j'utilise Android SDK 2.0.1

117
amithgc

travaille maintenant :) Code ci-dessous

<TextView
    Android:text="START | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | END"
    Android:id="@+id/MarqueeText" 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" 
    Android:singleLine="true"
    Android:ellipsize="Marquee" 
    Android:marqueeRepeatLimit="Marquee_forever"
    Android:scrollHorizontally="true" 
    Android:paddingLeft="15dip" 
    Android:paddingRight="15dip" 
    Android:focusable="true" 
    Android:focusableInTouchMode="true" 
    Android:freezesText="true">

Edit (au nom d'Adil Hussain):

textView.setSelected(true) doit être défini dans le code derrière pour que cela fonctionne.

253
amithgc
Android:singleLine="true"
Android:ellipsize="Marquee"

sont les seuls attributs requis et le défilement fonctionne même avec layout_weight défini avec layout_width=0dp

voici un exemple de code:

<TextView 
            Android:id="@+id/scroller"
            Android:singleLine="true"
            Android:ellipsize="Marquee"
            Android:textAppearance="?android:attr/textAppearanceLarge"
            Android:textColor="#FFFFFF"
            Android:text="Some veryyyyy long text with all the characters that cannot fit in screen, it so sad :( that I will not scroll"
            Android:layout_marginLeft="4dp"
            Android:layout_weight="3"
            Android:layout_width="0dp"
            Android:layout_height="wrap_content"
            />

Mais le plus important est implicitement ou explicitement TextViewdevrait être sélectionné.

Vous pouvez le faire avec:

TextView txtView=(TextView) findViewById(R.id.scroller);
txtView.setSelected(true);
83
Shardul

Ces attributs doivent être inclus dans la balise textview pour permettre le défilement.

Tout le reste est facultatif.

Android:focusable="true"
Android:focusableInTouchMode="true"
Android:layout_width="fill_parent"
Android:ellipsize="Marquee"
23
sajamaum

J'ai rencontré le même problème et cette discussion m'a aidé à remplacer cette ligne

Android:maxLines="1"

avec cette ligne en xml

Android:singleLine="true"

et ça marche la ligne txtView.setSelected(true); était aussi dans mon activité.

20
Dulal

Code de travail très simple:

Pour faire défiler le texte à l'infini

            <TextView
            Android:id="@+id/textView_News_HeadLine"
            style="@style/black_extra_large_heading_text"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentLeft="true"
            Android:layout_marginLeft="8dp"
            Android:ellipsize="Marquee"
            Android:marqueeRepeatLimit="-1"
            Android:singleLine="true"
            Android:text="HeadLine: Banglawash To be Continued" />

& vous devriez écrire de votre activité

textView.setSelected(true);
13
Shihab Uddin
 <TextView
  Android:ellipsize="Marquee"
  Android:singleLine="true"
  .../>

doit appeler le code

textView.setSelected(true);
9
susemi99

J'avais vécu cette situation où Textview Marquee ne fonctionnait pas. Cependant, suivez ceci et je suis sûr que cela fonctionnera. :)

<TextView
         Android:id="@+id/tv_Marquee"
         Android:layout_width="match_parent"
         Android:layout_height="wrap_content"
         Android:ellipsize="Marquee"
         Android:focusable="true"
         Android:focusableInTouchMode="true"
         Android:freezesText="true"
         Android:maxLines="1"
         Android:scrollHorizontally="true"
         Android:text="This is a sample code of Marquee and it works"/>

et ajouter par programme ces 2 lignes ...

tvMarquee.setHorizontallyScrolling(true);
tvMarquee.setSelected(true);

tvMarquee.setSelected (true) est requis si l'une des vues est déjà active et que setSelected le fera fonctionner. Pas besoin d'utiliser.

Android:singleLine="true"

il est obsolète et les codes ci-dessus fonctionnent.

9
Vijay E

Code de travail:

<TextView
    Android:id="@+id/scroller"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:ellipsize="Marquee"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
    Android:singleLine="true"
    Android:text="Some veryyyyy long text with all the characters that cannot fit in screen, it so sad :( that I will not scroll"
    Android:textAppearance="?android:attr/textAppearanceLarge" />
8
Kirit Vaghela

Je travaille avec minSDK = 14 et j'étais curieux de savoir quel ensemble de ces variations fonctionnerait. J'ai fini avec:

Android:ellipsize="Marquee"
Android:marqueeRepeatLimit="Marquee_forever"
Android:singleLine="true"

en plus d'autres choses de formatage. Je n'avais pas besoin de scrollHorionally, focusable ou focusableInTouchMode.

Cet ensemble a nécessité un appel à

setSelected(true)

Ce que je trouve intéressant, c’est que singleLine aurait été déconseillée, avec la recommandation de la remplacer par maxLines = 1. Sauf que, lorsque je le fais, cette modification empêche à elle seule le défilement du texte. On peut espérer que lorsque singleLine finira par mordre la poussière, tout son comportement actuel sera déclenché par maxLines ...

7
ssdscott

J'ai rencontré le même problème. La réponse d'Amith GC (la première réponse cochée comme étant acceptée) est correcte, mais parfois textview.setSelected (true); ne fonctionne pas lorsque la vue texte ne parvient pas à obtenir le focus tout le temps. Donc, pour que TextView Marquee fonctionne, je devais utiliser un TextView personnalisé.

public class CustomTextView extends TextView {
    public CustomTextView(Context context) {
        super(context);
    }
    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }


    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(focused)
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean focused) {
        if(focused)
            super.onWindowFocusChanged(focused);
    }


    @Override
    public boolean isFocused() {
        return true;
    }
}

Et puis, vous pouvez utiliser le TextView personnalisé comme vue de texte défilant dans votre fichier .xml de présentation comme ceci:

<com.example.myapplication.CustomTextView
            Android:id="@+id/tvScrollingMessage"
            Android:text="@string/scrolling_message_main_wish_list"
            Android:singleLine="true"
            Android:ellipsize="Marquee"
            Android:marqueeRepeatLimit ="Marquee_forever"
            Android:focusable="true"
            Android:focusableInTouchMode="true"
            Android:scrollHorizontally="true"
            Android:layout_width="match_parent"
            Android:layout_height="40dp"
            Android:background="@color/black"
            Android:gravity="center"
            Android:textColor="@color/white"
            Android:textSize="15dp"
            Android:freezesText="true"/>

REMARQUE: dans l'extrait de code ci-dessus, com.example.myapplication est un exemple de nom de package qui doit être remplacé par votre propre nom de package.

J'espère que cela vous aidera. À votre santé!

7
David Roman

Ajoutez simplement ceux mentionnés ci-dessus:

    Android:singleLine="true" 
    Android:ellipsize="Marquee"
    Android:marqueeRepeatLimit ="Marquee_forever"

ET!! vous devez utiliser TextView.setSelected (true) dans votre Java).

La raison pour laquelle Marquee ne fonctionne pas avec certains des types de cet article, si vous avez un formulaire avec un EditText (qui est une entrée), le EditText sera celui avec le focus et la sélection par défaut dans le formulaire. Maintenant, si vous le forcez avec TextView.setSelected (true), TextView finira par faire Marquee, quoi qu’il en soit.

L’idée est donc de focaliser le widget TextView et de le sélectionner pour que Marquee fonctionne.

5
superlinux

Vous devez ajouter ces attributs qui sont obligatoires pour Marquee

 Android:ellipsize="Marquee"     
 Android:focusable="true"    
 Android:focusableInTouchMode="true"     
 Android:singleLine="true"     
 Android:marqueeRepeatLimit="Marquee_forever"     
 Android:scrollHorizontally="true"
4
Chandan kushwaha
package com.app.relativejavawindow;

import Android.os.Bundle;
import Android.app.Activity;
import Android.graphics.Color;
import Android.text.TextUtils.TruncateAt;
import Android.view.Menu;
import Android.widget.RelativeLayout;
import Android.widget.TextView;

public class MainActivity extends Activity {
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final RelativeLayout relativeLayout = new RelativeLayout(this);
        final RelativeLayout relativeLayoutbotombar = new RelativeLayout(this);
        textView = new TextView(this);
        textView.setId(1);

        RelativeLayout.LayoutParams relativlayparamter = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT,
                RelativeLayout.LayoutParams.MATCH_PARENT);

        RelativeLayout.LayoutParams relativlaybottombar = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        relativeLayoutbotombar.setLayoutParams(relativlaybottombar);


        textView.setText("Simple application that shows how to use Marquee, with a long ");
        textView.setEllipsize(TruncateAt.Marquee);
        textView.setSelected(true);
        textView.setSingleLine(true);


        relativeLayout.addView(relativeLayoutbotombar);
        relativeLayoutbotombar.addView(textView);
        //relativeLayoutbotombar.setBackgroundColor(Color.BLACK);
        setContentView(relativeLayout, relativlayparamter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

ce code fonctionne correctement mais si la taille de votre écran n’est pas remplie, il ne bougera pas, essayez de placer un espace en fin de texte

3
harsha.kuruwita

Utilisez la ligne suivante dans votre code:

TextView.setSelected(true);
3
Nima K

Oui, Marquee_forever fonctionne également en cas de largeur fixe pour TextView. (par exemple, Android: layout_width = "120dp")

Les attributs obligatoires sont:

  1. Android: focusable = "true"
  2. Android: focusableInTouchMode = "true"
  3. Android: singleLine = "true" // s'il manque du texte, apparaît sur plusieurs lignes.

Code de travail:

<TextView
                Android:id="@+id/mediaTitleTV"
                Android:layout_width="220dp"
                Android:layout_height="wrap_content"
                Android:ellipsize="Marquee"
                Android:focusable="true"
                Android:focusableInTouchMode="true"
                Android:marqueeRepeatLimit="Marquee_forever"
                Android:singleLine="true"
                Android:text="Try Marquee, it works with fixed size textview smoothly!" />
2
Monika

Il suffit de mettre ces paramètres dans votre TextView. Ça marche :)

    Android:singleLine="true" 
    Android:ellipsize="Marquee"
    Android:marqueeRepeatLimit ="Marquee_forever"
    Android:scrollHorizontally="true"
    Android:focusable="true"
    Android:focusableInTouchMode="true" 

`

2
XYZ_deve

J'ai créé une classe personnalisée AlwaysMarqueTextView

public class AlwaysMarqueeTextView extends TextView
{
    protected boolean a;

    public AlwaysMarqueeTextView(Context context)
    {
        super(context);
        a = false;
    }

    public AlwaysMarqueeTextView(Context context, AttributeSet attributeset)
    {
        super(context, attributeset);
        a = false;
    }

    public AlwaysMarqueeTextView(Context context, AttributeSet attributeset, int i)
    {
        super(context, attributeset, i);
        a = false;
    }

    public boolean isFocused()
    {
        return a || super.isFocused();
    }

    public void setAlwaysMarquee(boolean flag)
    {
        setSelected(flag);
        setSingleLine(flag);
        if(flag)
        setEllipsize(TruncateAt.Marquee);
        a = flag;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) 
    {
        if(focused)

            super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean focused)
    {
        if(focused)
            super.onWindowFocusChanged(focused);
    }
}

Et vous pouvez commencerMarque quand vous le souhaitez .. comme

//textView.setSelected(true); No need of Selection..
textview.setAlwaysMarquee(true); 
2
Xar E Ahmer

Pour disposer de votre propre vitesse de défilement et de la possibilité de personnaliser les propriétés du rectangle, utilisez les éléments suivants:

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:ellipsize="Marquee"
    Android:fadingEdge="horizontal"
    Android:lines="1"
    Android:id="@+id/myTextView"
    Android:padding="4dp"
    Android:scrollHorizontally="true"
    Android:singleLine="true"
    Android:text="Simple application that shows how to use Marquee, with a long text" />

Au sein de votre activité:

private void setTranslation() {
        TranslateAnimation tanim = new TranslateAnimation(
                TranslateAnimation.ABSOLUTE, 1.0f * screenWidth,
                TranslateAnimation.ABSOLUTE, -1.0f * screenWidth,
                TranslateAnimation.ABSOLUTE, 0.0f,
                TranslateAnimation.ABSOLUTE, 0.0f);
        tanim.setDuration(1000);
        tanim.setInterpolator(new LinearInterpolator());
        tanim.setRepeatCount(Animation.INFINITE);
        tanim.setRepeatMode(Animation.ABSOLUTE);

        textView.startAnimation(tanim);
    } 
2
Jaydev

La plupart des réponses sont identiques,
mais notez également que, dans certains cas, Marquee ne fonctionnera pas sans spécifier de largeur en creux pour le conteneur.
Par exemple, si vous utilisez le poids dans le conteneur parent

Android:layout_width="0dp"
Android:layout_weight="0.5"

Le chapiteau peut ne pas fonctionner.

0
Leo Droidcoder

enter image description here

 import Android.app.Activity;
 import Android.os.Bundle;
 import Android.text.TextUtils.TruncateAt;
 import Android.widget.TextView;

 public class MainActivity extends Activity {
 private TextView textview;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    textview = (TextView) this.findViewById(R.id.textview);
    textview.setSelected(true);

    textview.setEllipsize(TruncateAt.Marquee);
    textview.setSingleLine(true);
 }

 }

pour plus de références, cliquez ici http://androiddhina.blogspot.in/2015/10/Marquee-effect-in-Android-textview.html

0
Dhina k

Android: focusable = "true" et Android: focusableInTouchMode = "true" sont essentiels ....

Parce que j'ai testé tous les autres sans ces lignes et que le résultat n'était pas un chapiteau. Quand j’ajoute cela, cela a commencé à Marquee ..

0
poly