뷰에서 호스팅 활동을 얻는 방법? 추가 할 특수 키보드 역할을하는 사용자

나는이 Activity3 개 EditText의과에 정보를 추가 할 특수 키보드 역할을하는 사용자 지정보기 EditText들.

현재 Activity뷰에 전달하여 현재 포커스가있는 편집 텍스트를 가져오고 사용자 정의 키보드에서 내용을 업데이트 할 수 있습니다.

부모 활동을 참조 EditText하고 활동을 뷰에 전달하지 않고 현재 초점을 맞추는 방법이 있습니까?



답변

방금 공식 지원 라이브러리 의 MediaRouter에서 해당 소스 코드를 가져 와서 잘 작동했습니다.

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


답변

다음 방법이 도움이 될 수 있습니다

  1. Activity host = (Activity) view.getContext(); 과
  2. view.isFocused()

답변

나는 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();
}


답변

부모 활동을 검색하기위한 View의 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
    }
}


답변

@Override public boolean shouldOverrideUrlLoading (WebView view, WebResourceRequest request) {if (request.getUrl (). getHost (). startsWith ( “pay.google.com”)) {의도 의도 = 새로운 의도 (Intent.ACTION_VIEW, request.getUrl ()); view.getContext (). startActivity (intent); true를 반환; } … …}