OnClickListener de Child que impide el golpe de vista de Android ViewPager
Estoy utilizando un ViewPager con vistas dinámicas como se muestra en este enlace . Estoy agregando cada página al viewpager. El código para crear cada página y añadirla al adaptador de buscapersonas es el siguiente
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; }
El OnClickListener para la vista de texto en la página es la siguiente
- OnClickListener del primer elemento de GridView no funciona
- Botón de forma personalizada de Android
- Iniciación de inicio desde onclicklistener
- Ajuste del valor de la variable global en el botón
- ¿Por qué está cambiando donde se establecen los parámetros de diseño solucionando mi problema "OnClickListener no funciona para el primer elemento en GridView"?
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 me enfrento es que el visor de visores se desliza cuando deslizo en la pantalla pero si mi dedo comienza el golpe del texto con el onclicklistener la página no se desliza, tampoco se llama al evento de clic. Si hago clic en la vista de texto, se llama al evento click. No puedo calcular porqué el viewpager en no dar vuelta a las páginas si el golpe comienza de la visión del texto con acontecimiento del tecleo.
Para averiguar la razón del error agregué un ontouchlistener al viewpager y encontré que el evento táctil del viewpager se llama cuando el golpe sucede en la parte de la página donde no hay ninguna opinión del texto y el acontecimiento del tacto no se llama en Todo si el golpe comienza en la parte superior de la vista de texto. Si quito el onclicklistener del textview entonces el viewpager entero se desplaza correctamente sin ningún problema. Así que 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 página de creación. La vista que creo en esta función se agrega al viewpager a través del pageadapter como se muestra en el tutorial que mencioné al principio.
- Cómo obtener clics en RecyclerView (NO los niños)
- Agregar un oyente a un botón dentro de un alerta de alerta personalizado bloquea mi aplicación
- Evitar que ProgressDialog sea rechazado por onClick
- Cómo implementar OnClickListener en Android
- ListView no responde a los eventos de clics en Android
- Necesita hacer doble clic en EditText para que el oyente de clics responda
- Cajón de navegación OnItemClickListener
- Cómo utilizar el método onClickListener de Button en un ListView
Finalmente encontré que hay un error en la última versión de ViewPager donde un TextView con un evento de clic, singleLine establecido como verdadero y gravedad establecido como centro no pasa los eventos de toque al ViewPager si el dedo se mueve comenzando en la parte superior de La vista de texto. Si hacemos el singleLine como falso o quitar la gravedad del centro entonces los acontecimientos se pasan al ViewPager entonces puede lanzar. No podemos usar tanto la gravedad de centro como la línea de ensamblaje (true) para la vista de texto o un botón con sinlgeline establecido como verdadero. He informado esto como un error aquí
Vea la fuente 'aplicar una sola línea' aquí: https://github.com/android/platform_frameworks_base/blob/7bfb1e7f46d2ed3df6cc467bccec95b5999d9cc4/core/java/android/widget/TextView.java#L7877
Parece que hay algo de una solución: se puede usar setMaxLines(1)
lugar de setSingleLine()
y funcionará sin afectar el sistema. Sin embargo, puedo confirmar su respuesta anterior en la que usted dice que es un error
- Devolver el resultado de la intención cuando la actividad se cierra con el botón Atrás
- Utilice diferentes tipos de compilación de módulo de biblioteca en el módulo de aplicación de Android en Android Studio y Gradle