Android異常:RelativeLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams

9488 ワード

プロジェクト開発で異常に遭遇したのはおかしいです.この異常が発生すると頭が痛くなります.ダッシュログから役に立つ情報がほとんど見つからないからです.例えば、これ:
java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
                                                                    at android.widget.LinearLayout.measureVertical(LinearLayout.java:720)
                                                                    at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                                                                    at android.view.View.measure(View.java:20171)
                                                                    at android.widget.ListView.setupChild(ListView.java:2031)
                                                                    at android.widget.ListView.makeAndAddView(ListView.java:1950)
                                                                    at android.widget.ListView.fillSpecific(ListView.java:1379)
                                                                    at android.widget.ListView.layoutChildren(ListView.java:1746)
                                                                    at android.widget.AbsListView.onLayout(AbsListView.java:2723)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:630)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742)
                                                                    at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1731)
                                                                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1496)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                    at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742)
                                                                    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                    at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1742)
                                                                    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
                                                                    at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:344)
                                                                    at android.widget.FrameLayout.onLayout(FrameLayout.java:281)
                                                                    at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:3178)
                                                                    at android.view.View.layout(View.java:17945)
                                                                    at android.view.ViewGroup.layout(ViewGroup.java:5812)
                                                                    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2716)
                                                                    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2417)
                                                                    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1487)
                                                                    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7450)
                                                                    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
                                                                    at android.view.Choreographer.doCallbacks(Choreographer.java:695)
                                                                    at android.view.Choreographer.doFrame(Choreographer.java:631)
                                                                    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
                                                                    at android.os.Handler.handleCallback(Handler.java:739)
                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                    at android.os.Looper.loop(Looper.java:158)
                                                                    at android.app.ActivityThread.main(ActivityThread.java:7225)
                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

logからこの異常を見ると、情報には似たようなcause by情報が報告されず、プロジェクトに異常が現れるどのコードも見つからない.ログにndroidが表示されるので、ソースコードのlistViewのコードをクリックするかもしれません.widget.ListViewのような情報は、振り回されても何の役にも立たない.どうすればいいのだろうか.
この时、私は异常発生前后のコードを分析して、异常発生前后の変更のレイアウトファイルを分析して、もちろんListView付近の変更コードも分析します.このような異常は、
最初はRelativeLayoutに入れてOkを実行し、このViewをLinearLayoutに入れて単独でlayoutとして提出した後、ListViewのaddHeaderメソッドを呼び出してこのlayout Addを入れたので、上記のエラーが発生しました.
最初はListViewを分析しても何の原因も分析されず、後にViewが最初はRelativeLayoutの子Viewで、後にViewがLinearLayoutの子Viewとして上の異常が現れた.ここまで異常の原因を理解していないで、それからコードを分析して、結果はこのような1段を見ます
 RelativeLayout.LayoutParams gallery_lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height);
 slider.setLayoutParams(gallery_lp);
Viewとはsliderのことで、急に悟った.そして私は上記のコードを以下のように変更して、異常はなくなりました.
LinearLayout.LayoutParams gallery_lp = new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height);
slider.setLayoutParams(gallery_lp);
理由はsliderの後にLinearLayoutの子Viewとして、そのLayoutparamsはその父ViewのLayoutParamsであるため、sliderのLayoutParamsをRelativeLayout$LayoutParamsからLinearLayout$LayoutParamsに変更すべきである.
これを書く理由は、このような間違いに遭遇したのは、このいくつかのステップから問題を解決しなければならないからだと自分に伝えることです.
  • 基本的な位置決め異常が発生したコード行数、分析...
  • コードがロールバックし、分析コードと比較して原因を探す
  • 異常前後の変更を分析するLayoutファイル
  • は、コードにおける変更されたViewの呼び出しを分析する
  • である.
    これらの総括もみんなに助けをもたらすことができることを望んで、ありがとうございます!