java - Android中KeyEvent.KEYCODE_BACK的疑问

标签 java android keyevent keycode onkeyup

我有 3 项 Activity 。 第一个 Activity 有一个“向右走”图像按钮。 (转到第二个 Activity ) 第二个 Activity 有“向右走”和“向左走”图像按钮。 (返回第一个 Activity 或移至第三个 Activity )。第三个 Activity 有一个“向左”按钮可以移至第二个 Activity 。 我已经创建了返回键按下事件。

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

现在,如果我在第三个 Activity 中按后退键,它就会移至第二个 Activity 。在这里按下返回键,它会移至第一。但在这里,如果我按返回键,它会再次转到第一个 Activity 。只有在第一个 Activity 中按下第二个后退键才会退出应用程序。另一个问题是如何使图像按钮仅在我按下时才可见?

我说得有道理吗?

FirstActivity.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

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

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 );
    }
}

最佳答案

这里有一个错误:

    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 );
        }
    });

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

顺便说一句,您想在这里实现什么目标?

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

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

关于java - Android中KeyEvent.KEYCODE_BACK的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6958548/

相关文章:

java - 作为电子邮件附件发送的 PDF 文件已损坏 (java)

javascript - 将js文件注入(inject)到webview中

Android - 如何基于 sim Network 每次获取用户当前位置

java - 如果用户不存在如何创建?

delphi - 如何在TFrame中实现OnKeyDown事件

c# - WPF - 在单元测试中引发 KeyEvent 触发器不起作用

Java isFile(), isDirectory() 不检查是否存在

java - TortoiseSVN 和 Subclipse 图标不随 SVN 更新?

java - 获取第三个逗号的索引

java - JTable 按键事件未触发