启动新活动后,OnTouchListener停止工作

时间:2017-02-24 09:34:31

标签: android ontouchlistener

我在Android中制作一款简单的游戏。基本上,我希望它以这种方式运行:当应用程序启动时,将出现一个播放屏幕,当检测到玩家与障碍物之间发生碰撞时,游戏将停止并出现AlertDialog。然后播放器点击按钮"重播"然后会再次出现一个播放屏幕。玩家跳跃需要一个OnTouch方法。 一切似乎工作得很好,除了一件事:OnTouch方法在应用程序启动时运行良好,但在我点击"重播"按钮。问题是出现了一个新的播放屏幕,一切都像我编程一样移动,只有OnTouch方法不起作用。 这是我的MainActivity类和GamePanel类的代码:

MainActivity.class:

public class MainActivity extends AppCompatActivity implements View.OnTouchListener {

    GamePanel gp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getSupportActionBar().hide();
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        gp = new GamePanel(this);
        gp.setOnTouchListener(this);
        setContentView(gp);
        gp.start();
    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {;
        gp.pl.setUp(true);
        gp.pl.setClickup(true);

        return true;
    }


}

GamePanel.java

public class GamePanel extends SurfaceView implements Runnable{
    Thread t;
    SurfaceHolder s;
    Paint p;
    Player pl;
    ArrayList<Tube>tubes;
    MainActivity activity = new MainActivity();
    Context c;

    public GamePanel(Context context){

        super(context);
        s = getHolder();
        pl = new Player();
        p = new Paint();
        tubes = new ArrayList<>();
        Tube newTube = new Tube(300, 600,300);
        tubes.add(newTube);
        addTube();
        c = context;

    }

    public void addTube(){
        while(tubes.size()<=4){
            Tube LastTube = tubes.get(tubes.size()-1);
            Random r = new Random();
            float yBelow = r.nextInt(450)+300;
            float Gap = r.nextInt(300)+150;
            Tube newTube;
            if(yBelow<Gap+20){
                yBelow = yBelow + (Gap - yBelow) + 150;
                newTube = new Tube(LastTube.getxAbove()+200, yBelow, Gap);
            }
            else {
                newTube = new Tube(LastTube.getxAbove()+200, yBelow, Gap);
            }
            tubes.add(newTube);

        }
    }

    @Override
    public void run() {
        while (true){
            if(!s.getSurface().isValid()){
                continue;
            }
            Canvas c = s.lockCanvas();
            pl.move();
            for(Tube t: tubes){
                t.move();
                t.replace();
            }
            c.drawARGB(255,199,222,100);
            p.setColor(Color.YELLOW);
            c.drawCircle(pl.getX(),pl.getY(),20,p);
            for(Tube t: tubes){
                c.drawRect(t.getxAbove(),t.getyAbove(),t.getxAbove()+Tube.getWidth(),t.getyBelow()-t.getGap(),p);
                c.drawRect(t.getxBelow(),t.getyBelow(),t.getxBelow()+Tube.getWidth(),c.getHeight(),p);
            }
            for(Tube t: tubes){
                if(t.checkCollision(pl,c)){
                    restart();
                }
            }
            getHolder().unlockCanvasAndPost(c);
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    public void restart(){
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        AlertDialog.Builder box = new AlertDialog.Builder(c);
                        box.setMessage("You Lost");
                        box.setCancelable(true);
                        box.setPositiveButton("Replay", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent i = new Intent(c,MainActivity.class);
                                c.startActivity(i);
                            }
                        });
                        AlertDialog dialog = box.create();
                        dialog.show();
                    }
                });

        try {
           t.join();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }

    public void start(){

        t = new Thread(this);
        t.start();
    }

}

请帮我修理一下。 Ps:我刚刚发现,在我重新开始游戏后,不仅onTouchListener停止工作,而且当我输了时,AlertDialog也会停止出现。后来出现了一个对话框,告诉我&#34;测试没有响应&#34;,尽管两个&#34;播放器&#34;对象和&#34;管&#34;物体仍然按照程序移动。

2 个答案:

答案 0 :(得分:1)

我认为您正在使用disabled =true

根据文件:

  

系统在新任务的根目录下创建活动并将意图路由到该任务。但是,如果活动的实例已经存在,系统会通过调用onNewIntent()方法将意图路由到现有实例,而不是创建新实例。

所以你有两个选择:

  1. 创建一个新方法并在新方法中移动需要再次初始化的函数,并在onCreate()和onNewIntent()中调用该方法。
  2. 在意图中,使用意图标志(i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);)
  3. 我希望它有所帮助。

答案 1 :(得分:0)

尝试在onResume方法中设置onTouchListener,而不是在onCreate中,因为在销毁Dialog并且控件返回到Activity后调用onResume。