アクティビティ 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 アクティビティでボタンを 2 回クリックすると、アクティビティ B が再び開始されます。3 回目のクリックでのみ、アクティビティ 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 イベントはまだ発生していません。