代码之家  ›  专栏  ›  技术社区  ›  Achmad Naufal Syafiq

在不同的类中调用方法时,如何获取上下文?

  •  7
  • Achmad Naufal Syafiq  · 技术社区  · 7 年前

    Context 为了执行多项任务。

    public void openDatePicker() { Context c; }
    

    我想知道,如何定义方法调用方的上下文,这样我就不必每次调用该方法时都将其作为参数插入。

    4 回复  |  直到 5 年前
        1
  •  18
  •   Androwed    7 年前

    让我们对 上下文 .

    允许访问特定于应用程序的资源和 课程 活动 , 接收意图

    A. 上下文 代表您的环境。它表示您在系统中所处的状态。

    安卓 应用程序已 . 上下文 类似于应用程序当前运行环境的句柄。这个 活动 对象

    那么,如何访问 在您的应用程序中?

    • 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);
    }
    
    • :返回一个 来自另一个 上下文 在内部 应用 ContextWrapper .

    ContextWrapper是,“代理实现 上下文 上下文 .“(根据javadocs)。。

    上下文 对象内部 这没有扩展 ? 因此,可以通过以下方式实现:

    • 上下文 作为其他对象 无法访问任何 上下文 可以传递给这样的 建造师

    例子:

    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”。这是我最大的努力来帮助你。

        2
  •  2
  •   V-rund Puro-hit    7 年前

    第一

    Functions 并在其中公开静态方法。

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

    你想叫什么就叫什么

    Function.openDatePicker(MainActivity.this);
    

    第二

    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(); 
    

        3
  •  1
  •   Arun Shankar    7 年前

    您可以从众多依赖项注入库中选择一个,不仅注入上下文,还可以注入特定文件中的任何依赖项。

    你可以看看 Dagger2

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

        4
  •  1
  •   UmarZaii Abhishek Tandon    7 年前

    您可以在构造函数中定义它一次,这样每次您想要使用该方法时,就不必在参数中定义它。试试这个。

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

    基本上,诀窍是只在构造函数的参数中传递上下文 一次 您可以重复使用openDatePicker方法,而无需在参数内传递任何上下文。