android - Horizo​​ntalScrollView 剪切 TextView 中的文本并自动滚动

标签 android scroll horizontal-scrolling horizontalscrollview autoscroll

我有一个 ListView,我希望当我点击一个 ListView 项目时,底部的 TextView 会改变它的值,如果文本太大,它会自动滚动。

1) Horizo​​ntalScrollView 截掉了文字,原文是“Enrique Iglesias - Bailando ft. Descemer Bueno, Gente De Zona”,但是没有空格所以我只看到了“Enrique伊格莱西亚斯 - Bailando ft.”。现在,我希望通过滚动我还能看到“Descemer Bueno,Gente De Zona”,但是没有...TextView 值是正确的,有完整的名称,我在日志中看到...

我看到的:

enter image description here

我点击 TextView 看到的内容:

enter image description here

2) 自动滚动不起作用,我必须单击 TextView 才能滚动。

这是我的代码布局:

    titleSongPlayngTextView = (TextView) rootView.findViewById(R.id.song_title);
    titleSongPlayngTextView.setMovementMethod(new ScrollingMovementMethod());

    final HorizontalScrollView s = (HorizontalScrollView)
    rootView.findViewById(R.id.title_scroller);
    s.fullScroll(HorizontalScrollView.FOCUS_RIGHT);

这是我的代码布局(将 TextView 放在 Horizo​​ntalScrollView 标记中无法滚动,也需要单击):

    <LinearLayout
        android:id="@+id/info_playing_song"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="0.82"
        android:orientation="vertical">

        <HorizontalScrollView
            android:id="@+id/title_scroller"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

        </HorizontalScrollView >

        <TextView
            android:id="@+id/song_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:foregroundGravity="left"
            android:text="Title Song"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit ="marquee_forever"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:scrollHorizontally="true"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="?android:attr/textColorPrimary" />

更新:

在我的 fragment 中我有:

