Текст выделения в 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"

с вашим текстовым просмотром.

Но не забудьте сфокусироваться на желаемом текстовом представлении.

Это будет эквивалентно "концу":

where = TruncateAt.END

Это мой объект 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:

  1. В 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 получить фокус.

  1. В код Kotlin вы можете добавить следующие строки, чтобы программно включить эффект выделения:

val marqueeTextView = findViewById<TextView>(R.id.marqueeTextView) marqueeTextView.isSelected = true

Если установить для isSelected значение true, TextView начнет прокручиваться сразу же, как только представление получит фокус.

Обязательно заменитеR.id.marqueeTextViewс фактическим идентификатором вашего TextView в вашем коде. Настройте атрибуты макета и текстовое содержимое в соответствии с желаемым внешним видом и поведением.

Другие вопросы по тегам