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 アクティビティでボタンを 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 イベントはまだ発生していません。

4

2 に答える 2

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 に答える
0

そのため、方法はわかりませんが、理由はわかりませんが、onTouch() で false を返した後、OnItemClick が発生しました。以前はすでにそれを行っていましたが、どういうわけか機能していませんでした...

于 2013-07-09T07:49:00.403 に答える