Android 'Bağlam' almak için statik bir yol?


970

Geçerli Contextörneği statik bir yöntemin içine almanın bir yolu var mı ?

Ben her zaman değiştiğinde 'Bağlam' örneği kaydetmek nefret çünkü bu şekilde arıyorum.


57
Bağlamı kaydetmemek, sadece elverişsiz olduğu için değil, aynı zamanda büyük bellek sızıntılarına neden olabileceği için iyi bir fikirdir!
Vikram Bodicherla

12
@VikramBodicherla Evet, ancak aşağıdaki yanıtlar uygulama bağlamından bahsettiğimizi varsayar. Bu nedenle, bellek sızıntıları bir sorun oluşturmaz, ancak kullanıcı bu çözümleri yalnızca doğru bağlamın kullanıldığı yerlerde kullanmalıdır.
Tom

Statik bir alma yöntemi kullanmanız Contextgerekiyorsa, kodu tasarlamanın daha iyi bir yolu olabilir.
Anonsage

3
Android dokümanları, bağlamı tekil kullanıcılara aktarmanızı önerir. developer.android.com/reference/android/app/Application.html
Marco Luglio

Statik bağlam üzerinde getInstance () ile iletilen tekil sayfaları ve bağlamı tercih etmek için lütfen bir göz atın, burada çalışma koduyla desteklenen gerekçemi açıklamaya çalıştım: stackoverflow.com/a/38967293/4469112
Alessio

Yanıtlar:


1302

Bunu yap:

Android Manifest dosyasında aşağıdakileri bildirin.

<application android:name="com.xyz.MyApplication">

</application>

Sonra sınıfı yazın:

public class MyApplication extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApplication.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplication.context;
    }
}

Şimdi her yerde MyApplication.getAppContext()uygulama içeriğinizi statik olarak almak için arayın .


81
Bu yöntemin bir dezavantajı var mı? Bu hile gibi görünüyor. (Hack?)
jjnguy

203
Dezavantajı, bazı statik başlatma kodu Context nesnenizi getirmeye çalışmadan önce statik olmayan onCreate () yönteminin çağrılmasının garantisi olmamasıdır. Bu, arama kodunuzun bu sorunun tüm noktasını yenen null değerlerle başa çıkmaya hazır olması gerektiği anlamına gelir.
Melinda Green

8
Ayrıca belki .. bu static contextdeğişkeni şöyle bildirmeliyiz volatile?
Vladimir Sorokin

14
@Tom Statik bir veri üyesinin başlangıçta statik olması durumu değildir. Verilen kodda, statik üye onCreate () öğesinde statik olmayan bir şekilde başlatılıyor. Statik olarak başlatılmış veriler bile bu durumda yeterince iyi değildir, çünkü belirli bir sınıfın statik başlatmasının, başka bir sınıfın statik başlatılması sırasında erişilmeden önce gerçekleşmesini garanti etmez.
Melinda Green

10
@MelindaGreen Uygulama belgelerine göre, herhangi bir etkinlik, hizmet veya alıcı (içerik sağlayıcılar hariç) oluşturulmadan önce onCreate () çağrılır. Bir içerik sağlayıcısından getAppContext () öğesine erişmeye çalışmadığınız sürece bu çözüm güvenli olmaz mı?
Magnus W

86

Uygulama bağlamını elde etmek için uygun bir yöntem isteyen uygulamaların çoğu, kendi sınıflarını genişletir android.app.Application.

KILAVUZ

İlk önce projenizde aşağıdaki gibi bir sınıf oluşturarak bunu yapabilirsiniz:

import android.app.Application;
import android.content.Context;

public class App extends Application {

    private static Application sApplication;

    public static Application getApplication() {
        return sApplication;
    }

    public static Context getContext() {
        return getApplication().getApplicationContext();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sApplication = this;
    }
}

Ardından, AndroidManifest'inizde AndroidManifest.xml etiketinde sınıfınızın adını belirtmelisiniz:

<application 
    ...
    android:name="com.example.App" >
    ...
</application>

Daha sonra, aşağıdakileri kullanarak uygulama içeriğini herhangi bir statik yöntemle alabilirsiniz:

public static void someMethod() {
    Context context = App.getContext();
}

UYARI

Projenize yukarıdaki gibi bir şey eklemeden önce belgelerin ne dediğini göz önünde bulundurmalısınız:

