回答:
私は公式のサポートライブラリの MediaRouterからそのソースコードをプルしただけで、これまでのところ正常に機能します。
private Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
次の方法が役立つかもしれません
Activity host = (Activity) view.getContext()
; そしてview.isFocused()
getContext()
ビューがActivityコンテキストから呼び出されない場合、Activityオブジェクトが常に返されるとは限らないことを忘れないでください。これを前もって計画し、適切なフォールバックを提供してください。
ContextThemeWrapper
toのようなものをキャストするとActivity
がスローされますClassCastException
。ベースコンテキスト(アクティビティである必要があります)を展開する方法が必要です。これには、ネイティブのv7バージョンのがあるため、それ自体が危険ですContextThemeWrapper
。
Kotlinで書かれたこのソリューションが好き
tailrec fun Context?.activity(): Activity? = when (this) {
is Activity -> this
else -> (this as? ContextWrapper)?.baseContext?.activity()
}
View
クラスでの使用
context.activity()
逆コンパイルされたコード:
public static final Activity activity(Context context) {
while (!(context instanceof Activity)) {
if (!(context instanceof ContextWrapper)) {
context = null;
}
ContextWrapper contextWrapper = (ContextWrapper) context;
if (contextWrapper == null) {
return null;
}
context = contextWrapper.getBaseContext();
if (context == null) {
return null;
}
}
return (Activity) context;
}
Gominoの回答を取り、myUtils.javaに完全に収まるように修正したので、いつでもどこでも使用できます。誰かがそれが役に立ったと願っています:)
abstract class myUtils {
public static Activity getActivity(View view) {
Context context = view.getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
}
Android 7以降では、ビューは外側のアクティビティにアクセスview.getContext()
できなくなったため、アクティビティにキャストできなくなりました。
代わりに、以下のコードはAndroid 7以降および6で機能します。
private static Activity getActivity(final View view) {
return (Activity) view.findViewById(android.R.id.content).getContext();
}
getContext
はおそらくaを返すContextThemeWrapper
ため、ビューはアクティビティに直接アクセスできなくなります。代わりに、親アクティビティが見つかるか、この回答で提供した方法を使用するまで、親コンテキストを再帰的に検索する必要があります。
親アクティビティを取得するためのビューのKotlin拡張プロパティ:
val View.activity: Activity?
get() {
var ctx = context
while (true) {
if (!ContextWrapper::class.java.isInstance(ctx)) {
return null
}
if (Activity::class.java.isInstance(ctx)) {
return ctx as Activity
}
ctx = (ctx as ContextWrapper).baseContext
}
}
if
持つwhen
とisInstance()
して!is ContextWrapper
やis Activity
@Override public boolean shouldOverrideUrlLoading(WebView view、WebResourceRequest request){if(request.getUrl()。getHost()。startsWith( "pay.google.com")){Intent intent = new Intent(Intent.ACTION_VIEW、request.getUrl ()); view.getContext()。startActivity(intent); trueを返します。} ... ...}