J'utilise un bouton d'action flottant. Je veux désactiver Recyclerview Items from Click lorsque j'appuie sur le bouton FAB. J'ai essayé cette méthode mais ne fonctionne pas setClickable(true);
Ma mise en page
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
xmlns:fab="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:background="#fff"
tools:context="com.hartwintech.socialchat.activity.IconTabsActivity">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:scrollbars="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
</Android.support.v7.widget.RecyclerView>
<com.github.clans.fab.FloatingActionMenu
Android:id="@+id/floatmenu"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_alignParentRight="true"
Android:layout_marginBottom="60dp"
Android:layout_marginRight="16dp"
fab:fab_showAnimation="@anim/show_from_bottom"
fab:fab_hideAnimation="@anim/hide_to_bottom"
fab:menu_labels_style="@style/MenuLabelsStyle"
fab:menu_shadowColor="#444"
fab:menu_colorNormal="#FFB805"
fab:menu_colorPressed="#F2AB00"
fab:menu_colorRipple="#D99200"/>
</RelativeLayout>
Java Class
floatMenu.setOnMenuToggleListener(new FloatingActionMenu.OnMenuToggleListener() {
@Override
public void onMenuToggle(boolean opened) {
if (opened) {
final int color = R.color.transp;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mrecyclerview.setClickable(false);
mrecyclerview.setEnabled(false);
mrecyclerview.setForeground(new ColorDrawable(ContextCompat.getColor(getContext(), color)));
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mrecyclerview.setClickable(true);
mrecyclerview.setEnabled(true);
mrecyclerview.setForeground(null);
}
}
}
});
Vous pouvez ajouter un simple booléen à votre adaptateur comme ceci:
public boolean isClickable = true;
et le mettre dans votre fab-click:
mAdapter.isClickable = true/false;
Et dans votre OnClickListener de l'adaptateur, n'agissez que s'il est cliquable:
public void onClick(View view) {
if(!isClickable)
return;
// do your click stuff
}
Pour désactiver RecyclerView, suivez les étapes ci-dessous:
1. Ajoutez la vue suivante dans votre fichier de mise en page,
<View
Android:id="@+id/viewDisableLayout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#40000000"
Android:clickable="true"
Android:focusable="true"
Android:visibility="gone"/>
2. Définissez View Visibility `View.VISIBLE lorsque vous souhaitez désactiver RecyclerView
Vous devez définir l'écouteur de clic sur chaque FloatingActionButton
.
La réponse de Björn Kechel m'aide. Comme il l'a dit, je viens d'ajouter Boolean. Lorsque je clique sur le menu fab, le booléen est activé. Ensuite, écrivez la condition sur mrecyclerview.addOnItemTouchListener
Java Class
public Boolean fabClick = false;
floatMenu.setOnMenuToggleListener(new FloatingActionMenu.OnMenuToggleListener() {
@Override
public void onMenuToggle(boolean opened) {
if (opened) {
final int color = R.color.transp;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fabClick = true;
mrecyclerview.setClickable(false);
mrecyclerview.setEnabled(false);
mrecyclerview.setForeground(new ColorDrawable(ContextCompat.getColor(getContext(), color)));
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fabClick = false;
mrecyclerview.setClickable(true);
mrecyclerview.setEnabled(true);
mrecyclerview.setForeground(null);
}
}
}
});
mrecyclerview.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), mrecyclerview, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
if(!fabClick) {
Android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fragment_anim_start, R.anim.fragment_anim_stop);
Intent i = new Intent(getActivity(), Group_Chat_Screen.class);
startActivity(i);
}
}
Solution de travail avec RecyclerView.OnItemTouchListener:
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("itemsClickable")
fun setRecyclerViewClickable(view: RecyclerView, clickable: Boolean) {
view.isEnabled = clickable
if (!clickable) {
val itemTouchListener = object : RecyclerView.OnItemTouchListener {
override fun onTouchEvent(rv: RecyclerView?, e: MotionEvent?) {
}
override fun onInterceptTouchEvent(rv: RecyclerView?, e: MotionEvent?): Boolean {
return rv?.isEnabled == false
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
}
}
view.addOnItemTouchListener(itemTouchListener)
view.tag = itemTouchListener
} else {
(view.tag as? RecyclerView.OnItemTouchListener)?.let {
view.requestDisallowInterceptTouchEvent(true)
view.removeOnItemTouchListener(it)
}
}
}
Vous pouvez simplement utiliser la récursivité pour désactiver/activer les clics sur l'affichage.
public static void setClickable(View view, boolean clickable) {
if (view != null) {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
setClickable(viewGroup.getChildAt(i), clickable);
}
}
view.setClickable(clickable);
}
}