1

我正在为活动 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 事件仍未触发。

4

2 回答 2

0

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

于 2013-07-09T07:49:00.403 回答
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。

于 2013-07-03T10:37:36.207 回答