Bir görünümden Hosting Etkinliği nasıl elde edilir?


187

Ben bir Activity3 EditTexts ve EditTexts içine bilgi eklemek için özel bir klavye hareket özel bir görünüm var .

Şu anda Activitygörünüme geçiyorum, böylece şu anda odaklanmış düzenleme metnini alabilir ve içeriği özel klavyeden güncelleyebilirim.

Üst etkinliğe referansta EditTextbulunmanın ve etkinliği görünüme geçirmeden o anda odaklanmanın bir yolu var mı ?


7
Doğru cevap gomino.
djunod

Yanıtlar:


305

Bu kaynak kodunu resmi destek kitaplığındaki MediaRouter'dan aldım ve şu ana kadar iyi çalışıyor:

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

13
süre? neden?
Jakob Eriksson

9
Bu, etkinlik bulunana kadar tüm temel bağlamda kabarcık oluşturmanın veya kök bağlam bulunduğunda döngüden çıkmanın bir yoludur. Kök bağlamın boş bir baseContext olması, döngünün sonuna götürür.
Gomino

1
Çok iyi ! Ben ((Etkinlik) getContext ()) getActivity () ile değiştirdim ve iyi çalışıyor .... Teşekkürler
Christian

söylendiği gibi, Görünümünüz bir Etkinlik bağlamından çağrılmazsa getContext () her zaman bir Etkinlik nesnesini temsil etmeyebilir. Örneğin, özel görünümler için çalışmaz.
Tohid

@AbhinavSaxena Bize bu kodun başarısız olacağı bir örnek verebilir misiniz? Yöntemin kendisi null döndürse bile, oraya asla ulaşmamalıdır.
Tiago

168

aşağıdaki yöntemler size yardımcı olabilir

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

35
getContext()Görünümünüz bir Etkinlik bağlamından çağrılmazsa, her zaman bir Etkinlik nesnesi döndürmeyebileceğini unutmayın . Bunu önceden planladığınızdan ve uygun bir geri dönüş sağladığınızdan emin olun.
Dzhuneyt

1
@WordPressDeveloper - Bir etkinlik etkinlik olmadan nasıl oluşturulabilir? Uzak görüş mü demek istiyorsun? Etkinlik dışında oluşturulan başka görünümler var mı?
AlikElzin-kilaka

1
@kilaka Widget'ları, Parçaları, RemoteViews, LayoutInflaters, bir Etkinliğe bağlı olmayan bir görünüm oluşturabileceğiniz durumlardır.
Dzhuneyt

4
@WordPressDeveloper - Bir parçada bir görünüm oluşturduğunuzda, içeriği hala etkinliktir. Parçalar yalnızca Etkinlikler'de bulunabilir.
AlikElzin-kilaka

24
Bu oldukça tehlikeli bir oyuncu. Bir böyle bir şey döküm, sahip olduğun bağlam sarılı olduğu (eğer AppCompat kullanıyorsanız) iyi bir şans var ContextThemeWrapperiçin Activitybir atacağım ClassCastException. Bir yerel ve v7 sürümü olduğu için kendi başına tehlikeli olan temel bağlamı (bir Etkinlik olması gerekir) çözmenin bir yoluna ihtiyacınız olacaktır ContextThemeWrapper.
alex

12

Kotlin'de yazılmış bu çözümü beğendim

tailrec fun Context?.activity(): Activity? = when (this) {
    is Activity -> this
    else -> (this as? ContextWrapper)?.baseContext?.activity()
}

ViewSınıfta kullanım

context.activity()

Ayrıştırılmış kod:

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;
}

1
teşekkürler, kotlin bu güzel tarama etkinliği için gerçekten takdir
mochadwi

8

Çektiğim Gomino 'ın cevabı ve her ne zaman ı gerekmez bunu nerede ve kullanabilmesi myUtils.java mükemmel şekilde uyacak biçimde modifiye. Umarım birisi faydalı bulur :)

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;
    }
}

Bu etkili yanıt değildir, çünkü bu işlevden döndürüldüğünde boş değer alma şansı vardır. Cevabım, bazı sıkı çalışma ve anlayışla evrensel olarak uygulanabilir: stackoverflow.com/a/51077569/787399
Abhinav Saxena

-1

Android 7 ve sonraki sürümlerinde görünüm artık çevreleme etkinliğine erişemez, bu nedenle view.getContext()artık bir Etkinliğe yayınlanamaz.

Bunun yerine, aşağıdaki kod Android 7+ ve 6'da çalışır:

private static Activity getActivity(final View view) {
    return (Activity) view.findViewById(android.R.id.content).getContext();
}

6
"Android 7 ve sonraki sürümlerinde görünümün artık ek etkinliğe erişimi yoktur, bu nedenle view.getContext () bir Etkinliğe kullanılamaz" Herhangi bir başvuru var mı?
Basit Fellow

@SimpleFellow, diğer yorumlarda belirtildiği gibi , Görünümün artık Etkinliğe doğrudan erişimi olmaması için getContextmuhtemelen bir geri dönecektir ContextThemeWrapper. Bunun yerine, üst Etkinliği bulana veya bu cevapta verdiğim yöntemi kullanana kadar üst bağlamlarda özyinelemeli olarak arama yapmanız gerekir.
Sebas LG

-1

Ana etkinliği almak için Görünüm için Kotlin uzantı özelliği:

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
    }
}

İki yerini alabilecek ifolan whenve isInstance()birlikte !is ContextWrapperyais Activity
David Miguel

@ Gomino'ya göre, kök bağlamda bir null baseContext olacaktır. Yani uygulamanız bu durumda bir ClassCastException oluşturabilir
David Miguel

Bu eski bir çözüm. @Vlad tarafından daha iyi bir çözüm
Fedir Tsapana

-1

@Override public boolean shouldOverrideUrlLoading (WebView görünümü, WebResourceRequest isteği) {if (request.getUrl (). GetHost (). StartsWith ("pay.google.com")) {Niyet amacı = yeni Amaç (Intent.ACTION_VIEW, request.getUrl ()); view.getContext () startActivity (niyet.); geri dönüş; } ... ...}


1
Merhaba, Stack Overflow'a hoş geldiniz. lütfen cevabınızı kod örneğinden daha fazla açıklayınız; örneğin diğer cevaplara bakalım.
Itamar Mushkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.