Возвращаясь к действиям, приложение останавливается - PullRequest
0 голосов
/ 14 октября 2011

У меня есть этот код, который проходит через шаги, полученные из веб-службы.

Я реализовал свою собственную историю, чтобы пользователь мог вернуться к выполненным шагам. Проблема в том, что один и тот же шаг можно посетить несколько раз, и это, похоже, приводит к сбою моей истории.

Он может вернуться очень хорошо, но иногда требуется несколько нажатий на кнопку «Назад», чтобы перейти к предыдущему шагу.

Вот код для моего класса, который управляет историей:

private ArrayList<String> idList;

@Override
public void onCreate( Bundle savedInstanceState )
{
    super.onCreate( savedInstanceState );
    if ( idList == null )
    {
        idList = new ArrayList<String>();
    }
}

@Override
public void finishFromChild( Activity child )
{
    LocalActivityManager manager = getLocalActivityManager();
    int index = idList.size()-1;

    if ( index < 1 )
    {
        finish();
        return;
    }

    manager.destroyActivity( idList.get( index ), true );
    idList.remove( index ); index--;
    String lastId = idList.get( index );
    Activity lastActivity = manager.getActivity( lastId );
    Intent lastIntent = lastActivity.getIntent();
    Window newWindow = manager.startActivity( lastId, lastIntent );
    setContentView( newWindow.getDecorView() );
}

public void startChildActivity( String id, Intent intent )
{
    id += System.currentTimeMillis();
    if ( "restart".equalsIgnoreCase( id ) )
    {
        idList.clear();
    }

    Window window = getLocalActivityManager().startActivity( id, intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP ) );
    if ( window != null )
    {
        idList.add( id );
        setContentView( window.getDecorView() );
    }
}

public Activity getCurrentActivity()
{
    int length = idList.size();
    if ( idList.isEmpty() ) {
        return null;
    }
    else
    {
        return getLocalActivityManager().getActivity( idList.get( length-1 ) );
    }
}

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

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

@Override
public void onBackPressed()
{
    int length = idList.size();
    if ( length > 1 )
    {
        Activity current = getLocalActivityManager().getActivity( idList.get( length-1 ) );
        current.finish();
    }
}

1 Ответ

0 голосов
/ 17 октября 2011

Обороты этого флага FLAG_ACTIVITY_CLEAR_TOP

в моем методе

public void startChildActivity( String id, Intent intent )
{
id += System.currentTimeMillis();
if ( "restart".equalsIgnoreCase( id ) )
{
    idList.clear();
}

Window window = getLocalActivityManager().startActivity( id, intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP ) );
if ( window != null )
{
    idList.add( id );
    setContentView( window.getDecorView() );
}

}

Все испортилось, теперь все работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...