2013-03-05 15 views
8

ho un ArrayList di pulsanti dove la mia OCL ha bisogno di sapere quale indice I è stato premuto. Il piano è qualcosa di simile:Creazione di un costume OnClickListener

MyOnClickListener onClickListener = new MyOnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Intent returnIntent = new Intent(); 
      returnIntent.putExtra("deleteAtIndex",idx); 
      setResult(RESULT_OK, returnIntent); 
      finish(); 

     } 
    }; 
    for (int i =0;i<buttonList.size();i++) { 
     buttonList.get(i).setText("Remove"); 
     buttonList.get(i).setOnClickListener(onClickListener); 
    } 

modo la mia applicazione della OCL bisogno di assomigliare?

Attualmente ho questo:

public class MyOnClickListener implements OnClickListener{ 

int index; 

public MyOnClickListener(int index) 
{ 
    this.index = index; 
} 

@Override 
public void onClick(View arg0) { 


} 

}

Tuttavia, non sono sicuro di quello che ho bisogno di fare all'interno del costruttore della mia OCL, proprio come la funzione sovrascritto onClick.

+0

vuoi passare tutti i dati a MyOnClickListener da ciclo for? –

+0

Sì, l'indice. –

+0

cambia il ciclo for e crea un nuovo ObjectEverytime e passa l'indice in cunstructor. –

risposta

6

impostato setOnClickListener Button come:

buttonList.get(i).setOnClickListener(new MyOnClickListener(i)); 

EDIT:

Ho bisogno di finire un'attività in myOCL, come avrei potuto farlo?

per la finitura di attività sul pulsante Fare clic su dalla classe non Activity dovrai passare Context attività per la vostra abitudine OnClickListener come:

buttonList.get(i).setOnClickListener(new MyOnClickListener(i, Your_Current_Activity.this)); 

e cambiare il costruttore di vostra abitudine OnClickListener classe:

int index; 
Context context; 
public MyOnClickListener(int index,Context context) 
{ 
    this.index = index; 
    this.context=context; 
} 

@Override 
public void onClick(View arg0) { 

    // now finish Activity as\ 
    context.finish(); 
     // OR 
     // ((Activity)context).finish(); 
} 
+0

Oh, capisco. Dire che ho bisogno di finire un'attività in myOCL, come potrei farlo? 'public classe MyOnClickListener estende attività implementa OnClickListener {' '\t \t setResult (Activity.RESULT_OK, returnIntent); \t \t finish(); ' –

+0

@AdrianJandl: passa il contesto attività anche al costruttore di pulsanti –

+0

@AdrianJandl: vedere la mia risposta di modifica –

2
View.OnClickListener myListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("Button",v.getText().tostring); 
    } 
}); 

visualizzerai il valore del pulsante in modo tale che troverai l'indice.

2

cambiare il vostro ciclo e creare nuovi oggetti ogni volta e passare l'indice nel costruttore.

for (int i =0;i<buttonList.size();i++) { 
     buttonList.get(i).setText("Remove"); 
     buttonList.get(i).setOnClickListener(new MyOnClickListener(i)); 

} 

È possibile ottenere l'indice nel proprio metodo onClick.

0

io non sono sicuro che questo vale in particolare per il vostro caso, ma ho avuto il desiderio di creare un listener personalizzato per gli elementi cliccabili per evitare che vengano cliccato due volte (se l'utente tocca rapidamente).

La mia soluzione era quella di creare una classe listener in cui passassi una Runnable personalizzata e poi gestissi quella Runnable se il pulsante viene cliccato per la prima volta, ma ovviamente puoi passare qualsiasi comportamento personalizzato in, questo è solo uno molto semplice illustrazione di come usarlo ...

import android.content.Context; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 



public class MyCustomOnClickListener implements View.OnClickListener { 
    public static final String TAG = MyCustomOnClickListener.class.getSimpleName(); 
    private Runnable doOnClick; 
    private Context mContext; 
    private int isClicked = 0; 
    public MyCustomOnClickListener(Context c, Runnable doOnClick) throws Exception{ 
     if(!(c instanceof Context) || !(doOnClick instanceof Runnable)) 
      throw new Exception("MyCustomOnClickListener needs to be invoked with Context and Runnable params"); 
     this.doOnClick = doOnClick; 
     this.mContext = c; 
    } 

    @Override 
    public void onClick(View view) { 
     Log.v(TAG,"onClick() - detected"); 
     if(isClicked++ > 0)return; //this prevents multiple clicks 
     Log.d(TAG, String.format("onClick() - being processed. View.Tag = \"%s\"", view.getTag().toString())); 
     new Handler(mContext.getMainLooper()).post(doOnClick); 
    } 
} 

e poi usarlo (supponendo che si sta in un'attività per l'this contesto) ...

try{ 
    Button aButton = findViewById(R.id.someButton); 
    aButton.setOnClickListener(new MyCustomOnClickListener(/*context*/this, new Runnable(){ 
    public void run(){ 
    //here you would put whatever you would have otherwise put in the onClick handler. If you need the View that's being clicked you can replace the Runnable with a custom Runnable that passes the view along 
    } 
})); 
}catch(...){ 

} 
Problemi correlati