Android 从SurfaceView导航到代码中的其他视图

Android 从SurfaceView导航到代码中的其他视图,android,Android,我有过iOS开发经验,但对Android开发还不熟悉,我在这里问了一些新手问题 我正在制作一个应用程序,它可以做很多png和动画的自定义绘图,并且根本没有标准的UI元素,我选择了SurfaceView。我也会处理我的SurfaceView代码中涉及的所有检测 但我究竟如何在SurfaceView代码中处理视图之间的导航?例如,如何导航到名为QuizaActivity的活动?在“正常”视图/活动中,我是这样做的: Intent intent = new Intent(getBaseContext(

我有过iOS开发经验,但对Android开发还不熟悉,我在这里问了一些新手问题

我正在制作一个应用程序,它可以做很多png和动画的自定义绘图,并且根本没有标准的UI元素,我选择了SurfaceView。我也会处理我的SurfaceView代码中涉及的所有检测

但我究竟如何在SurfaceView代码中处理视图之间的导航?例如,如何导航到名为QuizaActivity的活动?在“正常”视图/活动中,我是这样做的:

Intent intent = new Intent(getBaseContext(), QuizActivity.class);
startActivity(intent);
但我无法从SurfaceView中访问getBaseContext和startActivity,即使这样做,是否会导致同时加载多个视图

一句话:如何在SurfaceView中的代码中手动实现此导航

多谢各位

瑟伦

从您的表面视图只需呼叫:

    Intent intent = new Intent(getContext(), QuizActivity.class);
    getContext().startActivity(intent)
每个视图都有一个对它们正在运行的上下文的引用,并且上下文总是可以启动新的活动、服务、获取资源等

编辑

在您的表面视图中,包括以下内容:

    private SurfaceCallbacks listener;

    public interface SurfaceCallbacks{
       public void onTouch(/* any data you want to pass to the activity*/);
    }

    public void registerSurfaceCallbacksListener(SurfaceCallbacks l){
       listener = l;
    }

    // and then whenever the surface being touched and you want to call something outside of the surface you do:

    if(listener!=null)
       listener.onTouch(/* pass the parameters you declared on the interface */);
在保持表面的活动上,你可以这样做:

    public ActivityThatHoldsSurface extends Activity implements SurfaceCallbacks{

       // that comes form the surface
       @Override
       onTouch(/* your parameters */){
          // do the navigation stuff
       }

       // and immediately after you inflate or instantiate your surface you do:
       mySurface.registerSurfaceCallbacksListener(ActivityThatHoldsSurface.this);

    }

这有意义吗?

然后我得到了这个错误:“E/StrictMode(1502):class com.some.class;instances=2;limit=1”,这是因为我试图“返回”到我从中导航到持有SurfaceView的活动的活动吗?我以前见过这个错误,关于这些活动是如何加载和发布的,似乎有一些东西需要我去了解,这里有什么指针吗?我从来没有看到过这个消息,但可能这就是原因。但你似乎把活动和视图的概念混为一谈了。即使您的视图是整个屏幕,它仍然在活动中。我认为,在这一点上,你们最好后退一步。创建一个接口,使持有视图的活动实现该接口,并在视图上创建一个公共void setTouchCallbackListener(TouchInterface l){},以便该活动注册自身以接收这些回调。如果你不知道这是什么意思,让我知道,我会发布一些代码。Busius,是的,请用一个例子更新你的答案如果你有时间,我不确定我知道你在这里的意思。