3 回答
![?](http://img1.sycdn.imooc.com/5458622b000117dd02200220-100-100.jpg)
TA贡献1777条经验 获得超10个赞
这一行可能是罪魁祸首:
Activity activity = (Activity) v.getContext();
的观点v传递给onClick()方法是相同的观点,即你分配听者,所以v是一样的holder.parentLayot。我不知道确切holder.parentLayot来自哪里,但很有可能(在 XML 中)此视图(或其父视图之一)具有android:theme属性。
当视图具有该android:theme属性时,它不会直接使用其活动的上下文。相反,android 框架会将 Activity 的上下文“包装”在 aContextThemeWrapper中以修改视图的主题。
要从此包装器访问活动,您必须“解开”它。尝试这样的事情:
private static Activity unwrap(Context context) {
while (!(context instanceof Activity) && context instanceof ContextWrapper) {
context = ((ContextWrapper) context).getBaseContext();
}
return (Activity) context;
}
然后,您可以在您的onClick()而不是直接转换上下文中使用此方法:
Activity activity = unwrap(v.getContext());
![?](http://img1.sycdn.imooc.com/545847aa0001063202200220-100-100.jpg)
TA贡献1828条经验 获得超13个赞
Kotlin 中的递归解决方案:
fun Context.getActivity(): Activity? {
return when (this) {
is Activity -> this
is ContextWrapper -> this.baseContext.getActivity()
else -> null
}
}
检查使用情况View.getContext()。
![?](http://img1.sycdn.imooc.com/5458655200013d9802200220-100-100.jpg)
TA贡献1856条经验 获得超17个赞
简单地使用上下文就可以了
FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();
添加回答
举报