2012-09-07 10 views
12

Utilizzo un ViewPager con viste dinamiche come mostrato in questo link. Sto aggiungendo ogni pagina al viewpager. Il codice per creare ogni pagina e inserirlo all'adattatore cercapersone è la seguenteOnClickListener di Child che impedisce lo sfioramento di Android ViewPager

public View createPage() 
{ 
TableLayout table = new TableLayout(mycontext); 
TableRow row = new TableRow(mycontext); 

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

     TableLayout catTable = new TableLayout(mycontext); 

     TableLayout.LayoutParams params = new TableLayout.LayoutParams(); 

     params.height = LayoutParams.MATCH_PARENT; 

     TableRow catName = new TableRow(mycontext); 
     catName.setGravity(0x03); 
     catName.setLayoutParams(params); 

     TextView cat = new TextView(mycontext); 
     TableRow.LayoutParams RowParams= 
      new TableRow.LayoutParams(pixeltoDp(0),pixeltoDp(85)); 
     RowParams.weight = 1; 
     cat.setLayoutParams(RowParams); 
     cat.setPadding(35, 0, 5, 0); 
     cat.setGravity(0x13); 
     cat.setSingleLine(true); 
     cat.setHorizontallyScrolling(true); 
     cat.setFocusable(true); 
     cat.setFocusableInTouchMode(true); 
     cat.setLines(1); 
     cat.setText(data.getCats().get(i).getName()); 
     cat.setTextColor(color); 
     cat.setSelected(true); 

     catName.addView(cat); 
     catTable.addView(catName); 
     for(int j=0; j < 5; j++) 
     { 
      TableRow trChild = new TableRow(mycontext); 
      trChild.setLayoutParams(params); 
      trChild.setGravity(0x11); 
      for (int k=0; k<4; k++) 
      { 
       TextView app = new TextView(mycontext); 
       TableRow.LayoutParams tableRowParams= 
        new  TableRow.LayoutParams(pixeltoDp(0),pixeltoDp(80)); 
       margin = pixeltoDp(11); 

       tableRowParams.weight = 1; 
       app.setLayoutParams(tableRowParams); 

       app.setGravity(0x11); 
       app.setSingleLine(true); 
       app.setTextSize(pixeltoDp(12)); 
       app.setTextColor(Color.BLACK); 
       app.setTypeface(verdana); 


       int pos = j+(k*5); 
       if((pos < mysize)) 
       { 
         Drawable icon = getMyDrawable(); 

         app.setCompoundDrawablesWithIntrinsicBounds(null, icon, null, null); 
         app.setText("some Name"); 
         app.setTag(i+":"+pos); 
         app.setEllipsize(TextUtils.TruncateAt.END); 
         app.setOnClickListener(onMyClick); 

       } 

       trChild.addView(app); 
      } 
      catTable.addView(trChild);    
     } 
     TableRow.LayoutParams tableRowParams= 
       new TableRow.LayoutParams 
        (TableRow.LayoutParams.MATCH_PARENT,TableRow.LayoutParams.WRAP_CONTENT); 
     margin = pixeltoDp(5); 
     tableRowParams.setMargins(margin,0,margin, pixeltoDp(18)); 
     catTable.setLayoutParams(tableRowParams);  
}   
row.setGravity(0x03); 
table.addView(row);  
return table;   
} 

L'OnClickListener per la TextView nella pagina è la seguente

private View.OnClickListener onAppClick=new View.OnClickListener() { 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     String gettext = (String)v.getTag(); 
     String[] splittext = gettext.split(":"); 

     Log.d("TAG","Click Event is Triggered"); 
    } 
}; 

Il problema che sto affrontando è che il viewpager diapositive quando faccio scorrere lo schermo ma se il mio dito avvia lo scorrimento dal testo con onclicklistener la pagina non scorre, anche l'evento click non viene chiamato. Se clicco sulla vista del testo, viene chiamato l'evento click. Non sono in grado di capire perché il viewpager non capovolge le pagine se lo scorrimento inizia dalla visualizzazione del testo con l'evento click.

Per scoprire il motivo per il bug ho aggiunto un ontouchlistener al viewpager e ha scoperto che l'evento di tocco del viewpager viene chiamato quando il colpo avviene da parte della pagina in cui non c'è vista del testo e il tocco evento non viene chiamato affatto se lo scorrimento inizia nella parte superiore della visualizzazione del testo. Se rimuovo onclicklistener di textview, l'intero viewpager si gira correttamente senza alcun problema. Quindi il problema è che l'evento click del textview sta fermando gli eventi touch del viewpager. Per favore dimmi se sto facendo qualcosa di sbagliato nel mio codice di creazione della pagina. La vista che creo in questa funzione viene aggiunta al viewpager attraverso il pageadapter come mostrato nel tutorial che ho menzionato all'inizio.

risposta

22

Infine ho trovato un bug nell'ultima versione di ViewPager in cui un TextView con un evento click, singleLine impostato come true e gravità impostato come centro non passa gli eventi touch al ViewPager se il dito viene spostato a partire nella parte superiore della textview. Se rendiamo il singleLine come falso o rimuoviamo il Center gravity, allora gli eventi vengono passati al ViewPager quindi può lanciare. Non possiamo usare sia il centro di gravità che setingleline (true) per la textview o un pulsante con sinlgeline impostato come vero. Ho segnalato questo come un bug here

Vedere la fonte 'applicare un'unica riga' qui: https://github.com/android/platform_frameworks_base/blob/7bfb1e7f46d2ed3df6cc467bccec95b5999d9cc4/core/java/android/widget/TextView.java#L7877

+0

Grazie mille per la ricerca e la pubblicazione di questo, ho pensato che stavo impazzendo per un po 'lì ... – avalancha

+0

Grazie !!! Stavo cercando il motivo di tutto questo giorno ... –

+0

singleLine = "true" è deprecato. usa maxLine = "1" invece –

4

Sembra che ci sia un po 'di una soluzione: è possibile utilizzare setMaxLines(1) invece di setSingleLine() e funzionerà senza pregiudicare il sistema. Tuttavia posso confermare il tuo previous answer in cui dici che è un bug

Problemi correlati