HorizontalScrollView 剪切 TextView 中的文本并自动滚动
HorizontalScrollView cut the text in a TextView and autoscorlling
我有一个 ListView,我希望当我点击一个 ListView 项目时,底部的 TextView 会改变它的值,如果文本太大,它会自动滚动。
1) HorizontalScrollView截掉了文字,原文是“Enrique Iglesias - Bailando ft. Descemer Bueno, Gente De Zona”,但是没有space所以我只看到“Enrique Iglesias - Bailando ft.”。现在,我希望通过滚动我还能看到“Descemer Bueno,Gente De Zona”,但是没有...TextView 值是正确的,有全名,我用日志看...
我看到的:
我点击 TextView 看到的内容:
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 放在 HorizontalScrollView 标记中无法滚动,也需要单击):
<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 值过大而缩放。我想要始终相同的暗淡,真正的暗淡,就像第一张图片中那样。
解决方案 for textview value cut off see here:
默认情况下,选取框只会在聚焦时滚动。因此,如果您将 Selected 设置为 true,它将始终聚焦并因此滚动。
您需要在 textview 上将 Selected 设置为 true,这样文本才会滚动。
titleSongPlayngTextView.setSelected(true);
此外,没有文本视图的滚动视图毫无意义。你不需要使用滚动视图,但如果你使用,请将文本视图放入其中。
至于它切断文本,我需要看你的代码,因为你有播放器控制文本视图。
编辑
了解更多信息后
您的权重总和大于您的权重总和 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>
我已经对此进行了测试并且有效。您可以根据自己的需要调整重量。
我有一个 ListView,我希望当我点击一个 ListView 项目时,底部的 TextView 会改变它的值,如果文本太大,它会自动滚动。
1) HorizontalScrollView截掉了文字,原文是“Enrique Iglesias - Bailando ft. Descemer Bueno, Gente De Zona”,但是没有space所以我只看到“Enrique Iglesias - Bailando ft.”。现在,我希望通过滚动我还能看到“Descemer Bueno,Gente De Zona”,但是没有...TextView 值是正确的,有全名,我用日志看...
我看到的:
我点击 TextView 看到的内容:
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 放在 HorizontalScrollView 标记中无法滚动,也需要单击):
<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 值过大而缩放。我想要始终相同的暗淡,真正的暗淡,就像第一张图片中那样。
解决方案 for textview value cut off see here:
默认情况下,选取框只会在聚焦时滚动。因此,如果您将 Selected 设置为 true,它将始终聚焦并因此滚动。
您需要在 textview 上将 Selected 设置为 true,这样文本才会滚动。
titleSongPlayngTextView.setSelected(true);
此外,没有文本视图的滚动视图毫无意义。你不需要使用滚动视图,但如果你使用,请将文本视图放入其中。
至于它切断文本,我需要看你的代码,因为你有播放器控制文本视图。
编辑
了解更多信息后
您的权重总和大于您的权重总和 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>
我已经对此进行了测试并且有效。您可以根据自己的需要调整重量。