带有动态数据的 Textview 中的选取框 android

Marquee in Textview with Dynamic data android

I am trying to use marquee in TextView which is getting text from the webservice APIs. This is my xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:background="#4a4a4a"> 

    <!-- Player Header -->
    <LinearLayout 
        android:id="@+id/player_header_bg"
        android:layout_width="fill_parent"
        android:layout_height="60dip"
        android:background="@layout/bg_player_header"
        android:layout_alignParentTop="true"
        android:paddingLeft="5dp"
        android:paddingRight="5dp">

        <!-- Song Title, here I want to use marquee -->
        <TextView 
            android:id="@+id/songTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:singleLine="true"
            android:ellipsize="marquee" 
            android:textColor="#ffffff"
            android:marqueeRepeatLimit="1"
            android:scrollHorizontally="true" 
            android:paddingLeft="15dip" 
            android:paddingRight="15dip"
            android:selectAllOnFocus="true" 
            android:focusable="true" 
            android:focusableInTouchMode="true" 
            android:freezesText="true"/> 

        <!-- Playlist button -->
        <!-- <ImageButton 
            android:id="@+id/btnPlaylist"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:src="@drawable/btn_playlist"
            android:background="@null"/> -->
    </LinearLayout>

    <!-- Song Thumbnail Image -->
    <LinearLayout 
        android:id="@+id/songThumbnail"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:gravity="center"
        android:layout_below="@id/player_header_bg">

    <ImageView 

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/adele"/>    
    </LinearLayout>

    <!-- Player Footer -->
    <LinearLayout 
        android:id="@+id/player_footer_bg"
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:background="@layout/bg_player_footer"
        android:gravity="center">

        <!-- Player Buttons -->
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_vertical"
            android:background="@layout/rounded_corner"
            android:paddingLeft="10dp"
            android:paddingRight="10dp">
            <!-- Previous Button -->
            <ImageButton
                android:id="@+id/btnPrevious" 
                android:src="@drawable/btn_previous"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@null"/>
            <!-- Backward Button -->
            <ImageButton 
                android:id="@+id/btnBackward"
                android:src="@drawable/btn_backward"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@null"/>
            <!-- Play Button -->
            <ImageButton 
                android:id="@+id/btnPlay"
                android:src="@drawable/btn_play"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@null"/>
            <!-- Forward Button -->
            <ImageButton 
                android:id="@+id/btnForward"
                android:src="@drawable/btn_forward"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@null"/>
            <!-- Next Button -->
            <ImageButton 
                android:id="@+id/btnNext"
                android:src="@drawable/btn_next"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@null"/>
        </LinearLayout>
    </LinearLayout>

    <!-- Progress Bar/Seek bar -->
    <SeekBar
            android:id="@+id/songProgressBar"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_marginRight="20dp" 
             android:layout_marginLeft="20dp"
             android:layout_marginBottom="20dp"
             android:layout_above="@id/player_footer_bg"
             android:thumb="@drawable/seek_handler"
             android:progressDrawable="@drawable/seekbar_progress"
             android:paddingLeft="17dp"
             android:paddingRight="6dp"/>

    <!-- Timer Display -->
    <LinearLayout 
        android:id="@+id/timerDisplay"
        android:layout_above="@id/songProgressBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="10dp">
        <!-- Current Duration Label -->
        <TextView 
            android:id="@+id/songCurrentDurationLabel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="left"
            android:textColor="#eeeeee"
            android:textStyle="bold"/>
        <!-- Total Duration Label -->
        <TextView 
            android:id="@+id/songTotalDurationLabel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:textColor="#04cbde"
            android:textStyle="bold"/>
    </LinearLayout>

    <!-- Repeat / Shuffle buttons -->
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/timerDisplay"
        android:gravity="center">
        <!-- Repeat Button -->
        <ImageButton 
            android:id="@+id/btnRepeat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/btn_repeat"
            android:layout_marginRight="5dp"
            android:background="@null"/>

        <!-- Shuffle Button -->        
        <!--  <ImageButton 
            android:id="@+id/btnShuffle" 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/btn_shuffle"
            android:layout_marginLeft="5dp"
            android:background="@null"/> -->
    </LinearLayout>
</RelativeLayout>

This is my Activity,

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player);

songTitleLabel = (TextView) findViewById(R.id.songTitle);

GENRE = getIntent().getExtras().getString("genre");

        songTitleLabel.setSelected(true);
        songTitleLabel.setEllipsize(TruncateAt.END); 
        songTitleLabel.setEllipsize(TruncateAt.MARQUEE);
        songTitleLabel.setText(GENRE);
        songTitleLabel.setSingleLine(true);

But it is not working. Please help me to find out what I am missing here.

请试试这个,

Xml 文件

只需像这样替换您的 textview,我删除了一些不寻常的标签,它对我有用。

<TextView
            android:id="@+id/songTitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:ellipsize="marquee"
            android:scrollHorizontally="true"
            android:marqueeRepeatLimit="marquee_forever"
            android:paddingLeft="15dip"
            android:paddingRight="15dip"
            android:singleLine="true"
            android:textColor="#ffffff" />

Java class

package com.example.demoproject;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

    public class MainActivity extends Activity {
    
        private TextView songTitleLabel;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            songTitleLabel = (TextView) findViewById(R.id.songTitle);
            songTitleLabel.setSelected(true);
            songTitleLabel.setText("LOREM IPSUM DUMMY TEXT. LOREM IPSUM DUMMY TEXTLOREM IPSUM DUMMY TEXT. LOREM IPSUM DUMMY TEXTLOREM IPSUM DUMMY TEXT.");
        }
    }

I would like to mention it as an perfect answer.I have seen many posts regarding this but didn't find the exact answer for the particular situation where I am full filling all the condition required for marquee . I got the correct answer From the comment of @Ragu Swaminatha. "The length of the String( you want to use in marquee) should be greater then the width of the device screen" this is the perfect answer. Whether the String is coming from API or it is static.

我已经发布了我在评论中提到的答案。

尽管您为实现 Marquee 编写的代码很好且正确,但我们需要注意,

The text, that will be shown should be greater than the length of the device screen width or need to fix the width less than the length of the incoming string, whether it may be static or dynamic text.

谢谢你提到,@devraj。