【问题标题】:How to get Activity reference in View class? [duplicate]如何在 View 类中获取 Activity 引用? [复制]
【发布时间】:2023-03-03 10:20:02
【问题描述】:

我创建了一个自定义视图,需要 Activity 参考 来执行一些 Handler 相关的操作。我知道 getContext() 是一种获取 Context 的方法,但是有什么方法可以获取相同的 Activity 参考吗?

【问题讨论】:

  • getContext 是正确的方法,因为您正在使用 Actvity 的上下文来膨胀视图
  • 你想在继承自Activity类的类中使用getActivity()吗?
  • 在 stackoverflow.com/a/51077569/787399 中查看我的答案

标签: android android-activity view android-context


【解决方案1】:

将上下文转换为 Activity 应该没问题:

MyActivity myActivity = (MyActivity) getContext();

【讨论】:

  • 我做的一样...它对我有用...谢谢
  • 请注意 getContext() 在某些情况下可能不会返回主机活动,例如 appwidgets 或当您膨胀视图而不将其添加到容器时,出于某种原因。
  • 它也可能返回一个ContextThemeWrapper,不能强制转换为Activity。
  • 真的,谢谢你的提示。如果您在“普通”应用程序上下文之外,请小心。
  • @user153275 这什么时候会发生?
【解决方案2】:

如果您的 View 不是从 Activity 上下文调用的,则将 getContext() 转换为 Activity(例如 (Activity)getContext();)可能并不总是返回 Activity 对象。

因此,

    public Activity getActivity() {
        Context context = getContext();
        while (context instanceof ContextWrapper) {
            if (context instanceof Activity) {
                return (Activity)context;
            }
            context = ((ContextWrapper)context).getBaseContext();
        }
        return null;
    }

“while”用于在所有基本上下文中冒泡,直到找到活动,或者在找到根上下文时退出循环。因为根上下文会有一个空的baseContext,导致循环结束。

【讨论】:

  • 这是最好的答案,也是我来这里的目的。谢谢它为我节省了很多时间。
  • 谢谢,我刚刚将 ((Activity) getContext()).runOnUiThread( (new Thread(new Runnable() { 替换为 getActivity().runOnUiThread( (new Thread(new Runnable() { 和它有效......
【解决方案3】:

像这样在 View 类的构造函数中传递上下文

查看类

public class DrawView extends View {

    Context actContext;

    public DrawView(Context context) {
        super(context);

        actContext=context;
    }
}

在你的活动课中

DrawView drawView=new DrawView(this);

【讨论】:

  • 通常我喜欢这样,工作正常。有时(在某些情况下)需要额外检查以避免崩溃。
【解决方案4】:

您可以通过在定义其对象时在处理程序的构造函数中发送活动的上下文来获取活动引用,并且处理程序类中的构造函数定义定义如下:

private Context mContext;
public MyHandler(Context context) {
    mContext=context;
}

在你的主要活动类中,你可以按如下方式制作它的对象:

MyHandler ca=new MyHandler(MainActivity.this);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多