View, ViewGroup, widget, LinearLayout等layout

本文深入解析Android UI组件中的View、ViewGroup、widget及layout之间的关系,详细介绍了它们的功能和作用,帮助开发者更好地理解和使用Android UI开发。

入门级的基础知识,以前对View,VIewGroup,widget,layout等的关系搞不清楚,通过学习后,做了下总结,如下:

1.View,ViewGroup

>View:

}1、所有高级UI组件都继承View类而实现的
}2、一个View在屏幕上占据一块矩形区域
}3、 负责渲染
}4、负责处理发生的事件
}5、设置是否可见
}6、设置是否可以获得焦点等
 
2.ViewGroup:
}1、一个ViewGroup对象是一Android.view.ViewGroup实例
}2、View的容器
}3、 负责对添加进ViewGroup的View进行布局
}4、一个ViewGroup可以加入到另一个ViewGroup
 
3.View ,ViewGroup的关系
 

4.View,widgetView的继承关系

2.widget

}1、界面中展示的各个小组件
}2、有独立的事件处理能力
}3、所有Wiget组件都是继承View而来
注:1.widget并不是实际存在的类,它是一个包,而VIew等就是实际存在的类,所以首字母大写。在引用时,通常:

          import android.view.View;

          import android.widget.TextView;

         因为widget是包,所以首字母小写

        2.在该包内放的是UI Elements,包括TextView,ListView,但是这些元素都继承自View或ViewGroup。如下图所示:

 

 

 

其中各种layout继承自ViewGroup

4 layout

对UI 组件进行布局

 关于view及其子类的关系如下:

