以编程方式 Textview 选取框

Posted

技术标签:

【中文标题】以编程方式 Textview 选取框【英文标题】:Textview marquee programmatically 【发布时间】:2017-06-15 01:24:09 【问题描述】:

尝试从数组中填充文本视图。我设法通过下面的代码通过 XML 获得所需的效果

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical">

    <TextView
        android:id="@+id/marque_scrolling_text"
        android:layout_
        android:layout_
        android:layout_marginTop="16dp"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:padding="16dp"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:text="Create a Marquee (Scrolling Text) in Android Using TextView. Android Marquee (Scrolling Text) Tutorial with Example"
        android:textSize="24sp" />
</LinearLayout>

但我需要其中的几个在一个数组中 - 所以我相信以编程方式创建文本视图可能是答案,但不能让它们选框。这是我正在处理的代码。

String[] strings = "Mark", "James", "Paul";
        LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout);


        for(String s : strings)
        
             TextView newTextView = new TextView(this);
             newTextView.setText(s);
             newTextView.setSingleLine(true);
             newTextView.setEllipsize(TextUtils.TruncateAt.END);       
             newTextView.setHorizontallyScrolling(true);
             newTextView.setLines(1);
             newTextView.setMarqueeRepeatLimit(-1);
             newTextView.setSelected(true);  
             newTextView.setTextSize(24);
             layout.addView(newTextView);
        

【问题讨论】:

【参考方案1】:

试试这个..它有效

TextView testing = (TextView) this.findViewById(R.id.testing);
testing.setEllipsize(TextUtils.TruncateAt.MARQUEE);
testing.setMarqueeRepeatLimit(-1);
testing.setSingleLine(true);
testing.setSelected(true);

【讨论】:

注:setMarqueeRepeatLimit(-1);与 XML 中的 android:marqueeRepeatLimit="marquee_forever" 相同【参考方案2】:

试试这个。

final RelativeLayout relativeLayout = new RelativeLayout(this);
final RelativeLayout relativeLayoutbotombar = new RelativeLayout(this);
textView = new TextView(this);
textView.setId(1);

RelativeLayout.LayoutParams relativlayparamter = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT);

        RelativeLayout.LayoutParams relativlaybottombar = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        relativeLayoutbotombar.setLayoutParams(relativlaybottombar);


        textView.setText("text text text text text, with a long ");
        textView.setEllipsize(TruncateAt.MARQUEE);
        textView.setSelected(true);
        textView.setSingleLine(true);


        relativeLayout.addView(relativeLayoutbotombar);
        relativeLayoutbotombar.addView(textView);
        setContentView(relativeLayout, relativlayparamter);

另一种选择:

TextView textView = (TextView) this.findViewById(R.id.xxx);  
textView.setEllipsize(TruncateAt.MARQUEE);
textView.setText("Text text text text");
textView.setSelected(true);
textView.setSingleLine(true);

【讨论】:

感谢您的及时回复,但似乎不起作用 - 没有滚动。【参考方案3】:

使用此代码。我改进了你的代码,享受复制粘贴。

    val strings = arrayOf("Mark", "James", "Paul")
    val layout = findViewById<View>(R.id.linear) as LinearLayout
    layout.orientation = LinearLayout.VERTICAL
    for (s in strings) 
        val newTextView = TextView(this)

        newTextView.layoutParams = ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT)

        newTextView.text = s
        newTextView.isSingleLine = true
        newTextView.ellipsize = TextUtils.TruncateAt.END
        newTextView.setHorizontallyScrolling(true)
        newTextView.setLines(1)
        newTextView.marqueeRepeatLimit = -1
        newTextView.isSelected = true
        newTextView.textSize = 24f
        
        addMarquee(newTextView)
        
        layout.addView(newTextView)
    

将此函数添加到您的类中

    fun addMarquee(textView: TextView) 
    textView.viewTreeObserver.addOnGlobalLayoutListener(object :
        ViewTreeObserver.OnGlobalLayoutListener 
        override fun onGlobalLayout() 
            val pixels = textView.measuredWidth - 1
            val params = textView.layoutParams
            params.width = pixels
            textView.layoutParams = params
            textView.isSelected = true
            textView.ellipsize = TextUtils.TruncateAt.MARQUEE
            textView.isSingleLine = true
            textView.marqueeRepeatLimit = -1
            textView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        
    )

【讨论】:

以上是关于以编程方式 Textview 选取框的主要内容,如果未能解决你的问题,请参考以下文章

Android Widget:Textview 在主页滚动时停止选取框

java 添加指向TextView的链接。 Linkify。字体:https://stackoverflow.com/questions/4746293/android-linkify-textvie

以编程方式设置 TextView 的布局权重

至于TextView,以编程方式更改样式?

以编程方式Android的TextView

当以编程方式完成时,视图不会反映任何变化