Horizo​​ntalScrollView在TextView中剪切文本并自动缩放

时间:2015-11-05 15:03:24

标签: android scroll horizontal-scrolling horizontalscrollview autoscroll

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

1)Horizo​​ntalScrollView切断文字,原文是“ Enrique Iglesias - Bailando ft.Descemer Bueno,Gente De Zona ”,但是没有空间所以我只看到“恩里克Iglesias - 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);

这是我的代码布局(在Horizo​​ntalScrollView标签中放置TextView不能正常滚动,也可以点击一下):

    <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" />

更新

在我的片段中,我有:

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值太大。我想要像第一张图像一样,总是暗淡的,真实的暗淡。

textview值截止的

解决方案请参见此处:Scrolling TextView value are cut off

enter image description here

1 个答案:

答案 0 :(得分:1)

默认情况下,选框将仅滚动onfocus。因此,如果你将setSelected设置为true,它将始终聚焦并因此滚动。

您需要在textview上将setSelected设置为true,因此文本将滚动。

titleSongPlayngTextView.setSelected(true);

此外,滚动视图没有文本视图也没有意义。您不需要使用滚动视图,但如果您这样做,请将textview放入其中。

至于切断文本,我需要查看你的代码,因为你有对文本视图的播放器控制。

修改
更多信息后

你的权重之和大于你的权重1。

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

您不能使用权重,在这种情况下权重将是所有权重的总和。否则,请确保您的重量加起来与您的重量相​​加。同样是我的疏忽,在使用布局权重时将布局宽度设置为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>

我已对此进行了测试,但确实有效。您可以根据自己的需要摆动你的砝码。