【问题标题】:non-static method my_method(Context) cannot be referenced from a static context [duplicate]无法从静态上下文中引用非静态方法 my_method(Context) [重复]
【发布时间】:2021-03-02 04:14:15
【问题描述】:

我正在尝试从另一个班级致电MainActivity.my_method(),但我得到了:

无法从静态上下文引用非静态方法 my_method(Context)。

MainActivity.java

public class MainActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        my_method(); //WORKS WELL
    }

    public void my_method(Context context) {
        context.startActivity( new Intent( Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse( "package:" + context.getPackageName() ) ) );
    }
}

My_view.java

class My_view extends SurfaceView implements SurfaceHolder.Callback {

    class My_viewThread extends Thread implements SensorEventListener, OnTouchListener{
       …
       private Context mContext;
       …
       public void my_calling_method() { 
           MainActivity.my_method(mContext);
       }
       .... 
                    

任何帮助将不胜感激。

【问题讨论】:

  • 你做错了,不要创建 Activity 的新实例,因为 Activity 本身需要由框架创建和处理。在您的情况下,调用以获取包名称会导致 null 异常,因为没有上下文信息。看看这个问题,它将帮助您了解发生了什么:stackoverflow.com/questions/44582309/…

标签: java android nullpointerexception


【解决方案1】:

您可以将上下文传递给 My_view 类,如下所示:

public class MyView {
    Context mContext;
    MyView(Context context){
        mContext = context;
    }
    public void my_calling_method() {
        try
        {
            SqliteTestActivity obj = new SqliteTestActivity ();
            obj.my_method(mContext); 
        }
        catch (Exception e)
        {
            Log.d("tis==>>",""+e.getLocalizedMessage());
        }
    }
}

然后,在 MainActivity 中更改方法签名,如下所示:

public void my_method(Context context) {
    context.startActivity( new Intent( Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse( "package:" + context.getPackageName() ) ) );
}

【讨论】:

  • 你为什么还要自己创建一个活动的实例?这也是不正确的
  • 我只是添加上下文参数来克服空指针异常。理想情况下,不建议像传统的对象创建方式一样创建Activity类的对象。
【解决方案2】:

您永远不应该自己创建活动的实例,这是 Android 必须为您处理的事情。

不要这样做:

 MainActivity obj = new MainActivity ();

考虑到这就是你所说的:

  class My_view extends SurfaceView implements SurfaceHolder.Callback {

  class My_viewThread extends Thread implements SensorEventListener, OnTouchListener{
   …
   private Context mContext; // <-- you have context here, so why not just use it ?
   … 
   public void my_calling_method() { 
        context.startActivity( new Intent( Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse( "package:" + context.getPackageName() ) ) );
   }
   .... 

【讨论】:

  • 你需要创建一个My_view的实例然后调用my_calling_method,不能随便用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2023-03-22
相关资源
最近更新 更多