public void setMediaButtons(View rootView) {
    albumSongPlayngImageView = (ImageView) rootView.findViewById(R.id.album_song);

    titleSongPlayngTextView = (TextView) rootView.findViewById(R.id.song_title);
    titleSongPlayngTextView.setMovementMethod(new ScrollingMovementMethod());
    titleSongPlayngTextView.setText(firstSong.getTitle());
    titleSongPlayngTextView.setSelected(true);
    Log.d(LOG_TAG, "After scroll clicked song: " + titleSongPlayngTextView.getText());
        //*************** HERE the TextView value is correct***************

    artistSongPlayngTextView = (TextView) rootView.findViewById(R.id.song_name_artist);
    artistSongPlayngTextView.setMovementMethod(new ScrollingMovementMethod());
    artistSongPlayngTextView.setSelected(true);
    artistSongPlayngTextView.setText(firstSong.getArtist());

在 MusicService 中我有:

public void playSong() {
    mediaPlayer = musicPlayer.getMediaPlayer();
    mediaPlayer.setOnPreparedListener(this);

    mediaPlayer.reset();
    Song currPlaySong = arrayOfSongs.get(currentSongPosition);
    long currSong = currPlaySong.getID();
    Uri trackUri = ContentUris.withAppendedId(
            android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            currSong);

    //set the data source
    try {
        mediaPlayer.setDataSource(getApplicationContext(), trackUri);

        songTitle = currPlaySong.getTitle();
        titleSongPlayngTextView.setText(songTitle);

        Log.d(LOG_TAG, "TextView value: " + titleSongPlayngTextView.getText());
        //*************** HERE the TextView value is correct***************

        songArtist = currPlaySong.getArtist();
        artistSongPlayngTextView.setText(songArtist);


    } catch (Exception e) {
        Log.e("MUSIC SERVICE", "Error setting data source", e);
    }
    mediaPlayer.prepareAsync();
}

最后这是我修改后的布局(可能是问题所在?另一个问题是,如果 TextView 值太大,我会得到一个非常小的 ImageView):

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

    <ListView
        android:id="@+id/list_songs"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/fragment_button_player" />

    <LinearLayout
        android:id="@+id/fragment_button_player"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="@android:color/darker_gray"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:weightSum="1">

        <ImageView
            android:id="@+id/album_song"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="0.21"
            android:src="@drawable/ic_album_black_24dp" />

        <LinearLayout
            android:id="@+id/info_playing_song"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="0.82"
            android:orientation="vertical">


            <TextView
                android:id="@+id/song_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:maxLines="1"
                android:foregroundGravity="left"
                android:text="Title Song"
                android:singleLine="true"
                android:ellipsize="marquee"
                android:marqueeRepeatLimit ="marquee_forever"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:scrollHorizontally="true"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="?android:attr/textColorPrimary" />

                <TextView
                    android:id="@+id/song_name_artist"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:ellipsize="marquee"
                    android:focusable="true"
                    android:focusableInTouchMode="true"
                    android:marqueeRepeatLimit="marquee_forever"
                    android:maxLines="1"
                    android:scrollHorizontally="true"
                    android:singleLine="true"
                    android:text="Artist Name"
                    android:textAppearance="?android:attr/textAppearanceSmall" />

        </LinearLayout>

        <ImageButton
            android:id="@+id/prev_song"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:foregroundGravity="center_vertical|bottom|right"
            android:padding="8dp"
            android:src="@drawable/ic_skip_previous_black_24dp"
            android:tintMode="src_in" />

        <ImageButton
            android:id="@+id/play_pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:foregroundGravity="center_vertical|bottom|right"
            android:padding="8dp"
            android:src="@drawable/ic_play_arrow_black_24dp"
            android:tintMode="src_in" />

        <ImageButton
            android:id="@+id/next_song"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:foregroundGravity="center_vertical|bottom|right"
            android:padding="8dp"
            android:src="@drawable/ic_skip_next_black_24dp"
            android:tintMode="src_in" />

    </LinearLayout>

</RelativeLayout>

这是有 imageView 问题的屏幕,只有第一张图片有实际尺寸,所有其他图片都因 TextView 值过大而缩放。我想要始终相同的暗淡,真正的暗淡,就像第一张图片中那样。

SOLUTION for textview value cut off 请看这里:Scrolling TextView value are cut off

enter image description here

最佳答案

默认情况下,选取框只会在焦点上滚动。因此,如果您将 Selected 设置为 true,它将始终聚焦并因此滚动。

您需要在 TextView 上将 Selected 设置为 true,以便文本滚动。

titleSongPlayngTextView.setSelected(true);

此外,没有 TextView 的 ScrollView 毫无意义。您不需要使用 scrollview,但如果需要,请将 textview 放入其中。

至于它切断文本,我需要查看您的代码,因为您让播放器控制 TextView 。

编辑
了解更多信息后

您的权重总和大于您的权重总和 1。

您的前两个子元素大于 1,并且您没有在其中包含图像按钮。

您不能使用 weightsum,在这种情况下,weightsum 将是所有权重的总和。否则请确保您的体重加起来等于您的体重总和。也是我的一个疏忽,在使用布局权重时将布局宽度设置为 0dp。

<LinearLayout
    android:id="@+id/fragment_button_player"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:weightSum="1">
    <ImageView
        android:id="@+id/album_song"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="0.21"
        android:src="@drawable/ic_album_black_24dp" />
    <LinearLayout
        android:id="@+id/info_playing_song"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="0.82"
        android:orientation="vertical">
        <TextView
            android:id="@+id/song_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
        <TextView
            android:id="@+id/song_name_artist"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
    </LinearLayout>

    // These below are not included in your weightSum

    <ImageButton
        android:id="@+id/prev_song"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
    <ImageButton
        android:id="@+id/play_pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
    <ImageButton
        android:id="@+id/next_song"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"            
</LinearLayout>

所以你会得到这样的东西:

    <ImageView
        android:id="@+id/album_song"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_weight="0.2"
        android:foregroundGravity="center_vertical|bottom|left"
        android:src="@drawable/ic_album_black_24dp"/>

    <LinearLayout
        android:id="@+id/info_playing_song"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:orientation="vertical">

        <TextView
            android:id="@+id/song_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:foregroundGravity="left"
            android:marqueeRepeatLimit="marquee_forever"
            android:maxLines="1"
            android:scrollHorizontally="true"
            android:singleLine="true"
            android:text="Title Song and too much information to display in one line."
            android:textAppearance="?android:attr/textAppearanceMedium"/>

        <TextView
            android:id="@+id/song_name_artist"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="marquee"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:marqueeRepeatLimit="marquee_forever"
            android:maxLines="1"
            android:scrollHorizontally="true"
            android:singleLine="true"
            android:text="Artist Name and too much information to read in one line."
            android:textAppearance="?android:attr/textAppearanceSmall" />

    </LinearLayout>

    <ImageButton
        android:id="@+id/prev_song"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_weight="0.1"
        android:foregroundGravity="center_vertical|bottom|right"
        android:padding="8dp"
        android:src="@drawable/ic_skip_previous_black_24dp"
        android:tintMode="src_in"/>

    <ImageButton
        android:id="@+id/play_pause"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_weight="0.1"
        android:foregroundGravity="center_vertical|bottom|right"
        android:padding="8dp"
        android:src="@drawable/ic_play_arrow_black_24dp"
        android:tintMode="src_in"/>

    <ImageButton
        android:id="@+id/next_song"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_weight="0.1"
        android:foregroundGravity="center_vertical|bottom|right"
        android:padding="8dp"
        android:src="@drawable/ic_skip_next_black_24dp"
        android:tintMode="src_in"/>

</LinearLayout>

我已经对此进行了测试并且它有效。您可以根据自己的需要调整重量。

关于android - Horizo​​ntalScrollView 剪切 TextView 中的文本并自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33547967/

相关文章:

php - Android使用JSON插入mysql

android - ListView 不显示数据库内容

android - 返回 ListView 时保持/保存/恢复滚动位置

javascript - Bootstrap Accordion 滚动到事件面板标题的顶部

swift - 如何使这个 ScrollView 可滚动?

Android Json 解析与 Gson

android - 如何在 Android 中显示非模态的临时弹出消息?

javascript 滚动 div

android - 自定义包含布局的 Textview

android - 水平滚动在 phonegap 中不起作用