0

我一直在使用以下解决方法将活动标签居中(无需在 XML 布局中使用自定义标题):

((TextView)((FrameLayout)((LinearLayout)((ViewGroup) getWindow().getDecorView()).getChildAt(0)).getChildAt(0)).getChildAt(0)).setGravity(Gravity.CENTER);

这很好用,但每隔一段时间我就会看到一个用户(在 Google Play 上)得到一个

java.lang.ClassCastException:com.android.internal.widget.ActionBarView 不能转换为 android.widget.TextView

这些可能是运行 Android 3.x 或更高版本的平板电脑用户。

没有实现我自己的自定义标题,可以让我直接访问活动标签,你能推荐另一种方法来避免ActionBarViewClassCastExceptionTextView吗?

也许检查应用程序当前运行的 Android 版本并通过另一个级别getChildAt(0)

4

2 回答 2

1
((FrameLayout)((LinearLayout)((ViewGroup) getWindow().getDecorView()).getChildAt(0)).getChildAt(0)).getChildAt(0)

从这里开始收集子视图,并搜索您自己的 TextView...您只需要跳过操作栏,无论如何,当您开始使用 hack 时,无需对此感到满意。

于 2012-08-16T16:07:20.767 回答
1

操作栏在主题中定义。因此,如果您想避免出现这种情况,您需要选择不同的主题。

或者,您可以检测用户正在使用的操作系统版本,如果是 11 (Honeycomb) 或更高版本,只需跳过操作栏并获取下一个视图。

看起来像

if (Integer.valueOf(android.os.Build.VERSION.SDK) > 11)
{
    ((TextView)((FrameLayout)((LinearLayout)((ViewGroup).getWindow().getDecorView()).getChildAt(1)).getChildAt(0)).getChildAt(0)).setGravity(Gravity.CENTER);
}
else
   ((TextView)((FrameLayout)((LinearLayout)((ViewGroup).getWindow().getDecorView()).getChildAt(0)).getChildAt(0)).getChildAt(0)).setGravity(Gravity.CENTER);

我还想像 Shark 所说的那样补充一下,这是一个完全的 hack,不是很健壮的代码。您应该使用 findViewById() 来定位您的视图并避免所有那些超级丑陋的投射。如果你继续沿着这条路走下去,你可以期待你的 hack 甚至我刚刚输入的代码在未来被破坏。

于 2012-08-16T16:04:03.903 回答