2016-08-04 112 views
0

直指点。我试图用amlcurran显示使用ShowcaseView库的coachmark系列:https://github.com/amlcurran/ShowcaseViewAndroid ShowcaseView没有显示递归方法

我无法获得coachmark显示。问题是runCoachMark()方法总是返回null。在mMainAdapter的notifyDatasetChaned()后面运行runCoachMark()方法。我试图使用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

我会与大家分享动态使用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)最后,你可以调用显示展示了方法:

toStep("Title for showcase [i]", " Description for showcase [i] ",targets[0], 0); 

我希望这将是对你有帮助:)