Normalde Uygulamayı alt sınıfa ayırmaya gerek yoktur. Çoğu durumda, statik tek tonlar aynı işlevselliği daha modüler bir şekilde sağlayabilir. Singletonunuzun genel bir bağlama ihtiyacı varsa (örneğin yayın alıcılarını kaydetmek için), onu alma işlevine, singleton'u ilk oluştururken dahili olarak Context.getApplicationContext () kullanan bir Bağlam verilebilir.


YANSIMASI

Yansımayı kullanarak uygulama bağlamını almanın başka bir yolu da vardır. Yansıtma Android'de sık sık aşağıya bakar ve kişisel olarak bunun üretimde kullanılmaması gerektiğini düşünüyorum.

Uygulama içeriğini almak için API 1'den beri mevcut olan gizli bir sınıfta ( ActivityThread ) bir yöntem çağırmalıyız :

public static Application getApplicationUsingReflection() throws Exception {
    return (Application) Class.forName("android.app.ActivityThread")
            .getMethod("currentApplication").invoke(null, (Object[]) null);
}

Uygulama içeriğini statik bir şekilde elde etmenin bir yolunu sağlayan bir tane daha gizli sınıf ( AppGlobals ) vardır. Bağlamı kullanarak alır, ActivityThreadbu nedenle aşağıdaki yöntem ve yukarıda yayınlanan yöntem arasında hiçbir fark yoktur:

public static Application getApplicationUsingReflection() throws Exception {
    return (Application) Class.forName("android.app.AppGlobals")
            .getMethod("getInitialApplication").invoke(null, (Object[]) null);
} 

Mutlu kodlama!


56

Uygulama Bağlamını almaktan bahsettiğimizi varsayarak, @Rohit Ghatol Genişletme Uygulaması'nın önerdiği şekilde uyguladım. O zaman olanlar, bu şekilde alınan bağlamın her zaman sıfır olmayacağının garantisi yoktur. İhtiyacınız olan zamanda, genellikle bir yardımcıyı başlatmak veya bir kaynak almak istediğinizde, zaman içinde geciktiremeyeceğiniz için; null durumunun ele alınması size yardımcı olmaz. Dokümanlarda belirtildiği gibi temelde Android mimarisine karşı savaştığımı anladım

Not: Normalde Uygulamayı alt sınıfa ayırmaya gerek yoktur. Çoğu durumda, statik tek tonlar aynı işlevselliği daha modüler bir şekilde sağlayabilir. Singleton'unuzun genel bir bağlama ihtiyacı varsa (örneğin yayın alıcılarını kaydetmek için), singletonunuzun getInstance () yöntemini çağırırken Context.getApplicationContext () öğesini Context bağımsız değişkeni olarak ekleyin.

ve Dianne Hackborn tarafından açıklandı

Uygulamanın türetebileceğiniz bir şey olarak var olmasının tek nedeni, 1.0 öncesi geliştirme sırasında uygulama geliştiricilerimizden birinin sürekli olarak türetebildikleri üst düzey bir uygulama nesnesine ihtiyaç duyma konusunda beni sıkmasıydı. "onlara uygulama modeli, ve sonunda teslim oldum. Sonsuza dek bu konuda vermek pişman olacak. :)

Ayrıca bu sorunun çözümünü öneriyor:

İstediğiniz şey, uygulamanızın farklı bölümlerinde paylaşılabilecek bir küresel durumsa, tek birton kullanın. [...] Ve bu daha doğal olarak bu şeyleri nasıl yönetmeniz gerektiğine yol açar - talep üzerine onları başlatır.

yani yaptığım şey Uygulama'yı genişletmekten kurtulmak ve bağlamı doğrudan singleton yardımcısının getInstance () öğesine aktarmak ve özel kurucudaki uygulama bağlamına bir referans kaydetmektir:

private static MyHelper instance;
private final Context mContext;    

private MyHelper(@NonNull Context context) {
    mContext = context.getApplicationContext();
}

public static MyHelper getInstance(@NonNull Context context) {
    synchronized(MyHelper.class) {
        if (instance == null) {
            instance = new MyHelper(context);
        }
        return instance;
    }
}

arayan kişi yerel bir bağlamı yardımcıya iletir:

