2013-07-03 3 views
1

내가안드로이드 같은 활동 마무리()

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

그런 활동 A.에서 결과를 활동 B를 시작하고 활동 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로 돌아가는 방법은 무엇입니까? 이것은 활동 백 스택과 관련이 있다고 생각하지만 변경 방법을 모르겠습니다.

수정

문제를 현지화했습니다. 그것은 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

CharacterChooseActivity의 onCreate에 로그를 기록한 다음 표시됩니다. 세 번 클릭 만하면 A_ 활동이 재개됩니다. 질문은 : 활동 B를 처음 시작할 때 3 개의 로그가 모두 표시되는지 아니면 활동 B를 종료 할 때 표시되는지 여부입니다. 이것이 첫 번째 해결책이라면,'if (model.isPositionClickable (pos)) '로 이어지는 코드를 게시하는 것을 고려해보십시오. – WhiskThimble

+0

글쎄, CharacterChoosActivity의 onCreate 메소드에서 중단 점을 살펴 보았습니다. 그리고 실제로 2 번 그곳에서 멈 춥니 다. PS 또한 oncreate가 두 번 호출되었다는 것을 보여주는 로그가 있습니다. – user1685095

+0

onClickListener와 onTouch를 같은 뷰에 적용합니까? 또는 onTouch를 적용한 뷰의 자식에게 onClick을 적용 하시겠습니까? – WhiskThimble

답변

0

그래서, 나는 지금 어떻게되지는 모르겠지만, onTouch()에서 false를 반환 한 후 OnItemClick이 해고되었습니다. 이전에 이미 그 작업을 수행했는데 어떻게 든 작동하지 않았습니다 ...

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가 필요합니다.

+0

아니, 작동하지 않습니다. – user1685095

+0

죄송합니다! 나는 super.onTouchEvent (..)를 반환했습니다. 편집 된 코드를 확인하십시오. – Chandan

+0

onTouch (View, MotionEvent) 메서드는 Activity 유형에 대해 정의되지 않았습니다. – user1685095

관련 문제