我想创建一个这样的小部件:
但是,显示的是:
为什么此Switch
Button
无法在ViewGroup
中显示:
在这种情况下,只显示Switch
的文字"hello"
。
public class TestView extends ViewGroup {
...
private void init() {
imageView = new ImageView(getContext());
imageView.setImageResource(R.drawable.clock_icon);
aSwitch = new Switch(getContext());
aSwitch.setText("hello");
aSwitch.setChecked(true);
addView(imageView);
addView(aSwitch);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
imageView.layout(0, 50,100, 70);
aSwitch.layout(50,50,100,70);
}
...
答案 0 :(得分:0)
为布局创建资源文件可能更容易:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/clock_icon"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
android:checked="true"/>
</LinearLayout>
然后在需要时以编程方式对其进行充气:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.your_resource_file, container, false);
}
答案 1 :(得分:0)
我不确定ViewGroup.layout(int l, int t, int r, int b)
是否正确定义视图的大小和位置,因为此方法只是绘图视图整体流程的一部分:
ViewGroup.layout(int l, int t, int r, int b)
是布局机制的第二阶段。 (首先是测量) https://developer.android.com/reference/android/view/ViewGroup.html#layout(int,int,int,int)
但无论如何,您可以尝试拨打View.requestLayout()
。当某些内容发生变化而导致此视图的布局无效时,请调用此方法
https://developer.android.com/reference/android/view/View.html#requestLayout()
唯一的问题是,出于某种原因,它不会在View.onSizeChanged(int w, int h, int oldw, int oldh)
起作用,因此您必须执行以下操作:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
imageView.layout(0, 50,100, 70);
aSwitch.layout(50,50,100,70);
post(new Runnable() {
@Override
public void run() {
imageView.requestLayout();
aSwitch.requestLayout();
}
});
}
答案 2 :(得分:0)
tnx @Gugalo我用你的描述解决了这个问题。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
aSwitch.measure(w,h);
aSwitch.layout(0, 0, aSwitch.getMeasuredWidth(), aSwitch.getMeasuredHeight());
}