Helper.getInstance(myCtx).doSomething();

Bu nedenle, bu soruyu doğru bir şekilde cevaplamak için: Uygulama Bağlamına statik olarak erişmenin yolları vardır, ancak hepsinin cesareti kırılmalı ve yerel bağlamı singleton'un getInstance () öğesine geçirmeyi tercih etmelisiniz.


İlgilenen herkes için daha ayrıntılı bir sürümü fwd blog'da okuyabilirsiniz


1
@Alessio Bu yöntem bellek sızıntısına yol
açmıyor

2
@codephillip Neden bahsettiğinizi anlamıyorum. Singleton, ana bilgisayar etkinliğine değil, iletilen etkinlikten alınan uygulama içeriğine başvurur. Bu yasal ve herhangi bir bellek sızıntısına neden olmaz. Yazdığım blogun ana noktası bu . Gerçekten haklı olduğunu düşünüyorsanız, lütfen bana bahsettiğiniz bellek sızıntısını yeniden oluşturabileceğim bir örnek kod gönderin, çünkü durum böyle değil.
Alessio

1
@KigenyiPhillip'in doğru olduğunu düşünüyorum ve bu hala bir kaynak sızıntısını temsil ediyor. İlk aramanızdan sonra referans grafiğini resmedin getInstance(ctx). İletilen bağlam aracılığıyla toplanan uygulama bağlamına başvuran özel bir tür alanı olan bir GC kök instancetürüne sahipsiniz . hiçbir zaman ikinci bir kez ayarlanmaz veya silinmez, bu nedenle GC asla başvurulan uygulama metnini yakalamaz . Herhangi bir etkinlik sızdırmazsınız, bu nedenle düşük maliyetli IMO'dur. MyHelpermContextContextgetInstance()instanceinstance
Mark McKenna

1
@MarkMcKenna "uygulama içeriğine başvuran Context türünde özel bir alana sahip" olarak belirttiğiniz gibi, mContext'in herhangi bir içeriğe değil, uygulama içeriğine bir başvuru olduğu açıktır. In getApplicationContext () docs okumak: "kimin yaşam döngüsü süreci ziyade cari bileşenin ömür boyu bağlıdır mevcut bağlamda, ayrı bir Bağlam". Bu nasıl bellek sızıntısı yaratabilir? Uygulama bağlamı yalnızca işlemden çıktığında GC'd olur.
Alessio

1
Uygulama kapsamında bir başvuru kaynak sızıntısı olarak nitelemek etmediğini kabul edersek @Alessio, o zaman statik bir referans göndererek bu kolaylaştırabilirsiniz thisiçinde Application.onCreate()daha iyi kabul cevabı yapar.
Mark McKenna

49

Hayır, sanmıyorum. Ne yazık ki, Sıkıştınız çağrı konum getApplicationContext()gelen Activityveya diğer alt sınıflarından biri Context. Ayrıca, bu soru biraz ilişkilidir.



38

İşte bir olan belgesiz bir almanın yolu Uygulama UI iş parçacığı içinde herhangi bir yerden (bir Bağlam olan). Gizli statik yönteme dayanır ActivityThread.currentApplication(). En azından Android 4.x üzerinde çalışmalıdır.

try {
    final Class<?> activityThreadClass =
            Class.forName("android.app.ActivityThread");
    final Method method = activityThreadClass.getMethod("currentApplication");
    return (Application) method.invoke(null, (Object[]) null);
} catch (final ClassNotFoundException e) {
    // handle exception
} catch (final NoSuchMethodException e) {
    // handle exception
} catch (final IllegalArgumentException e) {
    // handle exception
} catch (final IllegalAccessException e) {
    // handle exception
} catch (final InvocationTargetException e) {
    // handle exception
}

Bu yöntemin null döndürmesinin mümkün olduğunu unutmayın; örneğin, yöntemi UI iş parçacığının dışında çağırdığınızda veya uygulama iş parçacığına bağlı değilse.

Uygulama kodunu değiştirebiliyorsanız @RohitGhatol çözümünü kullanmak daha iyidir .


1
Yukarıdaki yöntemi KennyTM kullandım, ancak bazen yöntem null değerini döndürür. Buna başka bir alternatif var mı? Sanki burada bir sıfır alırsak, bağlamı başka bir yerden alabiliriz. Benim durumumda, onCreate () uygulaması çağrılmaz. Ancak yukarıdaki yöntem ondan önce çağrılır. Plzzz yardım
AndroidGuy

