直截了当。我试图通过amlcurran:https://github.com/amlcurran/ShowcaseView
显示使用ShowcaseView库的coachmark系列我无法得到coachmark。问题是runCoachMark()方法总是返回null。 runCoachMark()方法在mMainAdapter上的notifyDatasetChaned()之后运行。
我尝试使用Handler()。postDelayed()和Thread.sleep()但没有成功。
任何人都可以解释为什么会发生这种情况以及针对此问题的一些解决方案。谢谢。
private static final int COACHMARK_A = -3;
private static final int COACHMARK_B = -2;
private static final int COACHMARK_C = -1;
// ... some other coachmark type
private static final int END_COACHMARK = 0;
private static final int SCROLL_OFFSET = 56;
private static final long COACHMARK_DELAY = 200L;
private void runCoachMark(int type) {
if (type == END_COACHMARK) {
return;
}
View v = getCoachMarkView(type);
if (v == null) {
return;
}
showCoachMark(getActivity(), v, type);
}
@Nullable
private View getCoachMarkView(final int type) {
safeScrollTo(getPos(type), SCROLL_OFFSET);
return mMainList.getChildAt(0).findViewById(getCoachMarkId(type));
}
private void safeScrollTo(final int pos, final int offset) {
mMainList.setLayoutFrozen(true);
mLayoutManager.scrollToPositionWithOffset(pos, offset);
mMainList.setLayoutFrozen(false);
}
private int getCoachMarkId(int type) {
int id;
switch (type) {
case COACHMARK_A:
id = R.id.A;
break;
case COACHMARK_B:
id = R.id.B;
break;
case COACHMARK_C:
id = R.id.C;
break;
// ... some other types
default:
id = 0;
break;
return id;
}
private int getPos(int type) {
int pos;
switch (type) {
case COACHMARK_A:
pos = 1;
break;
case COACHMARK_B:
pos = 4;
break;
case COACHMARK_C:
pos = 5;
break;
// ... some other cases
default:
pos = 0;
break;
}
return pos;
}
private void showCoachMark(final Context context, final View v, final int type) {
new ShowcaseView.Builder(getActivity())
.setTarget(new ViewTarget(v.getId(), (Activity) context))
.setContentTitle(getTitle(type))
.setContentText(getDescription(type))
.setShowcaseDrawer(new CustomShowcaseView(v))
.setShowcaseEventListener(new OnShowcaseEventListener() {
@Override
public void onShowcaseViewHide(ShowcaseView showcaseView) {
}
@Override
public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
runCoachMark(type++);
}
}, COACHMARK_DELAY);
}
@Override
public void onShowcaseViewShow(ShowcaseView showcaseView) {
}
@Override
public void onShowcaseViewTouchBlocked(MotionEvent motionEvent) {
}
})
.build();
}
}
答案 0 :(得分:1)
我将与您分享使用showcaseview动态使用递归方法的新方法
1)创建ViewTargets,例如4个目标(您可以创建n个目标)并将目标放入在Activity类中声明为私有属性的数组中:private ViewTarget [] targets;
final ViewTarget target1 = new ViewTarget(textview1);
final ViewTarget target2 = new ViewTarget(textview2);
final ViewTarget target3 = new ViewTarget(textview3);
final ViewTarget target4 = new ViewTarget(textview4);
targets = new ViewTarget[] { target1, target2,target3,target4};
2)创建递归方法:
private void toStep(final String title, final String description,Target target, final int i) {
final ShowcaseView.Builder showCaseBuilder = new ShowcaseView.Builder(ShowCaseActivity.this);
showCaseBuilder.setTarget(targets[i]);
showCaseBuilder.setContentTitle(title.replace("[i]", ""+i));
showCaseBuilder.setContentText(description.replace("[i]", ""+i));
showCaseBuilder.setShowcaseEventListener(new OnShowcaseEventListener() {
@Override
public void onShowcaseViewTouchBlocked(MotionEvent motionEvent) {
}
@Override
public void onShowcaseViewShow(ShowcaseView showcaseView) {
}
@Override
public void onShowcaseViewHide(ShowcaseView showcaseView) {
try {
toStep(title, description, targets[i+1], i+1);
} catch(Exception ex) {
}
}
@Override
public void onShowcaseViewDidHide(ShowcaseView showcaseView) {
}
});
showCaseBuilder.build();
}
3)最后,您可以调用显示Showcases的方法:
toStep("Title for showcase [i]", " Description for showcase [i] ",targets[0], 0);
我希望这会对你有所帮助:))