2012-03-16 4 views
0

나는 여러 개의 버튼 인스턴스가 만들어지고 각 인스턴스마다 TouchListener가있는 루프가 있습니다. 그러나, 나는 다른 버튼을 만진 때 관리하는 방법을 알아내는 데 문제가 있습니다. 내가 성취하려고하는 것은 각각의 버튼이 텍스트 뷰를 나타내고, 버튼을 터치 할 때 버튼의 해당 인스턴스와 관련된 특정 텍스트 뷰를 arraylist에 추가하고자한다는 것입니다. 그러나 같은 버튼을 다시 터치하면 목록에서 제거하고 다시 터치하면 다시 추가하려고합니다. 오 그래 addToOrder는 현재 전역이며 true로 초기화됩니다.onTouch 메서드 - 어떤 버튼 인스턴스가 클릭되거나 눌려 졌는지 확인

생각하십니까?

EDIT **** 아래의 내 의견 단추는 이제 단추의 각 인스턴스를 쉽게 따라갈 수 있도록 작성한 Button 하위 클래스의 인스턴스입니다. 그것으로 문제가 해결되었습니다. 여기

코드입니다 :이 항목이 추가되는 유일한 방법 인 경우

button.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getActionMasked(); 
     //Log.d("Touched Add To Order Button with id of ", button.getId() + ": " + button.getText().toString()); 
     TextView relativeTitleView; 
     ViewGroup relativeGroup = (ViewGroup)v.getParent(); 
     relativeTitleView = (TextView) relativeGroup.getChildAt(0); 
     //Log.d("Add To Order Button Touched", relativeTitleView.getText().toString()); 

      /*if(action ==MotionEvent.ACTION_DOWN){       
      addToOrder = (addToOrder) ? true : false; 
      if(addToOrder) 
       dbAccess.addToOrder(relativeTitleView.getText().toString()); 
      else 
       dbAccess.removeFromOrder(relativeTitleView.getText().toString()); 
      } 
      else if(action == MotionEvent.ACTION_UP){ 
       addToOrder = !addToOrder; 

      }*/ 

      if(action == MotionEvent.ACTION_DOWN){ 
       if(button.getTouchInfo()){ 
       dbAccess.addToOrder(relativeTitleView.getText().toString()); 
       button.setTouchInfo(false); 
       } 
       else { 
       dbAccess.removeFromOrder(relativeTitleView.getText().toString()); 
       button.setTouchInfo(true); 
       } 
     } 

      return false; 
     } 
    }); 
+0

방금 ​​addToOrder를 깨달았습니다. 글로벌 이래로 버튼의 특정 인스턴스가 터치되었는지 여부를 알 수 없기 때문입니다. 내가 필요한 건 각 버튼 인스턴스에 대한 addToOrder 변수입니다 - 그러나 나는 그 무시 무시한 최종/비 최종 변수 오류를 얻으려고합니다 ... – cspam

답변

0

/dbAccess라는 제거, 당신은 단지 이미 거기에 있는지 여부에 따라 전환 할 수 있습니다.

if(dbAccess.contains(relativeTitleView.getText().toString()) 
    dbAccess.removeFromOrder(relativeTitleView.getText().toString()); 
else 
    dbAccess.addToOrder(relativeTitleView.getText().toString()); 

편집 : dbAccess에는 contains()가 있으며 여기에 어떤 유형인지 알 수 없습니다.

+0

dbAccess는 실제로 내 활동과 내 모델 (데이터베이스) 간의 조정자로 작성한 클래스입니다. 가능한 한 MVC와 함께 가려고합니다. 나는 실제로 문제를 해결했다. 개인 부울 변수를 사용하여 단추 클래스를 확장하고 부울을 가져 와서 부울 즉 setTouchInfo (부울 clicky) 및 getTouchInfo()라는 두 가지 함수를 만든 사용자 지정 단추 클래스를 만들었습니다. 클릭했는지 여부). 이전 코드를 주석 처리하고 새 코드를 게시합니다. 전에 이것에 대해 생각해 봤어야 했어. – cspam

1

View (그 중 Button이 하위 클래스 임)에 임의의 개체를 설정할 수 있습니다.이 개체는 setTag이며 두 가지 버전이 있습니다. 버튼을 터치하면

그래서, 예를 들어, 루프에서 각 Button를 만드는 데 사용 당신이 String 인스턴스 또는 myButton.setTag(Object o)

를 사용하여 ButtonInteger 인스턴스를 추가 할 수 있습니다, 그것은 같은 onTouch에 전달됩니다 View v 인수

에서 getTag()을 사용하여 태그를 가져 와서 검사하면됩니다.

+0

넵 그게 내가 방금 해결 한 아이디어 였어. 난 그저 하위 클래스 내에서 사적인 변수를 사용하여 버튼이 어떤 상태인지를 파악했다. 새로운 코드를보고 질문의 끝에 코멘트를 편집한다. – cspam

0

우선, 일반 버튼이 아닌 스위치 또는 토글 버튼을 사용합니다. 이렇게하면 버튼이 관심있는 두 상태를 추적합니다. setOnCheckedChanged 수신기는 스위치가 전환 될 때 콜백을받습니다.

두 번째로 익명 클래스를 사용하는 대신 OnCheckedChangeListener에서 파생 된 명명 된 클래스를 만듭니다.

명명 된 클래스의 생성자는 수신기의 콜백 메소드에서 사용할 수있는 멤버를 설정하여 리스너를 적절한 텍스트 뷰에 연결할 수 있습니다. 지금 버튼 아래에있는 내 코멘트를

private MyListener implements CheckedChangeListener{ 
    private TextView textView; 
    MyListener(TextView textView){ 
    this.textView = textView; 
    } 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){ 
    String text = textView.getText().toString(); 
    if(isChecked){ 
     dbAccess.addToOrder(text); 
    }else{ 
     dbAccess.removeFromOrder(text); 
    } 
    } 
// then later.... 
button.setOnCheckedChangeListener(new MyListener(theCorrespondingTextView)); 
0

되고 내가 쉽게 버튼의 각 인스턴스로 유지할 수 있도록 내가 쓴 버튼의 서브 클래스의 인스턴스 :

이보다 구체적인를 확인하십시오. 그것으로 문제가 해결되었습니다.