Autore Topic: Intercettare elementi nella view principale durante uno swiping  (Letto 863 volte)

Offline Androi-dé!

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 7
Intercettare elementi nella view principale durante uno swiping
« il: 25 Maggio 2012, 15:18:54 CEST »
0
Sto cercando di documentarmi ma con scarsi risultati, ho dato una bella scorsa alla gestione degli eventi ma nonostante qualche informazione in rete ed il libro di M. Carli ho sempre le idee poco chiare.
La questione in parole povere è se è possibile intercettare gli elementi (e quindi ricavarne l'id, il testo, il colore o quant'altro) presenti in una view al passaggio del dito sullo schermo.
Ho fatto delle prove e sono riuscito tramite View.OnTouchListener (e onTouch) utilizzando ACTION_DOWN, ACTION_MOVE e ACTION_UP a recuperare le coordinate nelle quali uno si sta spostando (con getX() e getY()) oppure a recupera l'id ma tutto è riferito alla View (contenitore) e non agli elementi al suo interno, quello che vorrei sapere è se è possibile al passaggio del dito recuperare (ad esempio con un Toast) le informazioni degli elementi all'interno del contenitore sui quali si sta passando.

 :-o

Offline Androi-dé!

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 7
Re:Intercettare elementi nella view principale durante uno swiping
« Risposta #1 il: 28 Maggio 2012, 22:11:23 CEST »
0
Dopo vari tentativi sono riuscito ad arrivare ad una soluzione semifunzionante.
Praticamente creo al volo una tabella, gli associo un ontouchlistener e poi utilizzo il seguente codice che mi sono creato prendendo spunti qua e là in rete:

Codice (Java): [Seleziona]
    private View.OnTouchListener OnTouchListener = new View.OnTouchListener() {
               
                 public boolean onTouch(View view, MotionEvent motionEvent) {
                         // TODO Auto-generated method stub
                         
                         for(int i=0; i<table.getChildCount(); i++) {
                         
                                 View view1 = table.getChildAt(i);
                                 Rect outRect = new Rect(view1.getLeft(), view1.getTop(), view1.getRight(), view1.getBottom());
                         
                                 if(outRect.contains((int)motionEvent.getX(), (int)motionEvent.getY())) {
                                         
                                         for(int j=0; j<((ViewGroup) view1).getChildCount(); j++) {
                                         
                                                 View view2 = ((ViewGroup) view1).getChildAt(j);
                                                 
                                                 Rect outRect2 = new Rect(view2.getLeft(), view2.getTop(), view2.getRight(), view2.getBottom());
                                                 
                                                 if(outRect2.contains((int)motionEvent.getX(), (int)motionEvent.getY())) {
                                                         textZ.setText("testo: " + ((TextView)view2).getText().toString());
                                                 }
                                         }
                                                                         
                                 }
                         }
                         
                         return true;
                 }
        };

Diciamo che la tabella che creo ha 10 righe (e 10 colonne, ma non dovrebbe essere rilevante), il problema è che lo swiping funziona solo sulla prima riga della tabella dove muovendo il dito sulle celle riesco a prendere il contenuto (il testo di una una textview al suo interno) e visualizzarlo in un'altra textview ma sulle altre righe della tabella non ottengo nessun effetto.

Il problema sembrerebbe focalizzato qua:

