2013年的一个问题,仍然是一件事。
好吧,对于那些偶尔看到这种情况仍然感到震惊的人,即使你很高兴地使用 Androidx、所有最近的工件等。我找到了修复它的东西,它不需要自定义标题或任何特殊的东西。
请记住,这可能不是您的情况,但它似乎在瞬间神奇地解决了这个问题。
就我而言,Toolbar
, 像往常一样设置supportActionBar
,它包含在CoordinatorLayout
+AppBar
中。起初我会责怪那些,因为为什么不这样做,但在这样做之前,我决定检查工具栏的源代码并调试正在发生的事情。
我不知道(但我确实找到了导致此省略号的代码):
/**
* Set the title of this toolbar.
*
* <p>A title should be used as the anchor for a section of content. It should
* describe or name the content being viewed.</p>
*
* @param title Title to set
*/
public void setTitle(CharSequence title) {
if (!TextUtils.isEmpty(title)) {
if (mTitleTextView == null) {
final Context context = getContext();
mTitleTextView = new AppCompatTextView(context);
mTitleTextView.setSingleLine();
mTitleTextView.setEllipsize(TextUtils.TruncateAt.END);
if (mTitleTextAppearance != 0) {
mTitleTextView.setTextAppearance(context, mTitleTextAppearance);
}
if (mTitleTextColor != null) {
mTitleTextView.setTextColor(mTitleTextColor);
}
}
if (!isChildOrHidden(mTitleTextView)) {
addSystemView(mTitleTextView, true);
}
} else if (mTitleTextView != null && isChildOrHidden(mTitleTextView)) {
removeView(mTitleTextView);
mHiddenViews.remove(mTitleTextView);
}
if (mTitleTextView != null) {
mTitleTextView.setText(title);
}
mTitleText = title;
}
这直接来自最新的 Toolbar.java appCompat 1.1.0
(最新的时间是 2019 年 10 月)。
没什么特别的,但是您可以看到,当 TitleTextView 首次创建时,它设置为 singleLine 并在 END... 处使用 Ellipsize...(或在 LTR 语言中正确)。
但是,我注意到,当我调用 setTitle 时,代码并没有这样想,大概是因为之前创建了 titleTextView(当时使用 Ellipsis 设置为 singleLine);当我调用 setTitle 时,所有代码都在做mTitleTextView.setText(title)
. 工具栏上没有多少invalidate()
, forceLayout()
,requestLayout()
可以解决这个问题。
经过进一步检查,我注意到我的布局(协调器布局)包含在RelativeLayout
.
视图层次结构看起来像:
<RelativeLayout>
<CoordinatorLayout>
<AppBarLayout>
<androidx.appcompat.widget.Toolbar />
</AppBarLayout>
<androidx.viewpager2.widget.ViewPager2 />
<com.google.android.material.bottomnavigation.BottomNavigationView />
</CoordinatorLayout>
</RelativeLayout>
我从不喜欢RelativeLayout,一开始我认为这是一个糟糕的设计,但自从我记得以来,它也面临着各种问题,而且它在处理它的孩子方面非常糟糕。
为了好玩,我决定:“如果我把这个 RelativeLayout 改成一个 ConstraintLayout 会怎样?”
我在 Android Studio 可视化编辑器的 RelativeLayout 中“右键单击”-> 转换为 ConstraintLayout,下一步,完成(没有触及默认值)。
现在看起来像这样:
<ConstraintLayout>
<CoordinatorLayout>
<AppBarLayout>
<androidx.appcompat.widget.Toolbar />
</AppBarLayout>
<androidx.viewpager2.widget.ViewPager2 />
<com.google.android.material.bottomnavigation.BottomNavigationView />
</CoordinatorLayout>
</ConstraintLayout>
相同,但 ROOT 不再是相对布局。
我对生成的 XML 进行了两次手动更改:
这是 CoordinatorLayout 在转换后的样子:
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent">
它在预览中看起来不错,但它引起了我的注意,因为一个 _should not use match_parent
in child of ConstraintLayout ...所以...我将其更改为:
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordinatorLayout"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
这和我之前的完全一样(协调器布局占据了整个屏幕)。
这要归功于新的 ConstraintLayout 具有这些:
android:layout_width="match_parent"
android:layout_height="match_parent"
这神奇地一劳永逸地解决了我被截断的标题。
tl;博士
2019 年以后不要再使用 RelativeLayouts,从很多角度来看它们都是不好的。如果您的工具栏包含在相对布局中,请考虑迁移到 ConstraintLayout 或任何其他 ViewGroup。