2016-08-04 5 views
0

ストレートポイントに。私はamcurranによってShowcaseViewライブラリを使用してcoachmarkシリーズを表示しようとしています:https://github.com/amlcurran/ShowcaseView再帰メソッドでAndroid ShowcaseViewが表示されない

私はcoachmarkを表示することはできません。問題は常にnullを返すrunCoachMark()メソッドです。 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

私は例4の目標のために、あなたとあなたのViewTargetsを作成し、再帰的な方法

1)を使用して動的にshowcaseviewを使用するための新しい方法を共有する(あなたは、n個のターゲットを作成することができます)と宣言された配列に目標を置きますあなたのアクティビティクラスのプライベート属性として:private ViewTarget [] targets;最後に、あなたがショーケース表示するメソッドを呼び出すことができます)

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:

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)再帰的なメソッドを作成します。私はこれがあなたのために役立つことを願っています

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

を:)

関連する問題