这应该很容易做到,但是经过大约15分钟的搜索,我仍然无法得到答案:
我想制作一个结合了TextView和Button的自定义Android视图,以及一些自定义的行为/方法,让我们说当我点击按钮时它应该将TextView更改为“Hello,world!”。
我知道我必须扩展View类,并在XML中设计布局,然后做一些魔术来链接这两者。你能告诉我魔术是什么吗?我知道如何在Activity中执行此操作,但不在自定义视图中执行此操作。
EDITED 的 好的,所以我发现我需要使用Inflater来通过布局中定义的子视图来扩充我的类。这就是我得到的:
public class MyView extends View {
private TextView text;
private Button button;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
View.inflate(context, R.layout.myview, null);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
text = (TextView) findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
}
}
但是,text
和button
子视图为空。任何的想法? (XML非常简单,没有任何花哨的编辑,我只是从eclipse工具栏中抓取一个TextView和一个Button并投入。)
答案 0 :(得分:7)
好的,所以我自己的问题的答案是:(i)去吃晚餐,(ii)延长LinearLayout
而不是View
,这使它成为ViewGroup
因此可以要传递到inflate(...)
方法,但不必覆盖onLayout(...)
方法。更新后的代码为:
public class MyView extends LinearLayout {
private TextView text;
private Button button;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
View.inflate(context, R.layout.myview, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
text = (TextView) findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
}
}