Android的ViewGroup:我应该做的onLayout()重写?

扩展Android ViewGroup类时, onLayout()覆盖的目的是什么? 我正在Android中进行自定义控件,但由于某种原因,内容(子View对象)不显示。 我的方法是扩展ViewGroup类,通过ViewGroup的addView()方法添加子视图。 然后,在我的主要活动中,我有以下代码:

 ChannelController myCC = new ChannelController(this); setContentView(myCC); 

ChannelController是扩展ViewGroup的自定义类的名称。 我必须做错事,因为屏幕上没有显示任何内容。

我明白,我必须重写和实现onLayout()方法,但用什么? 我知道在dev.android网站上有一整个专门的页面,但是这对我来说并没有什么帮助,主要是因为我是一个新手。 任何有识之士将不胜感激。

作为参考,我的ViewGroup扩展如下所示:

 public class ChannelController extends ViewGroup { final String TAG = "JAL"; public ChannelController(Context c) { super(c); init(c); } public ChannelController(Context c, AttributeSet attibset) { super(c); init(c); } public ChannelController(Context c, AttributeSet attribset, int defStyle) { super(c); init(c); } public void init(Context c) { //RelativeLayout wrap = new RelativeLayout(c); RelativeLayout.LayoutParams wrapLP = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); RelativeLayout r1 = new RelativeLayout(c); RelativeLayout.LayoutParams r1LP = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); RelativeLayout r2 = new RelativeLayout(c); RelativeLayout.LayoutParams r2LP = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); TextView t = new TextView(c); RelativeLayout.LayoutParams tlp = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); Button m = new Button(c); RelativeLayout.LayoutParams mlp = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); Button s = new Button(c); RelativeLayout.LayoutParams slp = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); SeekBar f = new SeekBar(c); RelativeLayout.LayoutParams flp = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); t.setId(1); m.setId(2); s.setId(3); f.setId(4); r1.setId(5); r2.setId(6); t.setText("CHANNELNAME"); t.setTextColor(Color.BLACK); tlp.setMargins(30, 0, 0, 0); tlp.addRule(RelativeLayout.LEFT_OF, m.getId()); tlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); tlp.addRule(RelativeLayout.CENTER_VERTICAL); tlp.addRule(RelativeLayout.CENTER_HORIZONTAL); m.setText("M"); m.setBackgroundColor(Color.rgb(237, 155, 31)); m.setTextColor(Color.WHITE); mlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); mlp.addRule(RelativeLayout.ALIGN_PARENT_TOP); m.setTextSize(10); flp.addRule(RelativeLayout.LEFT_OF, s.getId()); flp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); flp.addRule(RelativeLayout.CENTER_VERTICAL); s.setText("S"); s.setTextSize(10); s.setBackgroundColor(Color.rgb(192, 48, 46)); s.setTextColor(Color.WHITE); slp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); slp.addRule(RelativeLayout.ALIGN_PARENT_TOP); r1.addView(t, tlp); r1.addView(m, mlp); r2.addView(f, flp); r2.addView(s, slp); r1.setBackgroundColor(Color.rgb(233, 242, 251)); r2.setBackgroundColor(Color.rgb(233, 242, 251)); r1LP.addRule(RelativeLayout.ALIGN_PARENT_TOP); r2LP.addRule(RelativeLayout.BELOW, r1.getId()); this.addView(r1, r1LP); this.addView(r2, r2LP); this.setLayoutParams(wrapLP); //this.addView(wrap); Log.i(TAG, "ChannelController constructor was called"); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub //super.onLayout(changed, l, t, r, b); } } 

我需要在onLayout方法重写中做什么?

Solutions Collecting From Web of "Android的ViewGroup:我应该做的onLayout()重写?"

onLayout您需要调用此ViewGroup每个子项的layout方法,并为它们提供期望的位置(相对于父项)。 您可以检查FrameLayout源代码( ViewGroup的最简单的子类之一),以了解它是如何工作的。

虽然,如果你不需要任何“特殊”的布局,你有其他的select:

  • 扩展一些ViewGroup另一个子类(例如FrameLayout
  • 使用LayoutInflater如果你只是需要你的控制看起来完全一样的XML(我认为,这正是你的情况)