16

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

4

4 回答 4

33

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

MyActivity myActivity = (MyActivity) getContext();
于 2013-10-25T08:57:08.503 回答
26

如果您的 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,导致循环结束。

于 2016-07-07T10:53:32.570 回答
1

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

查看课程

public class DrawView extends View {

    Context actContext;

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

        actContext=context;
    }
}

在你的活动课上

DrawView drawView=new DrawView(this);
于 2013-10-25T09:05:45.977 回答
0

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

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

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

MyHandler ca=new MyHandler(MainActivity.this);
于 2013-10-25T09:16:21.487 回答