【问题标题】:DecorContext cast ActivityDecorContext 投射活动
【发布时间】:2017-01-23 00:56:55
【问题描述】:

我有一个类 NavActivity

public class NavActivity extends Activity implements OnItemLongClickListener {
....
}

在另一个类的函数中,我有以下代码:

    LocalActivityManager activityManager = this.getLocalActivityManager();
    Window window = activityManager.startActivity(tag, intent);

    final View view = window.getDecorView();
    Context decorContext = view.getContext();

    NavActivity nextActivity;
    nextActivity = (NavActivity)decorContext;

在以前的 Android 版本中,一切运行良好。但是在安卓 7.0.它停在这一行并显示以下错误:

原因:java.lang.ClassCastException:com.android.internal.policy.DecorContext 无法转换为 xxxxx.nav.NavActivity

不明白为什么在 Android 7.0 中从 DecorContext 转换为 Activity 不再起作用。

【问题讨论】:

标签: java android


【解决方案1】:

对于这个具体的例子,我找到了以下解决方案:

我通过以下方式收到所需的活动:

nextActivity = (NavActivity)activityManager.getCurrentActivity();

但在我的项目中,无论如何我都需要从 Activity 接收正确的视图,然后从 Activity 接收视图。

以前,getDecorView 工作正常:

View view = activity.getWindow().getDecorView();

然后返回:

Activity activity = (Activity) view.getContext();

但在 Android 7 (Nougat) 中,DecorView 不再知道它与哪个 Activity 相关。目前还不清楚该怎么做。

【讨论】:

    【解决方案2】:

    因为在 View 上调用 getContext 并不能保证返回一个 Activity,所以它返回一个 Context。有时,从 xml 初始化的视图在 WrappedContext 中传递——一个包装另一个上下文并覆盖某些值的上下文。假设 Context 将是一个 Activity 是绝对不安全的。如果它之前有效,那么你很幸运 - 我已经看到这种失败一直到至少 4.x

    【讨论】:

    • 你很少需要传入一个Activity,一般connect就足够了。如果你真的这样做了,明确地传递它而不是假设上下文就是它