No hay efecto de ondulación en el tacto en la vista de reciclaje
Tengo una vista de reciclaje con cuatro elementos de cuadrícula (2 * 2) que funcionan como un menú. Sin embargo, cuando hago clic en ellos no se muestra ningún efecto de rizo. Simplemente me lleva a la siguiente actividad sin ninguna confirmación visual de que la vista fue presionada. ¿Alguien puede ayudar?
Actividad principal
- Cómo utilizar RippleDrawable programaticamente en código (no xml) con Android 5.0 Lollipop?
- No se pudo encontrar la clase 'android.graphics.drawable.RippleDrawable' Unicode issue?
- Android: <include> con RippleEffect & StateListAnimator
- ¿Cómo activar el efecto de rizo en Android Lollipop, en una ubicación específica dentro de la vista, sin desencadenar eventos de touch?
- Android Button Ripple en Lollipop y resaltar en pre lollipop
public class MainActivity extends AppCompatActivity implements MainMenuAdapter.OnItemClickListener { Toolbar toolbar; private static List<ViewModel> tileItems = new ArrayList<>(); static { tileItems.add(new ViewModel("Activity", "#3F51B5", R.drawable.activity)); tileItems.add(new ViewModel("Profile", "#E91E63", R.drawable.profile)); tileItems.add(new ViewModel("Training", "#FF5722", R.drawable.training)); tileItems.add(new ViewModel("Diet", "#4CAF50", R.drawable.diet)); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); MainAdapter adapter = new MainAdapter(tileItems, MainActivity.this); recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(this); // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } @Override public void onBackPressed() { this.moveTaskToBack(true); // this.finishAffinity(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public void onItemClick(View view, ViewModel viewModel) { } }
MainAdapter
public class MainAdapter extends RecyclerView.Adapter<MainMenuAdapter.ViewHolder> implements View.OnClickListener { private List<ViewModel> items; private OnItemClickListener onItemClickListener; private Context context; // Adapter constructor public MainAdapter(List<ViewModel> items, Context context) { this.items = items; this.context = context; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { final ViewModel dataItem = items.get(position); viewHolder.colorBlock.setBackgroundColor(dataItem.getColor()); viewHolder.menuName.setText(dataItem.getName()); viewHolder.menuIcon.setImageResource(dataItem.getImage()); viewHolder.itemView.setTag(dataItem); if (dataItem.getActivity() != null) { viewHolder.colorBlock.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(context, dataItem.getActivity()); context.startActivity(i); } }); } } @Override public int getItemCount() { return items.size(); } @Override public void onClick(final View v) { // Give some time to the ripple to finish the effect if (onItemClickListener != null) { new Handler().postDelayed(new Runnable() { @Override public void run() { onItemClickListener.onItemClick(v, (ViewModel) v.getTag()); } }, 200); } } /** This is our ViewHolder class */ public static class ViewHolder extends RecyclerView.ViewHolder { public TextView menuName; public View colorBlock; public ImageView menuIcon; public ViewHolder(View convertView) { super(convertView); // Must call super() first menuName = (TextView) convertView.findViewById(R.id.menuName); colorBlock = (View) convertView.findViewById(R.id.colorBlock); menuIcon = (ImageView) convertView.findViewById(R.id.menuItem); } } public interface OnItemClickListener { void onItemClick(View view, ViewModel viewModel); } }
Activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <include android:id="@+id/toolbar" layout="@layout/toolbar" android:layout_height="wrap_content" android:layout_width="match_parent"/> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_below="@id/toolbar" android:layout_width= "match_parent" android:layout_height = "match_parent" /> </RelativeLayout>
Main_item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" android:foreground="?android:attr/selectableItemBackground"> <View android:id="@+id/colorBlock" android:layout_width="match_parent" android:layout_height="170dp" /> <ImageView android:id="@+id/menuItem" android:layout_width="120dp" android:layout_height="120dp" android:layout_centerHorizontal="true" android:padding="16dp" /> <TextView android:id="@+id/menuName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:textColor="@android:color/white" android:textSize="16sp"/> </RelativeLayout>
- Efecto de ondulación de material oculto por otra vista en el diseño
- El efecto Ripple no aparece a veces
- Botón de ondulación de androide con fondo
- NavigationView + selector + efecto de rizo estado seleccionado no funciona
- Efecto de ondulación en los elementos desplegables de Spinner de fondo de color (appcompat-v7 V21)
- Mantenga la ondulación dentro del trazo
- Android cómo hacer referencia a una nueva clase de la Ripple RippleDrawable
- Cómo crear efecto de rizo en un diseño sencillo
El efecto Ripple ocurrirá (@Budius está equivocado en su comentario) si establece el fondo de main_item.xml en ?android:selectableItemBackground
selectableItemBackground o ?selectableItemBackground
. Encontré referencias a la segunda. Sin embargo, AndroidStudio advirtió que era un privado en com.android.support:design. Mi aplicación se estrelló al intentar utilizar esa versión privada. Supongo que en el primero con el prefijo "android:", y voila, funciona.
Tal vez usted está estableciendo android:foreground
por accidente? Intenté eso pero no vi nada suceder a mis artículos de RecyclerView.
Su RelativeLayout actualizado sería:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" android:foreground="?android:attr/selectableItemBackground" android:background="?android:selectableItemBackground">
También he visto android:background="?android:attr/selectableItemBackground"
trabajo para iniciar la ondulación. También mencionaré que el selectableItemBackground no necesita estar en el elemento raíz de la main_item.xml. Estoy utilizando un color de fondo en el elemento de la raíz, a continuación, establecer selectableItemBackground en un ViewGroup anidado.
Mi respuesta proviene de un marco de referencia NO usando el diseño de material appcompat. Sospecho que hay una diferencia si está utilizando la biblioteca de soporte de diseño appcompat material.
- ¿Cómo agregar desplazamiento a la vista cuando se cambia la orientación de la pantalla a paisaje?
- Tire para actualizar en Android sin biblioteca popular