Имеется фрагмент со списком, по нажатию на элемент списка происходит создание нового фрагмента, и добавление его во FragmentManager, отображение и скрытие фрагмента со списком. Стандартная задача. Проблема заключается в том, что если одновременно нажать по двум элементам списка, то будут создаваться два фрагмента и класться во FragmentManager и отображаться одновременно, а желательно что бы создавался только один фрагмент.
executePendingTransactions() не помогает
Сейчас реализовал с помощью триггера в виде булевой переменной, которая пропускает событие клика, если оно уже было нажато, но до тех пор пока не будет уничтожен фрагмент, вызванный по нажатию на элемент списка. Информация о уничтожении детального фрагмента передаётся через интерфейс, который реализует фрагмент со списком.
Возможно ли сделать это как-то иначе?
public class ListFragment extends Fragment implements DetailFragmentFragment.onDetailFragmentLifeCycleListener {
private boolean isTransactionPerforming = false;
...
@Override
public void onClick(Data someData) {
if (!isTransactionPerforming) {
isTransactionPerforming = true;
} else {
return;
}
DetailFragment DetailFragment = new DetailFragment();
DetailFragment.setMyData(someData);
DetailFragment.setFragmentVisible();
DetailFragment.setDetailLifeCycleListener(this);
getActivity().getSupportFragmentManager()
.beginTransaction()
.hide(currntListFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
.add(R.id.List_frameLayout, DetailFragment)
.addToBackStack("details")
.commitAllowingStateLoss();
}
@Override
public void onShown() {
isTransactionPerforming = false;
}
...
}
public class DetailFragment extends Fragment {
...
@Override
public void onDestroy() {
super.onDestroy();
if (mDetailLifeCycleListener != null)
mDetailLifeCycleListener.onShown();
}
...
public onDetailLifeCycleListener mDetailLifeCycleListener;
public void setDetailLifeCycleListener(onDetailLifeCycleListener mDetailLifeCycleListener) {
this.mDetailLifeCycleListener = mDetailLifeCycleListener;
}
public interface onDetailLifeCycleListener {
public void onShown();
}
}