2012-03-16 13 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(boolean clicky)とgetTouchInfo()というブール値を返す2つの関数を作成しました。クリックされたかどうか)。私は古いコードをコメントアウトし、新しいコードを投稿します。以前これについて考えていたはずです。 – cspam

1

View(Buttonはサブクラス)に任意のオブジェクトを設定できます。setTagの2つのバージョンがあります。ボタンをタッチすると

だから、例えば、あなたのループ内の各Buttonを作成するために使用されるあなたがStringインスタンスまたはmyButton.setTag(Object o)

を使用してButtonからIntegerインスタンスを追加することができ、それはとしてonTouchに渡されますView v引数。

のタグをgetTag()でプルして調べてください。

+0

これはちょうど私が解決したアイデアでした - 私はタグを設定しませんでした。私はちょうどサブクラス内のプライベート変数を使用して、ボタンの状態を維持しました。新しいコードを見て、質問の最後にコメントを編集してください – cspam

0

まず、通常のボタンではなく、スイッチまたはトグルボタンを使用します。そうすることで、ボタンはあなたが興味のある2つの状態を追跡します。setOnCheckedChangedリスナーは、スイッチがトグルされたときにコールバックを取得します。

第2に、匿名クラスを使用するのではなく、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

は今、私は簡単にボタンの各インスタンスについていくことができるように、私が書いたボタンのサブクラスのインスタンスです。それが問題を解決しました。

関連する問題