gpt4 book ai didi

Android ViewGroup : what should I do in the onLayout() override?

转载 作者:IT老高 更新时间:2023-10-28 22:02:13 27 4
gpt4 key购买 nike

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

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 方法覆盖中我需要做什么?

最佳答案

onLayout 中,您需要在此 ViewGroup 的每个子级上调用 layout 方法,并为它们提供所需的位置(相对于父级)。您可以查看 FrameLayout(ViewGroup 的最简单子(monad)类之一)的源代码以了解其工作原理。

虽然,如果您不需要任何“特殊”布局,您还有其他选择:

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

关于Android ViewGroup : what should I do in the onLayout() override?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515798/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com