如何在View类中获取Activity引用?

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

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

MyActivity myActivity = (MyActivity) getContext(); 

如果未从Activity上下文调用View,则将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”用于通过所有基本上下文冒泡,直到find活动,或者在find根上下文时退出循环。 导致根上下文将具有null baseContext,从而导致循环结束。

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

查看课程

 public class DrawView extends View { Context actContext; public DrawView(Context context) { super(context); actContext=context; } } 

并在您的活动类中

 DrawView drawView=new DrawView(this); 

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

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

在主活动类中,您可以按如下方式创建其对象:

 MyHandler ca=new MyHandler(MainActivity.this); 

我建议使用“活动”而不是使用“上下文”(从上下文中调用Activity并不总是可行,而反之则没有任何问题)。

在您的个人class级中,只需要在其构造函数中请求活动作为必需参数=> public void constructorOfTheClass(Activity activity){…}。

当您在Activity中调用构造函数时,只需指出此参数,您就可以直接在类中使用它。