为什么getResources()。getIdentifier()在这里工作(API级别22)?

时间:2015-05-05 17:16:40

标签: android

尝试更改AlertDialog的外观,我使用DialogFragmentThemedDialogFragment子类化,并将此行称为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(*)工具确认。

试图做小变种

e.g。

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。:我解决了AlertDialog样式问题,通过对themes.xml进行操作,我只是想知道为什么这个方法不起作用(它应该是IMO)。 话虽如此,我将向每个答案告诉我如何设置AlertDialog的样式,因为它在这里是偏离主题的。感谢。

P.P.S:作为旁注,我尝试使用这种方法再次编译sdk级别22并在运行Android Jelly Bean 4.3.1的Android模拟器上进行测试。

P.P.P.S:运行5.1.1的模拟器也没有运气。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试访问内部资源ID。在这种情况下,包不是“android”而是“com.android.internal”,但我不确定即使那样实际上也会为你返回ID。

Android Dialog with modifiable single line title

  

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