Process: com.mutangtech.qianji, PID: 17947 java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference at qe.d.m(SourceFile:21) at qe.d.l(SourceFile:27) at qe.l.onBindOtherViewHolder(SourceFile:11) at hh.c.onBindViewHolder(SourceFile:9) at hh.c.onBindViewHolder(SourceFile:1) at androidx.recyclerview.widget.RecyclerView$h.onBindViewHolder(SourceFile:1) at androidx.recyclerview.widget.RecyclerView$h.bindViewHolder(SourceFile:155) at androidx.recyclerview.widget.l.d(SourceFile:3) at androidx.recyclerview.widget.d.w(SourceFile:16) at androidx.recyclerview.widget.c.onBindViewHolder(SourceFile:3) at androidx.recyclerview.widget.RecyclerView$h.onBindViewHolder(SourceFile:1) at androidx.recyclerview.widget.RecyclerView$h.bindViewHolder(SourceFile:155) at androidx.recyclerview.widget.RecyclerView$v.M(SourceFile:67) at androidx.recyclerview.widget.RecyclerView$v.N(SourceFile:453) at androidx.recyclerview.widget.RecyclerView$v.p(SourceFile:6) at androidx.recyclerview.widget.RecyclerView$v.o(SourceFile:2) at androidx.recyclerview.widget.LinearLayoutManager$c.d(SourceFile:12) at androidx.recyclerview.widget.LinearLayoutManager.j0(SourceFile:1) at androidx.recyclerview.widget.LinearLayoutManager.T(SourceFile:39) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(SourceFile:358) at com.swordbearer.free2017.view.recyclerview.FixedLinearLayoutManager.onLayoutChildren(SourceFile:1) at androidx.recyclerview.widget.RecyclerView.F(SourceFile:67) at androidx.recyclerview.widget.RecyclerView.D(SourceFile:60) at androidx.recyclerview.widget.RecyclerView.onLayout(SourceFile:6) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at androidx.swiperefreshlayout.widget.SwipeRefreshLayout.onLayout(SourceFile:59) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at androidx.coordinatorlayout.widget.CoordinatorLayout.G(SourceFile:142) at androidx.coordinatorlayout.widget.CoordinatorLayout.M(SourceFile:29) at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(SourceFile:49) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at androidx.viewpager.widget.ViewPager.onLayout(SourceFile:259) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at com.swordbearer.free2017.view.slidemenu.QSlidingPaneLayout.onLayout(SourceFile:201) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1906) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729) at android.widget.LinearLayout.onLayout(LinearLayout.java:1638) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1906) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729) at android.widget.LinearLayout.onLayout(LinearLayout.java:1638) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.android.internal.policy.DecorView.onLayout(DecorView.java:878) at android.view.View.layout(View.java:26228) 08-25 18:25:10.739977 17947 17947 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:5738) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4792) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3508) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11927) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1813) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1822) at android.view.Choreographer.doCallbacks(Choreographer.java:1340) at android.view.Choreographer.doFrame(Choreographer.java:1226) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1796) at android.os.Handler.handleCallback(Handler.java:1027) at android.os.Handler.dispatchMessage(Handler.java:108) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9952) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074)
08-30
FATAL EXCEPTION: main Process: person.tools.treasurebox, PID: 8622 android.view.InflateException: Binary XML file line #38: person.tools.treasurebox.customview.widget.CustomizeTextView cannot be cast to android.view.ViewGroup Caused by: java.lang.ClassCastException: person.tools.treasurebox.customview.widget.CustomizeTextView cannot be cast to android.view.ViewGroup at android.view.LayoutInflater.rInflate(LayoutInflater.java:885) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:845) at android.view.LayoutInflater.rInflate(LayoutInflater.java:887) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:845) at android.view.LayoutInflater.rInflate(LayoutInflater.java:887) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:845) at android.view.LayoutInflater.inflate(LayoutInflater.java:519) at android.view.LayoutInflater.inflate(LayoutInflater.java:427) at person.tools.treasurebox.customview.adapter.StockAdapter.onCreateViewHolder(StockAdapter.java:49) at person.tools.treasurebox.customview.adapter.StockAdapter.onCreateViewHolder(StockAdapter.java:25) at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7295) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6416) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309) at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3686) at android.view.View.measure(View.java:23386) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) at android.widget.LinearLayout.measureVertical(LinearLayout.java:825) at android.widget.LinearLayout.onMeasure(LinearLayout.java:704) at android.view.View.measure(View.java:23386) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145) at android.view.View.measure(View.java:23386) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) at android.widget.LinearLayout.measureVertical(LinearLayout.java:825) at android.widget.LinearLayout.onMeasure(LinearLayout.java:704) at android.view.View.measure(View.java:23386) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:23386) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) at android.widget.LinearLayout.measureVertical(LinearLayout.java:825) at android.widget.LinearLayout.onMeasure(LinearLayout.java:704) at android.view.View.measure(View.java:23386) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721) at android.view.View.measure(View.java:23386) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2914) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1706) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2001) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1594) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7661) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1047) at android.view.Choreographer.doCallbacks(Choreographer.java:843) at android.view.Choreographer.doFrame(Choreographer.java:771) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1033) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:201) at android.app.ActivityThread.main(ActivityThread.java:6820) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922) Sending signal. PID: 8622 SIG: 9 ---------------------------- PROCESS ENDED (8622) for package person.tools.treasurebox ---------------------------- ---------------------------- PROCESS STARTED (8704) for package person.tools.treasurebox ---------------------------- 错误分析
10-30
11-19 19:35:49.268050 23193 23193 W Resources: Drawable com.baidu.tieba:drawable/bg_vote_list_bottom has unresolved theme attributes! Consider using Resources.getDrawable(int, Theme) or Context.getDrawable(int). java.lang.RuntimeException at android.content.res.Resources.getDrawable(Resources.java:958) at com.baidu.tbadk.core.util.SkinManager.getDrawable(SourceFile:125019) at com.baidu.tbadk.core.util.SkinManager.setBackgroundResource(SourceFile:180025) at com.baidu.tbadk.core.util.SkinManager.setBackgroundResource(SourceFile:125012) at com.baidu.tbadk.core.view.VoteView.H(SourceFile:150087) at com.baidu.tieba.soc.g0(SourceFile:210125) at com.baidu.tieba.soc.P(SourceFile:180033) at com.baidu.tieba.soc.onCreateViewHolder(SourceFile:110000) at com.baidu.tieba.ti.onCreateViewHolder(SourceFile:135004) at com.baidu.tieba.ti.getView(SourceFile:130010) at com.baidu.adp.widget.ListView.TypeAdapter.getView(SourceFile:130045) at com.baidu.tieba.xi.getView(SourceFile:135042) at android.widget.AbsListView.obtainView(AbsListView.java:2492) at android.widget.ListView.makeAndAddView(ListView.java:2065) at android.widget.ListView.fillDown(ListView.java:791) at android.widget.ListView.fillSpecific(ListView.java:1502) at android.widget.ListView.layoutChildren(ListView.java:1813) at com.baidu.adp.widget.ListView.BdListView.layoutChildren(SourceFile:125004) at android.widget.AbsListView.onLayout(AbsListView.java:2284) at com.baidu.adp.widget.ListView.BdListView.onLayout(SourceFile:160008) at com.baidu.tieba.pb.pb.main.PbLandscapeListView.onLayout(SourceFile:155004) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1103) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1906) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729) at android.widget.LinearLayout.onLayout(LinearLayout.java:1638) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.baidu.adp.widget.SwipeBackLayout.onLayout(SourceFile:155004) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.android.internal.policy.DecorView.onLayout(DecorView.java:879) at android.view.View.layout(View.java:26228) at android.view.ViewGroup.layout(ViewGroup.java:6627) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:5759) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4813) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3519) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11951) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1852) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1861) at android.view.Choreographer.doCallbacks(Choreographer.java:1373) at android.view.Choreographer.doFrame(Choreographer.java:1230)
最新发布
11-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值