android完成后相同的活动开始()

时间:2013-07-03 08:59:20

标签: android android-activity

我从活动A的结果开始活动B.

if (model.isPositionClickable(pos)) {
        Intent intent = new Intent(this,  CharacterChooseActivity.class);
        clickedPosition = pos;
        startActivityForResult(intent, 0);
}

然后在活动B中,我正在做以下

public class CharacterChooseActivity extends Activity {

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

public void characterSelected(View v) {
    Button b = (Button) v;
    String s = (String) b.getText();
    Intent intent = new Intent();
    intent.putExtra("character", s);
    setResult(RESULT_OK, intent);
    finish();
}



}

当我第一次点击按钮时,它再次启动活动B.如果我在这个新的B活动中第二次点击该按钮,将再次启动活动B.只有在第三次点击时,它才会恢复活动A.

为什么会这样? 如何在第一次点击后返回活动A? 我认为这与活动后台堆栈有关,但我不知道如何更改它。

修改

我已将问题本地化了。它与MotionEvent监听器以及我如何处理点击有关。

    @Override
public boolean onTouch(View v, MotionEvent event) {
    final int pos = gv.getCellPosition(event.getX(), event.getY());
    int maxPosition = model.getNumberOfColumns() * model.getNumberOfRows();
    if (pos >= 0 && pos < maxPosition) {
        Mode mode = model.getMode();
        switch(mode) {
        case CHAR_SELECT_MODE : inputCharacter(pos); break;
        case WORD_SELECT_MODE : selectcharacter(event, pos); break;
        default : break;
        }
    }       
    return true;    
}

private void selectcharacter(MotionEvent event, int pos) {
    if (event.getActionMasked() != MotionEvent.ACTION_UP) {
        if(!model.isPositionEnabled(pos))
            return;
        else
            if(model.isValidPosition(pos))
                model.setSelected(pos);
    }
    else {
        model.createWord();
    }
}

public void inputCharacter(final int pos) {
    if (model.isPositionClickable(pos)) {
        Intent intent = new Intent(this,  CharacterChooseActivity.class);
        clickedPosition = pos;
        startActivityForResult(intent, 0);
    }
}

我需要能够处理不同的事件:OnItemClick和onTouch。

我可以通过向模型添加新模式来让控制器知道,它不应该处理触摸事件。

    @Override
public boolean onTouch(View v, MotionEvent event) {
    final int pos = gv.getCellPosition(event.getX(), event.getY());
    int maxPosition = model.getNumberOfColumns() * model.getNumberOfRows();
    if (pos >= 0 && pos < maxPosition) {
        Mode mode = model.getMode();
        switch(mode) {
        case CHAR_SELECT_MODE : inputCharacter(pos); break;
        case WORD_SELECT_MODE : selectCharacter(event, pos); break;
        case INPUT_BLOCKED_MODE: break;
        default : break;
        }
    }       
    return true;    
}

但是当我同时拥有onItemClick和onTouchListeners时,我无法让它工作。我试图返回false和super.OnTouchEvent(Event)。 OnItemClick事件仍未触发。

2 个答案:

答案 0 :(得分:0)

尝试,

    @Override
    public boolean onTouch(View v, MotionEvent event) {
            //[EDIT: Process only when user takes out his finger i.e on ACTION_UP
        if(event.getAction()==MotionEvent.ACTION_UP){
            //EDIT]  
            final int pos = gv.getCellPosition(event.getX(), event.getY());
            int maxPosition = model.getNumberOfColumns() * model.getNumberOfRows();
            if (pos >= 0 && pos < maxPosition) {
                Mode mode = model.getMode();
                switch(mode) {
                case CHAR_SELECT_MODE : inputCharacter(pos); break;
                case WORD_SELECT_MODE : selectcharacter(event, pos); break;
                default : break;
                }
            }       
            return true;
        }

        return super.onTouch(v,event);            
    }

代码中的错误:将针对用户的不同操作触发onTouchEvent。即ACTION_DOWN,ACTION_UP,ACTION_MOVE等等。因此,当这些动作中的任何一个触发你开始时B.我们只需要在用户取出手指时启动B.

答案 1 :(得分:0)

所以,我不知道怎么样,我现在不知道为什么,但是在我在onTouch()中返回false后,OnItemClick被触发了。 以前我已经这样做了,它不知何故不起作用......