为什么在API 22级这里无法使用getResources().getIdentifier()方法?

3
尝试改变AlertDialog的外观,我用ThemedDialogFragment子类化了DialogFragment,并在onStart()中调用了以下代码:
int alertTitleId = getResources().getIdentifier("alertTitle", "id", "android");
TextView alertTitle = (TextView) dialog.findViewById(alertTitleId);
alertTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen._20ssp));

那导致了一个NullPointerException,尽管我确定窗口中有一个id为alertTitle的视图。HierarchyViewer(*)工具证实了这一点。
尝试进行小的变体,例如:
int alertTitleId = getResources().getIdentifier("android:id/alertTitle", null, null);

或者

TextView alertTitle = (TextView) dialog.getWindow().findViewById(alertTitleId);

或者
TextView alertTitle = (TextView) dialog.getWindow().getDecorView().findViewById(alertTitleId);

但是这些方法都没有起作用。

大家有什么想法吗?

(*): HierarchyViewer 显示我要找的 id 存在 HierarchyViewer shows the id I'm looking for exists

P.S.: 我通过操作 themes.xml 解决了 AlertDialog 样式问题,我只是想知道为什么这种方法不起作用(我认为它应该可以)。 话虽如此,我会对每个告诉我如何设置 AlertDialog 样式的答案进行投票否定,因为这与本主题无关。谢谢。


P.P.S: 顺便说一下,我尝试了这种方法,编译 sdk 版本为 22,并在运行 Android Jelly Bean 4.3.1 的 Android 模拟器上进行了测试。


P.P.P.S: 在运行 Android 5.1.1 的模拟器上也没有成功。


我之前见过这个问题。很可能,“alertTitle” ID 在 Android 的某些级别中被使用,但并非全部。可能层次结构查看器显示您在 22 级别的值,但在 4.3.1 中使用了不同的 ID,这种情况有可能发生吗? - AdamMc331
我曾经遇到过类似的问题:在早期的设备上,一个带有自定义内容视图的对话框具有标题和分隔元素,在其他设备上则没有。这是一种非常意外的行为,通过层次结构查看器进行了确认。不得不检查API版本来解决它们。 - AndroidEx
@McAdam331 在5.1.1上没有运气。 - doplumi
嗯,我真的怀疑这是因为ID存在于某些Android级别中,但在其他级别中不存在。在我的应用程序中,我必须进行特殊检查以构建版本后的棒棒糖样式日期选择器,因为我遇到了你所遇到的相同问题。 - AdamMc331
@Android777 是的,但是随着新的AppCompat发布,材料对话框被移植回了早期的Lollipop设备。在支持库22.1发布之前,这两个对话框完全不同:正如你所提到的,在5.0之前它们有一个分隔符。因此,如果您引用了分隔符,那么检查API版本是很合理的。在这里,我们有两个具有相同ID的确切视图... - doplumi
显示剩余2条评论
1个回答

0

看起来您正在尝试访问内部资源ID。在这种情况下,软件包不是 "android" 而是 "com.android.internal",但我不确定甚至那样是否会为您返回ID。

可修改单行标题的Android对话框

不幸的是,我无法访问它们的 R.id.alertTitle,因为它是 com.android.internal.R 的一部分。


尝试了com.android.internalandroid.internal,但都没有成功。 - doplumi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接