Codice (Java): [Seleziona]
...
                         for(int i=0; i<table.getChildCount(); i++) {
                         
                                 View view1 = table.getChildAt(i);
...

In quanto ho provato ad inserire in getChildAt(i) direttamente il valore di i e se inserisco 0 ottengo il solito risultato mentre inserendo ad esempio 3 mi aspetterei che il touch funzionasse sulla quarta riga e invece non funziona più su nessuna e così anche con altri valori, come se venisse riconosciuta come riga della tabella solo la prima.

Avete suggerimenti in merito? Qualcuno si è trovato in una situazione simile? Nonostante abbia sbattuto la testa per arrivare a questo punto sono fermo su questo problema da un po'. Grazie intanto in anticipo.  :'(


EDIT: con un Toast ho visualizzato i valori di view1 che sarebbero quelli dei vari TableRow e sinceramente sono diversi per cui mi viene da pensare che in realtà l'evento per il touch ce l'abbiano associato. Tant'è che se inserisco un altro Toast sotto a View view2 = ((ViewGroup) view1).getChildAt(j); per visualizzare la Textview della view2 mi viene visualizzato il valore della textview anche se parte a visualizzarmi tutti gli altri valori della riga in ciclo.
Pertanto mi viene da pensare che c'è qualcosa di logico che è sbagliato nel codice di cui sopra, o meglio è utilizzato in modo non corretto.

 :-\
« Ultima modifica: 28 Maggio 2012, 22:56:16 CEST da Androi-dé! »

Offline Androi-dé!

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4
  • Sistema operativo:
    Windows 7
Re:Intercettare elementi nella view principale durante uno swiping
« Risposta #2 il: 29 Maggio 2012, 12:57:48 CEST »
0
Credevo di essere arrivato alla conclusione per poter postare il risultato ma invece vi riporto il codice dell'activity nella speranza che qualcuno riconosca il problema, io sono arrivato al punto che devo gettare la spugna e trovare qualcosa di simile per fare ciò che vorrei, ossia muovere il dito sullo schermo ed intercettare quello che trovo, avevo appunto avuto l'idea della tabella in modo da intercettare i contenuti delle singole celle ma non ci sono riuscito.

Il problema lo riassumo è che riesco ad identificare il numero di righe e di celle per riga ma al passaggio del dito mi viene mostrato il contenuto solo delle celle della prima riga:

Codice (Java): [Seleziona]
public class TestSingleTouch02Activity extends Activity {
       
        TableLayout table;
        TextView textZ, textA, textB;
        int c=0;
        int d=100;
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
                LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout1);
                textZ = (TextView) findViewById(R.id.z);

                textA = (TextView) findViewById(R.id.a);
                textB = (TextView) findViewById(R.id.b);
               
                table = new TableLayout(this);
               
               
               
                TableLayout.LayoutParams params = new TableLayout.LayoutParams();
                params.width = TableLayout.LayoutParams.FILL_PARENT;
                params.height = TableLayout.LayoutParams.FILL_PARENT;
                table.setLayoutParams(params);
                table.setStretchAllColumns(Boolean.TRUE);
               
               
               
                table.setOnTouchListener(OnTouchListener);

                for (int i = 0; i < 5; i++) {

                        TableRow row = new TableRow(this);                     
                        row.setId(c);
                        c=c+1;
                       
                        for (int j = 0; j < 10; j++) {

                        TextView cell = new TextView(this) {
                            @Override
                            protected void onDraw(Canvas canvas) {
                                super.onDraw(canvas);
                                Rect rect = new Rect();
                                Paint paint = new Paint();
                                paint.setStyle(Paint.Style.STROKE);
                                paint.setColor(Color.WHITE);
                                paint.setStrokeWidth(2);
                                getLocalVisibleRect(rect);
                                canvas.drawRect(rect, paint);
                            }

                        };
                        cell.setId(d);
                        d=d+1;
                        cell.setText("a" + i + ", " + j);
                        cell.setPadding(6, 4, 6, 4);
                        row.addView(cell);

                        }

                        table.addView(row);
                }

                layout.addView(table);
       
    }
   
    private View.OnTouchListener OnTouchListener = new View.OnTouchListener() {
               
                 public boolean onTouch(View view, MotionEvent motionEvent) {
                         // TODO Auto-generated method stub
                         
                         for(int i=0; i<table.getChildCount(); i++) {
                         
                                 TableRow view1 = (TableRow) table.getChildAt(i);
                                 Rect outRect = new Rect(view1.getLeft(), view1.getTop(), view1.getRight(), view1.getBottom());
                         
                                 if(outRect.contains((int)motionEvent.getX(), (int)motionEvent.getY())) {
                                         
                                         textZ.setText("testo: " + table.getId() + " - " + view1.getId());
                                                                                 
                                         for(int j=0; j<view1.getChildCount(); j++) {
                                                                                         
                                                 View view2 = ((ViewGroup) view1).getChildAt(j);
         
                                                 Rect outRect2 = new Rect(view2.getLeft(), view2.getTop(), view2.getRight(), view2.getBottom());
                                                 
                                                 if(outRect2.contains((int)motionEvent.getX(), (int)motionEvent.getY())) {
                                                         textA.setText("idcella: " + view2.getId());
                                                         textB.setText("testov: " + ((TextView)view2).getText().toString());
                                                         
                                                 }
                                         }               
                                 }
                         }
                         
                         return true;
                 }
        };
}