Текст выделения в Android
Как я могу использовать выделенный текст в приложении для Android?
21 ответ
Вот пример:
public class TextViewMarquee extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) this.findViewById(R.id.mywidget);
tv.setSelected(true); // Set focus to the textview
}
}
XML-файл с textview:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/mywidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:maxLines="1"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:textColor="#ff4500"
android:text="Simple application that shows how to use marquee, with a long text" />
</RelativeLayout>
TextView textView = (TextView) this.findViewById(R.id.textview_marquee);
textView.setEllipsize(TruncateAt.MARQUEE);
textView.setText("General Information... general information... General Information");
textView.setSelected(true);
textView.setSingleLine(true);
android:ellipsize="marquee"
Это работает только тогда, когда ваш TextView
имеет фокус.
Просто поместите эти параметры в ваш TextView - это работает:D
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:focusable="true"
android:focusableInTouchMode="true"
И вам тоже нужно setSelected(true)
:
my_TextView.setSelected(true);
Привет, Кристофер
XML-код
<TextView
android:id="@+id/txtTicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_gravity="center_horizontal"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:freezesText="true"
android:gravity="center_horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:scrollHorizontally="true"
android:shadowColor="#FF0000"
android:shadowDx="1.5"
android:shadowDy="1.3"
android:shadowRadius="1.6"
android:singleLine="true"
android:textColor="@android:color/white"
android:textSize="20sp"
android:textStyle="bold" >
</TextView>
Джава
txtEventName.setSelected(true);
если текст маленький, то добавьте пробел до и после текста
txtEventName.setText("\t \t \t \t \t \t"+eventName+"\t \t \t \t \t \t");
Чтобы это работало, мне пришлось использовать ВСЕ три вещи (ellipsize, selected и singleLine), которые уже упоминались:
TextView tv = (TextView)findViewById(R.id.someTextView);
tv.setSelected(true);
tv.setEllipsize(TruncateAt.MARQUEE);
tv.setSingleLine(true):
Я обнаружил проблему с marquee, что он не может быть использован для коротких строк (так как его функция заключается только в показе длинных строк).
Я предлагаю использовать Webview, если вы хотите перемещать короткие строки по горизонтали. Main_Activity.java код:`
WebView webView;
webView = (WebView)findViewById(R.id.web);
String summary = "<html><FONT color='#fdb728' FACE='courier'><marquee behavior='scroll' direction='left' scrollamount=10>"
+ "Hello Droid" + "</marquee></FONT></html>";
webView.loadData(summary, "text/html", "utf-8"); // Set focus to the textview
`
код main_activity.xml:
<WebView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/web"
></WebView>
В XML-файле вам нужно добавить следующие дополнительные атрибуты в TextView, чтобы получить функцию, похожую на выделение:
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
В файле MainActivity.java вы можете получить ссылку на этот TextView, используя findViewById(), и вы можете установить следующее свойство для этого TextView, чтобы оно выглядело как текст выделения:
setSelected(true);
Это все, что вам нужно.
Я попробовал все вышеперечисленное, но для меня это не сработало. Когда я добавлю
android:clickable="true"
тогда это отлично сработало для меня. Я не знаю почему. Но я счастлив работать с этим.
Вот мой полный ответ.
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
Добавить код ниже в XML
<TextView
android:text="Shops NearBy textdf fsdgsdgsdg dsgtsgsdgsdgsg"
android:id="@+id/txtEventName"
android:ellipsize="marquee"
android:marqueeRepeatLimit ="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
android:singleLine="true"/>
В Java добавьте следующий код:
TextView txtEventName=(TextView)findViewById(R.id.txtEventName);
txtEventName.setSelected(true);
Как и настройки XML, определенные droidgren, мои тесты показали, что если текст, который вы хотите отобразить, короче ширины просмотра текста, то выделение не будет прокручиваться вообще. Возможные решения состоят в том, чтобы установить ширину представления на размер, меньший, чем длина текста, или объединить строку с собой 2 или 3 раза, возможно, с подходящим пробелом между ними, чтобы прокрутка выглядела нормально.
Многие ответы правильно говорят о том, что textView.setSelected(true)
требуется. Однако, если вы предпочитаете делать это только через XML, одним из вариантов может быть использование адаптеров привязки при работе с привязкой данных.
Итак, просто создайте новый адаптер, похожий на:
@BindingAdapter("app:autoStartMarquee")
fun setAutoStartMarquee(textView: TextView, autoStartMarquee: Boolean) {
textView.isSelected = autoStartMarquee
}
Затем вы можете просто использовать его в XML следующим образом:
...
<TextView
...
android:ellipsize="marquee"
android:singleLine="true"
app:autoStartMarquee="@{true}"/>
...
Больше не нужно вызывать его из кода.
С ответом выше, вы не можете установить скорость или иметь гибкость для настройки функциональности представления текста. Чтобы иметь собственную скорость прокрутки и гибкость для настройки свойств выделения, используйте следующее:
<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" />
В пределах вашей деятельности:
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);//set the duration
tanim.setInterpolator(new LinearInterpolator());
tanim.setRepeatCount(Animation.INFINITE);
tanim.setRepeatMode(Animation.ABSOLUTE);
textView.startAnimation(tanim);
}
Используйте это, чтобы установить Marque:
final TextView tx = (TextView) findViewById(R.id.textView1);
tx.setEllipsize(TruncateAt.MARQUEE);
tx.setSelected(true);
tx.setSingleLine(true);
tx.setText("Marquee needs only three things to make it run and these three things are mentioned above.");
Вам не нужно использовать "android: marqueeRepeatLimit =" marquee_forever"в XML-файл. Marquee будет работать даже без этого.
Вы можете использовать TextView или ваш собственный TextView. Последний случай, когда текстовое представление не может фокусироваться все время.
Во-первых, вы можете использовать TextView или пользовательский TextView в качестве прокручиваемого текстового представления в XML-файле макета следующим образом:
<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"/>
ПРИМЕЧАНИЕ: в приведенном выше фрагменте кода com.example.myapplication является примером имени пакета и должен быть заменен вашим собственным именем пакета.
Затем в случае использования CustomTextView вы должны определить класс CustomTextView:
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;
}
}
Надеюсь, это будет полезно для вас. Ура!
Вы можете использовать
android:ellipsize="marquee"
с вашим текстовым просмотром.
Но не забудьте сфокусироваться на желаемом текстовом представлении.
Это мой объект xml customTextView, здесь вы можете использовать просто TextView для замены на Tag.
<com.wedoapps.crickethisabkitab.utils.view.montserrat.CustomTextView
android:id="@+id/lblRateUsPlayStore"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_10sdp"
android:layout_marginBottom="@dimen/_10sdp"
android:layout_marginStart="@dimen/_5sdp"
android:layout_marginEnd="@dimen/_5sdp"
android:text="@string/please_rate_us_5_star_on_play_store"
android:textAllCaps="false"
android:textColor="@color/green"
android:textSize="@dimen/_25ssp"
android:textStyle="bold"
android:visibility="visible"
android:linksClickable="true"
android:autoLink="web|phone"/>
А вот и мой код файла Java. Я установил свой html-текст на сервере, просто замените ваш текст на объекте textview. Я поместил этот код в тег marquee с возможностью нажатия, если в этом текстовом окне есть ссылки, чтобы открыть мобильный или веб-браузер.
CustomTextView lblRateUsPlayStore = findViewById(R.id.lblRateUsPlayStore);
lblRateUsPlayStore.setMovementMethod(LinkMovementMethod.getInstance());
lblRateUsPlayStore.setText( Html.fromHtml(documentSnapshot.getString("DisplayText")));
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(lblRateUsPlayStore, 12, 20, 2, 1);
lblRateUsPlayStore.setEllipsize(TextUtils.TruncateAt.MARQUEE);
// Set marquee repeat limit (unlimited)
lblRateUsPlayStore.setMarqueeRepeatLimit(-1);
lblRateUsPlayStore.setHorizontallyScrolling(true);
lblRateUsPlayStore.setSelected(true);
lblRateUsPlayStore.setLinksClickable(true);
lblRateUsPlayStore.setFocusableInTouchMode(true);
lblRateUsPlayStore.setFocusable(true);
Особая благодарность Дэвиду Роману, я изменил его ответ на Котлин
import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
class MarqueeTextView : AppCompatTextView {
constructor(context: Context?) : super(context!!) {}
constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) {}
constructor(context: Context?, attrs: AttributeSet?, defStyle: Int) : super(
context!!,
attrs,
defStyle
) {
}
override fun onFocusChanged(focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) {
if (focused) super.onFocusChanged(focused, direction, previouslyFocusedRect)
}
override fun onWindowFocusChanged(focused: Boolean) {
if (focused) super.onWindowFocusChanged(focused)
}
override fun isFocused(): Boolean {
return true
}
}
Для программной установки Marquee
TextView textView = (TextView) this.findViewById(R.id.textview_marquee);
textView.setEllipsize(TruncateAt.MARQUEE);
textView.setMarqueeRepeatLimit(-1);
textView.setText("General Information... general information... General Information");
textView.setSelected(true);
textView.setSingleLine(true);
В Android(KOTLIN)
,Marquee
Эффект прокрутки текста может быть достигнут с помощьюTextView
виджет и настройку атрибутов и в XML-файле макета. Вот пример того, как создать область TextView вKotlin
:
В XML-файле макета (например,
activity_main.xml
), добавьте TextView с нужными атрибутами текста и выделения:` <текстовое представление
android:id="@+id/marqueeTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:text="This is a marquee text view example." android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true"
/> `
В этом примере мы устанавливаемandroid:singleLine
значение true, чтобы текст прокручивался по горизонтали в одну строку. android:ellipsize
Для атрибута установлено значение «marquee», чтобы включить эффект выделения. android:marqueeRepeatLimit
Для атрибута установлено значение «marquee_forever», чтобы выделение повторялось бесконечно. Атрибут android:text определяет исходный текст для отображения.
Примечание. Чтобы выделение работало, TextView должен иметь фокус. Поэтому мы установилиandroid:focusable
иandroid:focusableInTouchMode
значение true, чтобы позволить TextView получить фокус.
- В код Kotlin вы можете добавить следующие строки, чтобы программно включить эффект выделения:
val marqueeTextView = findViewById<TextView>(R.id.marqueeTextView) marqueeTextView.isSelected = true
Если установить для isSelected значение true, TextView начнет прокручиваться сразу же, как только представление получит фокус.
Обязательно заменитеR.id.marqueeTextView
с фактическим идентификатором вашего TextView в вашем коде. Настройте атрибуты макета и текстовое содержимое в соответствии с желаемым внешним видом и поведением.