在包含对象类的当前实例中调用Java方法

时间:2015-08-31 06:05:52

标签: java android class

我有一个主要类," A类":

public class MyActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mView = new AppGLSurfaceView(this); <------- I am creating 
    }

    // Log <--------------------------------------- our log function
    public void LogInfo(String message) {
        android.util.Log.i("MyLogTag", "Message:" + message);
    }
}

A类包含此类的对象:

class AppGLSurfaceView extends GLSurfaceView {
    public AppGLSurfaceView(Context context) {
        super(context);
        mContext = context;
    }

    public boolean onTouchEvent(final MotionEvent event) {
        mContext.LogInfo ("onTouchEvent"); <--------------- FAIL
        return false;
    }

    Context mContext;
}

关闭,看起来MyActivity正在将自己的引用传递给第二类,mView = new AppGLSurfaceView(this)正在传递。 &#34;这&#34;是对象引用,对吗?

我通过&#34; mContext = context;&#34;

将B类中的对象引用存储在变量中

如何调用LogInfo方法?

(我很少使用Java,所以如果它不是方法而是一个函数,请简单地正确地告诉我,我确实想知道Java术语。)

4 个答案:

答案 0 :(得分:3)

LogInfo(....)MyActivity类的一种方法,您试图调用Context对象,需要强制转换mContext才能执行此操作,例如:((MyActivity)mContext).LogInfo(....)

答案 1 :(得分:1)

由于您似乎正在将类String url="http://localhost:$port/applicant/{id}/status?blacklistingFlag&reason" map.put("id", "23") map.put("blacklistingFlag","0") map.put("reason","no reason") restTemplate.exchange(url, HttpMethod.PUT, null, null, map) ResponseEntity<ResponseWrapper<User>> entity=restTemplate.put(url,ResponseWrapper.class , map) then: entity.statusCode == HttpStatus.OK entity!=null 的实例传递给类MyActivity的构造函数,因此可以将AppGLSurfaceView的实例上的方法调用为: MyActivity

在旁注中,您应该使用camel case来处理Java中的方法(((MyActivity)mContext) .LogInfo()而不是logInfo)。此外,您不需要声明方法静态,因为您希望在包含对象类的当前实例中调用方法。

答案 2 :(得分:0)

上下文不是MainActivity的对象,要使用该函数创建其对象或在MainActivity中将该函数设置为静态

public static void LogInfo(String message) {
    android.util.Log.i("MyLogTag", "Message:" + message);
}

然后在你的A类中使用这样的

MainActivity.LogInfo ("onTouchEvent"); 

答案 3 :(得分:0)

您可以将AppGLSurfaceView的构造函数更改为

class AppGLSurfaceView extends GLSurfaceView {

    MyActivity myActivity;

    public AppGLSurfaceView(MyActivity myActivity) {
        super(myActivity);
        this.myActivity = myActivity
    }

    public boolean onTouchEvent(final MotionEvent event) {
       myActivity.LogInfo ("onTouchEvent");
       return false;
    }
}

这会引入MyActivity的依赖关系,因此您无法再使用任何AppGLSurfaceView创建Context。也许你想引入一个日志记录接口。