カスタムビューを作成しましたが、ハンドラ関連の操作を実行するにはアクティビティ参照が必要です。 getContext()はコンテキストを取得する方法ですが、同じアクティビティの参照を取得する方法はありますか?
コンテキストをActivityにキャストするだけで問題ありません。
MyActivity myActivity = (MyActivity) getContext();
GetContext()をActivity(例:(Activity)getContext();)にキャストしても、ビューがアクティビティコンテキストから呼び出されない場合、アクティビティオブジェクトが返されないことがあります。
それで、
public Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
「while」は、アクティビティが見つかるまですべてのベースコンテキストをバブルアップするか、ルートコンテキストが見つかるとループを終了するために使用されます。ルートコンテキストが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);
「コンテキスト」を使用する代わりに「アクティビティ」を使用することをお勧めします(コンテキストからアクティビティを実行できるとは限りませんが、その反対は問題ありません)。
個人クラスでは、コンストラクターでアクティビティを必須パラメーターとして要求するだけです=> public void constructorOfTheClass(Activity activity){...}。
アクティビティでコンストラクターを呼び出す場合は、このパラメーターを指定するだけで、クラス内で直接操作できます。