如何获得上下文,当你调用一个不同的类中的方法?

问题描述 投票:3回答:4

所以基本上,我有一个需要Context为了执行多个任务的方法。

public void openDatePicker() { Context c; }

我想知道,如何定义方法调用者的背景,所以我不必每次我调用该方法时将其插入作为参数。

android android-context
4个回答
12
投票

让我们语境的一个基本的了解。

上下文允许访问特定于应用程序的资源和类,以及呼吁应用层的操作,如发射活动,广播和接收意图等

上下文语境代表您的环境。它代表着周围,你是在您的系统状态。

一个Android应用程序有活动。环境就像一个句柄,您的应用程序正在运行的环境。活动对象继承Context对象。

那么,如何访问上下文在你的应用程序?

  • 的getContext():返回当前活动的活动内的上下文。你也可以用这个充气布局和菜单,注册上下文菜单,实例化部件,启动其他活动,活动中等等创造新意图

例如:View.getContext()返回语境中的视图当前运行在通常情况下,当前活动的活动。

View mView = this.getLayoutInflater().inflate(R.layout.myLayout, myViewGroup);

要么,

Intent mIntent = new Intent(this, MyActivity.class);
this.startActivity(mIntent);
  • getApplicationContext():如果你需要一个语境依赖于整个应用程序,而不仅仅是当前活动的生命周期返回整个应用程序的上下文,而不是当前活动即。此语境下被广泛使用,因为它是最安全的方法,因为这背景下存在的应用程序的生命周期。

例如:绑定的应用范围的类。

Intent mIntent = new Intent(this, MyPersistent.class);
MyServiceConnection mServiceConnection = new MyServiceConnection();
if (mServiceConnection != null) {
    getApplicationContext().bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
  • getBaseContext():返回从应用程序中的另一种情况下,你可以访问上下文。这种方法具有有限usage.The方法是相关的,当你有一个ContextWrapper。

ContextWrapper是,“语境下的代理功能的实现,只是代表其所有调用另一个上下文的。也可以子修改行为,而不改变原有的语境。” (按照Javadoc中)..

现在,一个问题可能出现!一个人怎么会访问上下文对象不扩展活动的一类里面呢?因此,它可以通过以下方式实现:

  • 通过上下文作为一个目的是其他类:对于不具有任何上述背景信息的访问的类。上下文可以通过它的构造函数传递给这样的类。

例:

public class MyActivity extends Activity {
    private Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        context = getApplicationContext();
        new Helper(context);
    }
}

public class Helper {
    Context mContext;
    Helper(Context ctx){
        this.mContext= ctx;
    }
//Now you can use this mContext anywhere in your class.
}

最后,为了获取上下文中的任何地方你的应用程序,你可以在你的应用程序定义一个新类:

public class MyContext extends Application {
    private static MyContext instance;

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

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }
}

在你的清单,你需要这个类添加到“名称”字段中的“应用程序”选项卡,如下所示:

<application
android:name="com.example.app.MyContext "
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
.......
<activity
......
</activity>

要在应用程序中,即在任何一类项目的任何地方获取上下文,你可以调用这个类的功能,就像这样:

MyContext.getContext();

这个函数会返回一个上下文,你可以用它来完成你的任务。

所以,来到你的问题。我想最后两个方法可以解决你的问题,即传递上下文对象的类和限定延伸申请一个新的类。

这是所有@Achmad Naufal Syafiq。这是为了帮助你出我最大的努力。


1
投票

您可以在许多依赖注入的图书馆之一注入不仅上下文,但是您在一个特定的文件有任何相关性。

你可以看看Dagger2例如

This将帮助您准确地创建不同的上下文


1
投票

您可以在构造函数中定义一次,所以你要使用的方法每次,你没有在参数来定义它。尝试这个。

public class CustomDatePicker {

    private Context context;

    public ClassLocationModel(Context context) {
         this.context = context;
    }

    public void openDatePicker() {
         //Use context that has been passed through constructor here
    }
}

所以,基本上,关键是要在构造函数中的参数传递上下文只有一次,你可以重复使用开放的DatePicker方法不传递任何上下文中的参数中。


1
投票

这可以通过两种方式来完成..

第一

使类说Functions,让你在它里面公共静态方法。

public class Functions{

    public static void openDatePicker(Context c){ 
        // Do your work where you can use c as Context
    }

}

并调用它不管你想要像

Function.openDatePicker(MainActivity.this);

第二

作为@UmarZaii建议您可以在构造函数中,一旦定义它。

public class CustomDatePicker {

    private Context context;

    public ClassLocationModel(Context context) {
         this.context = context;
    }

    public void openDatePicker() {
         // Do your work where you can use "context" as Context
    }
} 

和你,你必须在你的活动一次初始化这个类

CustomDatePicker customDatePicker = new CustomDatePicker(MainActivity.this);

// to use its methods
customDatePicker.openDatePicker(); 

我希望这将有助于。

© www.soinside.com 2019 - 2024. All rights reserved.