GC'nin etkinlikle ilgili tüm şeyleri temizlediği durumda bu her zaman işe yaramayacaktır.
AlexVPerl

32

Bağlamı ne için kullandığınıza bağlıdır. Bu yöntemin en az bir dezavantajını düşünebilirim:

Bir oluşturmaya çalışıyorsanız AlertDialogile AlertDialog.Builder, Applicationbağlam çalışmaz. Mevcut için bağlama ihtiyacınız olduğunu düşünüyorum Activity...


6
Doğru. Bunun için uygulama bağlamını kullanırsanız, iletişim pencerenizi ön plan etkinlikleri altında gizlenmiş olarak görebilirsiniz.
Nate

3
Her şeyden önce +1. Gelen olası hata, ComponentInfo {com.samples / com.MyActivity} etkinliği başlatılamıyor: android.view.WindowManager $ BadTokenException: Pencere eklenemiyor - simge null bir uygulama için değil
Govind

15

Kotlin yolu :

Belirgin:

<application android:name="MyApplication">

</application>

MyApplication.kt

class MyApplication: Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    companion object {
        lateinit var instance: MyApplication
            private set
    }
}

Daha sonra mülke şu adresten erişebilirsiniz: MyApplication.instance


11

RoboGuice'i kullanmaya açıksanız , içeriği istediğiniz sınıfa enjekte edebilirsiniz. RoboGuice 2.0 ile nasıl yapılacağına dair küçük bir örnek (bu yazının yazıldığı sırada beta 4)

import android.content.Context;
import android.os.Build;
import roboguice.inject.ContextSingleton;

import javax.inject.Inject;

@ContextSingleton
public class DataManager {
    @Inject
    public DataManager(Context context) {
            Properties properties = new Properties();
            properties.load(context.getResources().getAssets().open("data.properties"));
        } catch (IOException e) {
        }
    }
}

8

Bunu bir noktada kullandım:

ActivityThread at = ActivityThread.systemMain();
Context context = at.getSystemContext();

Bu, sistem hizmetleri almak için kullandığım ve çalıştığım geçerli bir bağlam.

Ancak, yalnızca çerçeve / taban değişikliklerinde kullandım ve Android uygulamalarında denemedim.

Bilmeniz gereken bir uyarı : Bu bağlamda yayın alıcılarına kaydolurken çalışmaz ve şunları elde edersiniz:

java.lang.SecurityException: Verilen arayan paketi android ProcessRecord çalışmıyor


7

Kotlin

open class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        mInstance = this
    }

    companion object {
        lateinit var mInstance: MyApp
        fun getContext(): Context? {
            return mInstance.applicationContext
        }
    }
}

ve Bağlamı beğen

MyApp.mInstance

veya

MyApp.getContext()

4

Aşağıdakileri kullanabilirsiniz:

MainActivity.this.getApplicationContext();

MainActivity.java:

