2016-10-25 2 views
5

그래서 "java.lang.RuntimeException :이 그래프에는 순환 종속성이 포함되어 있습니다"오류가 계속 발생합니다. 내가 AppBarLayout.ScrollingViewBehavior에서 확장 한 Behavior에 의해. 이 동작을 사용하는 AppBarLayout이있는 레이아웃이 있으며이 동작을 제거하면 오류가 사라집니다. 다음은 오류 및 코드 내가 FloatingActionButton과 같은 문제가 있었다AppBarLayout ScrollingViewBehavior는 "java.lang.RuntimeException :이 그래프는 순환 종속성을 포함합니다"오류

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: yu.heetae.android.mergingtoolbar, PID: 26027 
java.lang.RuntimeException: This graph contains cyclic dependencies 
at android.support.design.widget.DirectedAcyclicGraph.dfs(DirectedAcyclicGraph.java:164) 
at android.support.design.widget.DirectedAcyclicGraph.dfs(DirectedAcyclicGraph.java:172) 
at android.support.design.widget.DirectedAcyclicGraph.dfs(DirectedAcyclicGraph.java:172) 
at android.support.design.widget.DirectedAcyclicGraph.getSortedList(DirectedAcyclicGraph.java:152) 
at android.support.design.widget.CoordinatorLayout.prepareChildren(CoordinatorLayout.java:658) 
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:706) 
at android.view.View.measure(View.java:18794) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
at android.view.View.measure(View.java:18794) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
at android.view.View.measure(View.java:18794) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
at android.view.View.measure(View.java:18794) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
at android.view.View.measure(View.java:18794) 
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
at android.view.View.measure(View.java:18794) 
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
at android.view.Choreographer.doFrame(Choreographer.java:606) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
public class MergedAppbarBehavior extends AppBarLayout.ScrollingViewBehavior { 

    private Toolbar mToolbar; 
    private View mBackground; 
    private FrameLayout.LayoutParams mBackgroundLayoutParams; 

    private Context mContext; 

    private boolean isInit = false; 

    public MergedAppbarBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
     return dependency instanceof NestedScrollView; 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
     if(!isInit) { 
      init(child); 
      return false; 
     } 

     if(isDependencyYBelowToolbar(child, dependency) && ! isDependencyYReachTop(dependency)) { 
      setToolbarBackground(android.R.color.transparent); 
      setPartialBackgroundHeight((int)((child.getHeight() + child.getY()) - dependency.getY())); 
     } else if(isDependencyYBelowStatusToolbar(child, dependency) || isDependencyYReachTop(dependency)) { 
      setToolbarBackground(Color.parseColor("#3F51B5")); 
      setPartialBackgroundHeight(0); 
     } 

     return false; 
    } 

    private void init(View child) { 
     AppBarLayout appBarLayout = (AppBarLayout) child; 

     mToolbar = (Toolbar) appBarLayout.findViewById(R.id.toolbar); 
     mToolbar.setTitle(" "); 
     mBackground = appBarLayout.findViewById(R.id.background_view); 
     mBackgroundLayoutParams = (FrameLayout.LayoutParams) mBackground.getLayoutParams(); 

     setToolbarBackground(android.R.color.transparent); 
     setPartialBackgroundHeight(0); 

     isInit = true; 
    } 

    private boolean isDependencyYBelowToolbar(View child, View dependency){ 
     return dependency.getY() <= child.getY() + child.getHeight() && dependency.getY() > child.getY(); 
    } 

    private boolean isDependencyYBelowStatusToolbar(View child, View dependency){ 
     return dependency.getY() <= child.getY(); 
    } 

    private boolean isDependencyYReachTop(View dependency){ 
     return dependency.getY() == 0; 
    } 

    private void setPartialBackgroundHeight(int height){ 
     mBackgroundLayoutParams.height = height; 
     mBackground.setLayoutParams(mBackgroundLayoutParams); 
    } 

    private void setToolbarBackground(int color) { 
     mToolbar.setBackgroundColor(ContextCompat.getColor(mContext, color)); 
    } 
} 
+0

당신은 그것을 알아 냈습니까? – Anton

+0

아니요, 해결책이나 오류에 대해 찾지 못했습니다. 결국 레이아웃을 재구성하고 CoordinatorLayout.Behavior <>를 사용하여 종료했습니다. – user1840378

답변

0

GPRS 연결을 위해입니다. 난 그냥 활성 문제가 더 이상 내 XML 정말

app:layout_anchor="@id/list_view" 
1

하지에서이 줄을 제거하지만, 경우에 사람이 동일한 오류로 실행 : layout_anchors : 당신의 응용 프로그램을 확인합니다. 물론

<View 
    android:id="@+id/firstView" 
    app:layout_anchor="@+id/secondView" /> 

<View 
    android:id="@id/secondView" 
    app:layout_anchor="@id/firstView" /> 

실제 사건이 시작하기에 미끄러 방법이었다 조금 더 복잡 :이 비슷한 설정을했을 때

이 오류는 나를 위해가 발생했습니다. 어쨌든, 오류는 의존성 루프를 암시합니다.

+0

나를 위해 순환 종속성이없는 앵커가 존재하는 것일뿐입니다. 레이아웃보기에 높이와 여백을 사용하여 마무리되었습니다. –