我从活动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事件仍未触发。
答案 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被触发了。 以前我已经这样做了,它不知何故不起作用......