Сомневаюсь с KeyEvent.KEYCODE_BACK в Android - PullRequest
0 голосов
/ 05 августа 2011

У меня есть 3 мероприятия.В первом упражнении есть кнопка с изображением «идти направо».(чтобы перейти ко второму заданию) Во втором задании есть кнопки с изображениями «идти вправо» и «идти влево».(чтобы вернуться к 1-му занятию или перейти к 3-му занятию).В третьем упражнении есть кнопка «влево», чтобы перейти ко второму заданию.И я создал события для нажатия клавиши «назад».

Проблема в том, что вы переходите с 1-го на 3-й, возвращаетесь и затем переходите к 3-му действию.1-е действие --- нажатие перейти вправо ----> 2-е действие --- нажатие перейти вправо -----> 3-е действие --- нажатие перейти влево ----> 2-е действие ---- нажатие перейти влево----> 1-е действие ---- щелчок перейти вправо ----> 2-е действие --- нажатие перейти вправо -----> 3-е действие.

Теперь, если я нажму кнопку возврата на 3-мактивность, она переходит ко 2-му.и при нажатии клавиши назад, он перемещается на 1-й.Но здесь, если я нажимаю клавишу возврата, она снова переходит к 1-му действию.Только 2-е нажатие клавиши назад на 1-м действии выходит из приложения.Дополнительный вопрос заключается в том, как сделать так, чтобы кнопка Image отображалась только при нажатии на нее?

Имею ли я какой-либо смысл?

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

1 Ответ

2 голосов
/ 05 августа 2011

Здесь есть ошибка:

    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() используете и startActivity() используете 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.

...