Библиотека Showcaseview, вызывающая несколько раз первый элемент Recyclerview
Я использую https://github.com/florent37/TutoShowcase эту библиотеку showcaseview в моем коде.
Работает нормально в activity
а также fragment
Но когда я звоню recyclerview
пункт он показывает несколько всплывающих окон и получает затемнение.
mRecyclerViewList.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Logger.log("Call");
TextView textView = (TextView) mRecyclerViewList.getChildAt(0).findViewById(R.id.txt_add_tocart_btn);
Logger.log("Textview" + textView);
textView.setFocusableInTouchMode(true);
TutoShowcase.from((Activity) context).setContentView(R.layout.tuto_showcase_tuto_sample)
.setFitsSystemWindows(true).on(textView).addRoundRect(35).showOnce("1").show();
// unregister listener (this is important)
if (Build.VERSION.SDK_INT < 16) {
mRecyclerViewList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
mRecyclerViewList.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
Как я могу избежать нескольких всплывающих окон?
2 ответа
Ваш вопрос, как избежать нескольких всплывающих окон:
Просто установите логическое значение, чтобы избежать многократного показа.
boolean isShown = false;
mRecyclerViewList.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Logger.log("Call");
if(!isShown){
TextView textView = (TextView) mRecyclerViewList.getChildAt(0).findViewById(R.id.txt_add_tocart_btn);
Logger.log("Textview" + textView);
textView.setFocusableInTouchMode(true);
TutoShowcase.from((Activity) context).setContentView(R.layout.tuto_showcase_tuto_sample)
.setFitsSystemWindows(true).on(textView).addRoundRect(35).showOnce("1").show();
isShown = true;
}
// unregister listener (this is important)
if (Build.VERSION.SDK_INT < 16) {
mRecyclerViewList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
mRecyclerViewList.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
Как описано в документации OnGlobalLayoutListener
:
вызываться при изменении состояния глобального макета или видимости представлений в дереве представлений.
Вот почему вы получили много и много просмотров витрины. Каждый раз, когда ViewTree изменяется, вы генерируете витрину.
Вам не нужно для ViewTreeObserver
а также GlobalLayoutListener
,
Переехать
TutoShowcase.from
в onViewCreated
например.