【问题标题】:Android 7.1.1 back button methods not being called未调用 Android 7.1.1 后退按钮方法
【发布时间】:2016-12-21 01:08:02
【问题描述】:

我正在运行 Android 7.1.1 的 Google Pixel 上进行开发。

下面是 2 个活动,PlayActivity 和 ScoreScreenActivity。流程应该看起来像 Main > Play > Game > Score > [back button] > Play > [back button] > Main。

在 ScoreScreenActivity 中按下返回按钮时,会调用 onKeyPressed() 方法。我们被重定向到 PlayActivity。到现在为止还挺好。现在我们在 PlayActivity 中,当再次按下后退按钮时,我们会错误地从名为 ScoreScreenActivity 的 Activity 重定向回 GameActivity。我们应该被发送到 MainActivity。

另外,我在 GameActivity 和 ScoreScreenActivity 中的 startActivity() 之后有 finish()。而且,当我们从 ScoreScreenActivity 转到 PlayActivity 时,会显示此错误:

W/ViewRootImpl[ScoreScreenActivity]: Cancelling event due to no window focus: KeyEvent

以下是活动代码: 非功能代码:

public class PlayActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_play);

    Button mOneMinute = (Button) findViewById(R.id.play_one_minute);
    if (mOneMinute!=null){
        mOneMinute.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(PlayActivity.this, GameActivity.class);
                startActivity(intent);
                finish();
            }
        });

    }
}
@Override
public void onBackPressed(){
    System.out.println("this isn't printed either");
    // AlertDialog happens here
}
// Copy & Pasted from another StackOverFlow (http://stackoverflow.com/questions/16646301/onbackpressed-is-not-being-called)
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    System.out.println("never gets printed");
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Log.d("back", "should go back to MainActivity");
        Intent i=new Intent(PlayActivity.this, MainActivity.class);
        startActivity(i);
        finish();
    }
    return true;
}

功能代码:

    public class ScoreScreenActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_score_screen);
        int score = 0;
        Intent intent = getIntent();
        score = intent.getIntExtra("mScore", score);
        System.out.println(score);

        TextView mTV = (TextView) findViewById(R.id.score_text);
        if (mTV != null ){
            mTV.setTextSize(20);
            mTV.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
            String str = "Well Done!\nYour Score: "+ score +"\nThere's no high score system for now,\n" +
                    "so remember this score\nif it's a new high score!";
            SpannableString ss = new SpannableString(str);
            ss.setSpan(new RelativeSizeSpan(2), 0, 25, 0);
            mTV.setText(ss);
        }
        Button mReturn = (Button) findViewById(R.id.score_return);
        if (mReturn!= null){
            mReturn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent returnIntent = new Intent(ScoreScreenActivity.this, MainActivity.class);
                    startActivity(returnIntent);
                }
            });
        }

    }

    @Override
    public void onBackPressed(){
        System.out.println("this does not get printed");
        // AlertDialog happens here
    }

    // Copy & Pasted from another StackOverFlow (http://stackoverflow.com/questions/16646301/onbackpressed-is-not-being-called)
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        System.out.println("this gets printed");
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Log.e("back",""+1);
            Intent i=new Intent(ScoreScreenActivity.this,PlayActivity.class);
            startActivity(i);
            finish();
        }
        return true;
    }
}

【问题讨论】:

  • 发布您的活动 c
  • @Charuka 我发布了我的代码示例,由于某种原因,我的代码现在可以工作了。但不知道为什么它不能更早地工作。
  • 任何不能按预期工作的东西......现在?
  • @Charuka 是的,让我更新问题。谢谢顺便说一句!
  • 尝试删除 Play 活动中的 finish() 并查看

标签: android android-activity onkeydown onbackpressed


【解决方案1】:

你可以这样处理:

适用于 API 级别 5 及更高级别(新)

@Override
public void onBackPressed() {
    // your code.
}

早于 API 5

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // your code
        return true;
    }

    return super.onKeyDown(keyCode, event); // u are missing this 
}

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多