java 怀疑 Android 中的 KeyEvent.KEYCODE_BACK

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6958548/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 18:01:20  来源:igfitidea点击:

Doubt with KeyEvent.KEYCODE_BACK in Android

javaandroidkeyeventkeycodeonkeyup

提问by adam

I have 3 activities. 1st activity has a 'go right' image button. (to move to 2nd activity) 2nd activity has both 'go right' and 'go left' image buttons. (to go back to 1st activity or move to 3rd activity). 3rd activity has a 'go left' button to move to 2nd activity. And I have created events for back key press.

我有3个活动。第一个活动有一个“向右”图像按钮。(移动到第二个活动)第二个活动同时具有“向右走”和“向左走”图像按钮。(返回第一项活动或移至第三项活动)。第三个活动有一个“向左”按钮移动到第二个活动。我已经为后退键创建了事件。

Problem is, You navigate from 1st to 3rd, come back and then navigate to 3rd activity. 1st activity---clicking go right----> 2nd activity---clicking go right-----> 3rd activity---clicking go left----> 2nd activity----clicking go left----> 1st activity----clicking go right----> 2nd activity---clicking go right-----> 3rd activity.

问题是,您从第 1 个导航到第 3 个活动,然后返回然后导航到第 3 个活动。第一个活动---点击向右转----> 第二个活动---点击向右转-----> 第三个活动---点击向左转----> 第二个活动----点击向左转- --->第一个活动----点击向右转---->第二个活动---点击向右转----->第三个活动。

Now if I press back key on the 3rd activity, it moves to 2nd. and on pressing back key here, it moves to 1st. But here if I press back key, it again goes to 1st activity. Only the 2nd back key press on 1st activity exits the application. An additional question is how do I make the Imagebutton visible only If I press there?

现在,如果我在第 3 个活动上按返回键,它会移动到第 2 个。并在此处按下后退键,它会移至第 1 位。但是在这里,如果我按返回键,它会再次进入第一个活动。只有在第一个活动上按第二个返回键才能退出应用程序。另一个问题是如何使图像按钮仅在我按下时可见?

Do I make any sense?

我说的有道理吗?

FirstActivity.java

第一活动.java

package com.stylingandroid.Animation;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class FirstActivity extends Activity
{
    @Override
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.first );
        ((ImageButton)findViewById( R.id.NextButton )).setOnClickListener( new OnClickListener()
        {
            @Override
            public void onClick( View v )
            {
                startActivity( new Intent( FirstActivity.this, SecondActivity.class ) );
                overridePendingTransition( R.anim.slide_in_left, R.anim.slide_out_left );
            }
        });
    }
    @Override
    public boolean onKeyUp( int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            finish();
            return true;
        }
        return super.onKeyUp( keyCode, event );
    }

    public boolean onCreateOptionsMenu(Menu menu) {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.options_menu, menu);
          return true;
        }

    public boolean onOptionsItemSelected(MenuItem item) 
    {
          switch (item.getItemId()) 
          {
          case R.id.next:
              startActivity( new Intent( FirstActivity.this, SecondActivity.class ) );
              overridePendingTransition( R.anim.slide_in_left, R.anim.slide_out_left );
              return true;

          case R.id.exit:
                finish();

          default:
                return super.onOptionsItemSelected(item);
          }
    }

}

SecondActivity.java

第二个Activity.java

package com.stylingandroid.Animation;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

public class SecondActivity extends Activity
{
    private ImageButton nextbutton;
    private ImageButton backbutton;
    @Override
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.second );
        nextbutton = (ImageButton) findViewById(R.id.NextButton);
        backbutton = (ImageButton) findViewById(R.id.BackButton);
        nextbutton.setOnClickListener( new OnClickListener()
        {
            @Override
            public void onClick( View v )
            {
                startActivity( new Intent( SecondActivity.this, ThirdActivity.class ) );
                overridePendingTransition( R.anim.slide_in_left, R.anim.slide_out_left );
            }
        });
        backbutton.setOnClickListener( new OnClickListener()
        {
            @Override
            public void onClick( View v )
            {
                finish();
                startActivity( new Intent( SecondActivity.this, FirstActivity.class ) );
                overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_right );
            }
        });
    }

    @Override
    public boolean onKeyUp( int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            finish();
            overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_right );
            return true;
        }
        return super.onKeyUp( keyCode, event );
    }
}

ThirdActivity.java

第三个Activity.java

package com.stylingandroid.Animation;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;

public class ThirdActivity extends Activity
{
    @Override
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.third );
        ((ImageButton)findViewById( R.id.BackButton )).setOnClickListener( new OnClickListener()
        {
            @Override
            public void onClick( View v )
            {
                goBack();
            }
        });
    }

    private void goBack()
    {
        finish();
        overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_right );
    }

    @Override
    public boolean onKeyUp( int keyCode, KeyEvent event )
    {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            goBack();
            return true;
        }
        return super.onKeyUp( keyCode, event );
    }
}

回答by Vikram Bodicherla

There's a bug here:

这里有一个错误:

    backbutton.setOnClickListener( new OnClickListener()
    {
        @Override
        public void onClick( View v )
        {
            finish();
            startActivity( new Intent( SecondActivity.this, FirstActivity.class ) );
            overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_right );
        }
    });

You are finish()ing and startActivity()ing FirstActivity as a result of which it is sitting on the Activity stack twice.

您正在finish()ing 和startActivity()ing FirstActivity 因此它坐在 Activity 堆栈上两次。

On a side note, what are you trying to achieve here?

附带说明一下,您在这里想达到什么目的?

@Override
public boolean onKeyUp( int keyCode, KeyEvent event )
{
    if( keyCode == KeyEvent.KEYCODE_BACK )
    {
        goBack();
        return true;
    }
    return super.onKeyUp( keyCode, event );
}

The system attaches the back button to finish(). You don't need to handle it at the onKey level.

系统将后退按钮附加到finish()。您不需要在 onKey 级别处理它。