2012-03-16 25 views
0

我有一個循環,我創建了多個按鈕實例,並且每個實例都有一個TouchListener。但是,當我觸摸不同的按鈕時,我很難弄清楚如何管理。我試圖完成的是,每個按鈕代表一個文本視圖,當我觸摸按鈕,我想添加與按鈕的實例相關聯的特定文本視圖到一個數組列表。但是,當再次觸摸同一個按鈕時,我想將其從列表中刪除。如果再次觸摸,請再次將其添加回去。哦,是的addToOrder目前是全球性的,並初始化爲真。onTouch方法 - 確保點擊或按下按鈕的哪些實例

想法?

編輯****按照我下面的評論按鈕,現在是我編寫的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 2012-03-16 19:31:29

回答

0

如果這是添加項目的唯一方法/從DBACCESS刪除,你可以根據它是否已經存在只是切換。

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

編輯:假設dbAccess有一個contains(),不知道它在這裏是什麼類型。

+0

dbAccess實際上是一個我寫過的類,它是我的Activities和我的模型(數據庫)之間的中介。試圖儘可能多地使用MVC。我實際上解決了這個問題。我創建了一個自定義按鈕類,它使用一個私有布爾變量來擴展按鈕類,並創建了兩個函數,它們需要一個布爾值並返回一個布爾值,即setTouchInfo(boolean clicky)和getTouchInfo(),它返回按鈕的狀態被點擊或不)。我將註釋掉舊代碼併發布新代碼。之前應該有這個想法。 – cspam 2012-03-16 19:47:06

1

您可以設置任何View使用setTag,其中有兩個版本的任意對象(其中的按鈕是一個子類)。

因此,舉例來說,在循環用於創建每個Button當按鈕被觸動,你可以添加一個String實例或使用myButton.setTag(Object o)

一個Integer實例的Button,它被傳遞給onTouchView v的說法。

只需使用getTag()v中拉出標籤並檢查它。

+0

是的,這就是我剛剛解決的想法 - 我沒有設置標籤我只是在子類中使用私有變量來跟上按鈕的狀態。查看新代碼並在問題結束時編輯註釋 – cspam 2012-03-16 19:55:10

0

首先,我會使用一個開關或ToggleButton而不是普通的按鈕。這樣按鈕就會跟蹤你感興趣的兩個狀態。當切換開關被切換時,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

每下面的按鈕我的意見是,現在巴頓的子類,我寫了,這樣我可以很容易地與按鈕的每個實例跟上的一個實例。這解決了這個問題。