3 回答
TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
這一行可能是罪魁禍?zhǔn)祝?/p>
Activity activity = (Activity) v.getContext();
的觀點(diǎn)v傳遞給onClick()方法是相同的觀點(diǎn),即你分配聽(tīng)者,所以v是一樣的holder.parentLayot。我不知道確切holder.parentLayot來(lái)自哪里,但很有可能(在 XML 中)此視圖(或其父視圖之一)具有android:theme屬性。
當(dāng)視圖具有該android:theme屬性時(shí),它不會(huì)直接使用其活動(dòng)的上下文。相反,android 框架會(huì)將 Activity 的上下文“包裝”在 aContextThemeWrapper中以修改視圖的主題。
要從此包裝器訪問(wèn)活動(dòng),您必須“解開”它。嘗試這樣的事情:
private static Activity unwrap(Context context) {
while (!(context instanceof Activity) && context instanceof ContextWrapper) {
context = ((ContextWrapper) context).getBaseContext();
}
return (Activity) context;
}
然后,您可以在您的onClick()而不是直接轉(zhuǎn)換上下文中使用此方法:
Activity activity = unwrap(v.getContext());
TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
Kotlin 中的遞歸解決方案:
fun Context.getActivity(): Activity? {
return when (this) {
is Activity -> this
is ContextWrapper -> this.baseContext.getActivity()
else -> null
}
}
檢查使用情況View.getContext()。
TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
簡(jiǎn)單地使用上下文就可以了
FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager();
添加回答
舉報(bào)
