Android Switch 没有显示在 ViewGroup 中

Android Switch dosent show in ViewGroup

我想创建一个像这样的小部件:

image 1

但是,显示的是这样的:

image 2

为什么 Switch ButtonViewGroup 中不显示:

在这种情况下,只显示 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);
   }
...

为布局创建资源文件可能更容易:

<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);
}

我不确定 ViewGroup.layout(int l, int t, int r, int b) 是定义视图大小和位置的正确方法,因为此方法只是绘图视图整体流程的一部分:

ViewGroup.layout(int l, int t, int r, int b) is the second phase of the layout mechanism. (The first is measuring) 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();
        }
    });
}

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());
    }