...
public class MainActivity ... {
    static MainActivity ma;
...
    public void onCreate(Bundle b) {
         super...
         ma=this;
         ...

Başka herhangi bir sınıf:

public ...
    public ANY_METHOD... {
         Context c = MainActivity.ma.getApplicationContext();

3
Bu sadece bir iç sınıfın içindeyse çalışır, ki bu OP'de pek de öyle değildir.
Richard J.Ross III

3
Bu, MainActivity oluşturulduktan sonra ANY_METHOD çağrıldığı sürece çalışır, ancak etkinliklere statik referanslar tutmak neredeyse kaçınılmaz olarak bellek sızıntıları getirir (OP'nin sorusuna daha önce değinildiği gibi), bu yüzden gerçekten statik bir referans tutmanız gerekiyorsa, uygulamayı kullanın yalnızca bağlam.
handtwerk

1
İç sınıflar kötüdür. En kötü yanı, birçok insanın AsyncTasks ve bunun gibi şeyler için bunu yapmasıdır, çünkü birçok öğretici bunu böyle yapar ...
Reinherd

4

Manifest dosyasını değiştirmek istemiyorsanız, içeriği ilk etkinliğinizde statik bir değişkende manuel olarak saklayabilirsiniz:

public class App {
    private static Context context;

    public static void setContext(Context cntxt) {
        context = cntxt;
    }

    public static Context getContext() {
        return context;
    }
}

Ayrıca, etkinliğiniz (veya etkinlikleriniz) başladığında içeriği ayarlayın:

// MainActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set Context
    App.setContext(getApplicationContext());

    // Other stuff
}

Not: Diğer tüm cevaplar gibi, bu potansiyel bir bellek sızıntısıdır.


1
Bu durumda içerik uygulamaya bağlı olduğundan tam olarak ne sızacak? Uygulama ölürse, diğer her şey de öyle.
TheRealChx101

3

getAppContext()Yöntem için bir vücuda ihtiyacınız olduğunu düşünüyorum :

public static Context getAppContext()
   return MyApplication.context; 

3

Bu kaynağa göre ContextWrapper'ı genişleterek kendi Bağlamınızı elde edebilirsiniz.

public class SomeClass extends ContextWrapper {

    public SomeClass(Context base) {
      super(base);
    }

    public void someMethod() {
        // notice how I can use "this" for Context
        // this works because this class has it's own Context just like an Activity or Service
        startActivity(this, SomeRealActivity.class);

        //would require context too
        File cacheDir = getCacheDir();
    }
}

ContextWrapper için JavaDoc

Tüm çağrılarını başka bir Bağlam'a delege eden Bağlamın proxy uygulaması. Orijinal Bağlamı değiştirmeden davranışı değiştirmek için alt sınıflara ayrılabilir.


1
Bu ilginç. ContextWrapper hakkında bilgi edinmek güzel. Ancak, uygulama bağlamında bu kurucuya geçmeniz gerekiyorsa, yine de bir yerden almanız gerekir.
jk7

2

Herhangi bir nedenle, yalnızca fabrika / yardımcı sınıflar için değil, yalnızca uygulamayı / etkinliği genişletenler için değil, herhangi bir sınıfta Uygulama bağlamı istiyorsanız. Aşağıdaki singletonu uygulamanıza ekleyebilirsiniz.

public class GlobalAppContextSingleton {
    private static GlobalAppContextSingleton mInstance;
    private Context context;

    public static GlobalAppContextSingleton getInstance() {
        if (mInstance == null) mInstance = getSync();
        return mInstance;
    }

    private static synchronized GlobalAppContextSingleton getSync() {
        if (mInstance == null) mInstance = 
                new GlobalAppContextSingleton();
        return mInstance;
    }

    public void initialize(Context context) {
        this.context = context;
    }

    public Context getApplicationContext() {
        return context;
    }
}

ardından uygulama sınıfınızın onCreate öğesinde

GlobalAppContextSingleton.getInstance().initialize(this);

arayarak her yerde kullanın

GlobalAppContextSingleton.getInstance().getApplicationContext()

Ancak bu yaklaşımı uygulama bağlamından başka bir şeye tavsiye etmiyorum. Bellek sızıntılarına neden olabileceğinden.


Sınıf / yöntem isimleri taşla yapılmış, uzun ve (umarım) bir Soru-Cevap için açıklayıcı tutulmuş, kendi kullanımım için kısaltmış gibi değil.
Versa

1

Bu konuda bana yardımcı olması için Singleton tasarım modelinin bir varyasyonunu kullanıyorum.

import android.app.Activity;
import android.content.Context;

public class ApplicationContextSingleton {
    private static Activity gContext;

    public static void setContext( Activity activity) {
        gContext = activity;
    }

    public static Activity getActivity() {
        return gContext;
    }

    public static Context getContext() {
        return gContext;
    }
}

Sonra diyoruz ApplicationContextSingleton.setContext( this );benim de () activity.onCreate ve ApplicationContextSingleton.setContext( null );içinde OnDestroy () ;


İhtiyacınız olan tek şey bağlamsa, activity.getApplicationContext (); Bu, sızıntılar hakkında endişelenmenize gerek kalmadan statik olarak tutulabilir.
MinceMan

2
bu bellek sızıntılarına neden olacak
BlueWizard

1

Uygulama geliştirmeyi basitleştirmeyi amaçlayan Vapor API adlı Android için jQuery'den ilham alan bir çerçeve yayınladım .

Merkezi $cephe sınıfı , arayarak alabileceğiniz WeakReferencemevcut Activitybağlama bir (Ethan Nicholas tarafından bu konuda harika Java blog yazısı bağlantısı) sağlar :

$.act()

A WeakReference, orijinal nesneyi geri almak için çöp toplama işlemini engellemeden bir referans tutar, bu nedenle bellek sızıntılarında sorun yaşamamanız gerekir.

Tabii ki dezavantajı, $.act()null dönebilecek risk çalıştırmak olduğunu . Bu senaryoya henüz rastlamadım, bu yüzden belki de söz etmeye değer minimum bir risk.

Sınıfınız VaporActivityolarak kullanmıyorsanız bağlamı manuel olarak da ayarlayabilirsiniz Activity:

$.act(Activity);

Ayrıca, Vapor API çerçevesinin çoğu, bu depolanmış içeriği doğal olarak kullanır; bu, çerçeveyi kullanmaya karar verirseniz, kendiniz saklamanız gerekmeyeceği anlamına gelebilir. Daha fazla bilgi ve örnek için siteye göz atın .

Umarım bu yardımcı olur :)


1
Görünüşe göre bu sadece indirildi .. bir açıklama güzel olurdu !?
Darius

1
Bunu küçümsemedim, ama Javascript'in eldeki soru ile ilgisi yok, sahip olabileceğiniz herhangi bir downvotes açıklayacak! Şerefe.
Ernani Joppert

Akıcı bir arayüz gibi jQuery'nin bazı yönlerinden ve soyutlamalarından esinlendiğinde bu oldukça saçma olurdu ... bunlar temel dilin agnostik ilkeleridir!
Darius

1
Yani aşağı indiriyorsunuz çünkü aynı platformda olmayan bir çerçevenin API semantiğinden esinlenildi mi ?! Sanırım sizler platform-agnostik ilkeleri uygulama noktasını kaçırdınız .....................................
Darius

3
bu cevap JavaScript ile tamamen alakasız. İndirmeden önce yanıtı okuyun: /
BlueWizard

1

Rohit'in cevabı doğru görünüyor. Ancak, AndroidStudio'nun "Anında Çalıştır" öğesinin static Context, bildiğim kadarıyla kodunuzda nitelik bulunmamasına bağlı olduğunu unutmayın.


1
Haklısın. Ve ayrıca bellek sızıntılarına neden olacak!
user1506104

1

Kotlin'de, Bağlam / Uygulama Bağlamını tamamlayıcı nesneye koymak hala uyarı üretir Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)

veya böyle bir şey kullanırsanız:

    companion object {
        lateinit var instance: MyApp
    }

Bellek sızıntısını keşfetmemek için tiftiği kandırmak, Uygulama örneği hala bellek sızıntısı üretebilir, çünkü Application sınıfı ve onun torunu bir Bağlamdır.

Alternatif olarak, uygulama içeriğinizi almanıza yardımcı olması için işlevsel arayüzü veya İşlevsel özellikleri kullanabilirsiniz.

Yalnızca bir nesne sınıfı oluşturun:

object CoreHelper {
    lateinit var contextGetter: () -> Context
}

veya nullable tipini kullanarak daha güvenli kullanabilirsiniz:

object CoreHelper {
    var contextGetter: (() -> Context)? = null
}

ve App sınıfınıza şu satırı ekleyin:


class MyApp: Application() {

    override fun onCreate() {
        super.onCreate()
        CoreHelper.contextGetter = {
            this
        }
    }
}

ve bildiriminizde uygulama adını . MyApp


    <application
            android:name=".MyApp"

Bağlamı almak istediğinizde sadece şunu arayın:

CoreHelper.contextGetter()

// or if you use the nullable version
CoreHelper.contextGetter?.invoke()

Umarım yardımcı olur.


Bu çekirdekçinin nesne sınıfı başlatılacak ve daha sonraki aşamalardaki etkinliklerle kullanılabilir mi? Üzgünüm kotlin için yeniyim
Dr. aNdRO

Evet kesinlikle.
Hayi Nukman

-1

Böyle bir şey dene

import androidx.appcompat.app.AppCompatActivity;  
import android.content.Context; 
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    private static Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();
    }

    public static void getContext(View view){
        Toast.makeText(context, "Got my context!",
                    Toast.LENGTH_LONG).show();    
    }
}
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.