Android应用标题过长被Toolbar截断,如何实现标题可滚动?
嘿,这个问题我太熟了!当Toolbar里的标题太长时,默认的TextView只会截断显示,想要让它滚动起来其实不难,给你两种实用的解决方案:
方法1:自定义Toolbar布局(灵活可控)
这种方式可以完全掌控标题的样式和行为,适合需要自定义样式的场景:
- 首先创建一个自定义的Toolbar布局文件(比如
res/layout/custom_toolbar.xml):
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/custom_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary"> <TextView android:id="@+id/toolbar_title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center_vertical" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:text="@string/app_name" android:textColor="@android:color/white" android:textSize="?attr/textAppearanceHeadline6" /> </androidx.appcompat.widget.Toolbar>
这里的关键属性:
android:ellipsize="marquee":设置超出部分以滚动方式显示android:marqueeRepeatLimit="marquee_forever":无限重复滚动android:focusable和android:focusableInTouchMode:确保TextView能获取焦点触发滚动layout_weight="1":让标题占据Toolbar的可用空间(避开左侧返回键、右侧菜单)
- 在你的Activity中替换默认Toolbar并启用滚动:
Kotlin版本
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val toolbar = findViewById<Toolbar>(R.id.custom_toolbar) setSupportActionBar(toolbar) // 隐藏系统默认的标题,避免重复显示 supportActionBar?.setDisplayShowTitleEnabled(false) val titleTextView = findViewById<TextView>(R.id.toolbar_title) // 这一步是核心!设置为选中状态才能触发滚动动画 titleTextView.isSelected = true }
Java版本
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.custom_toolbar); setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayShowTitleEnabled(false); } TextView titleTextView = findViewById(R.id.toolbar_title); titleTextView.setSelected(true); }
方法2:直接修改默认标题TextView(快速简洁)
如果不想改布局,直接获取Toolbar自带的标题TextView,修改它的属性即可:
Kotlin版本
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val toolbar = findViewById<Toolbar>(R.id.toolbar) setSupportActionBar(toolbar) // 获取Toolbar的第一个子View(默认就是标题TextView) val titleTextView = toolbar.getChildAt(0) as? TextView titleTextView?.apply { ellipsize = TextUtils.TruncateAt.MARQUEE isFocusable = true isFocusableInTouchMode = true marqueeRepeatLimit = -1 // 等价于marquee_forever,无限滚动 isSelected = true setHorizontallyScrolling(true) } }
Java版本
import android.text.TextUtils; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); TextView titleTextView = (TextView) toolbar.getChildAt(0); if (titleTextView != null) { titleTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); titleTextView.setFocusable(true); titleTextView.setFocusableInTouchMode(true); titleTextView.setMarqueeRepeatLimit(-1); titleTextView.setSelected(true); titleTextView.setHorizontallyScrolling(true); } }
注意事项
- 不管用哪种方法,
isSelected = true都是触发滚动效果的核心,一定要记得设置! - 如果Toolbar右侧有菜单按钮,确保标题TextView有足够的空间(方法1的
layout_weight已经处理了这个问题) - 如果想要滚动一次就停止,可以把
marqueeRepeatLimit设为具体的数值(比如1)
内容的提问来源于stack exchange,提问作者IRON MAN
相关产品推荐
相关产品推荐

