2012-09-07 56 views
12

Estoy usando una ViewPager con vistas dinámicas como se muestra en este link. Estoy agregando cada página al viewpager. El código para crear cada página y agregarlo al adaptador localizador es el siguienteOnClickListener of Child impidiendo el deslizamiento de 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;   
} 

la OnClickListener para el TextView en la página es el siguiente

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"); 
    } 
}; 

El problema que estoy enfrentando es que el ViewPager se desliza cuando deslizo la pantalla, pero si mi dedo comienza a deslizar el dedo del texto con el onclicklistener, la página no se desliza, y tampoco se llama al evento click. Si hago clic en la vista de texto, se llama al evento click. No puedo entender por qué el visor de ventanas no está volteando las páginas si el deslizamiento comienza desde la vista de texto con el evento click.

Para averiguar el motivo del error agregué un ontouchlistener al visor y encontré que se llama al evento táctil del visor cuando el deslizamiento ocurre en la parte de la página donde no hay vista de texto y el evento táctil no se llama en absoluto si el deslizamiento comienza en la parte superior de la vista de texto. Si elimino el onclicklistener de la vista de texto, todo el viewpager se voltea correctamente sin ningún problema. Entonces, el problema es que el evento click de la vista de texto está deteniendo los eventos táctiles del viewpager. Por favor dígame si estoy haciendo algo mal en mi código de creación de página. La vista que creo en esta función se agrega al viewpager a través del adaptador de página como se muestra en el tutorial que mencioné al principio.

Respuesta

22

Finalmente encontré que hay un error en la última versión de ViewPager donde un TextView con un evento click, singleLine configurado como verdadero y gravedad establecido como centro no pasa los eventos táctiles a ViewPager si se mueve el dedo comenzando en la parte superior de la vista de texto. Si hacemos que la línea individual sea falsa o eliminemos la gravedad central, los eventos se pasan a ViewPager y luego pueden lanzarse. No podemos usar tanto la gravedad central como la línea individual (verdadera) para la vista de texto o un botón con línea continua establecida como verdadera. He reportado como un bug here

Ver la fuente 'aplicar sola línea' aquí: https://github.com/android/platform_frameworks_base/blob/7bfb1e7f46d2ed3df6cc467bccec95b5999d9cc4/core/java/android/widget/TextView.java#L7877

+0

Muchas gracias por investigar y publicar esto, pensé que me estaba volviendo loco por un tiempo allí ... – avalancha

+0

¡Gracias! Estaba buscando la razón de esto todo el día ... –

+0

singleLine = "true" está en desuso. use maxLine = "1" en su lugar –

4

Parece que hay un poco de una solución: se puede utilizar setMaxLines(1) en lugar de setSingleLine() y funcionará sin perjudicar el sistema. Sin embargo, puedo confirmar su previous answer en el que dice que es bug

Cuestiones relacionadas