Android Switch покажет шоу в ViewGroup

Я хочу создать виджет как это:

изображение 1

Но то, что показано, это:

изображение 2

Почему это SwitchButton не отображается в 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);
   }
...

3 ответа

Решение

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

Может быть проще создать файл ресурсов для макета:

<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) это вторая фаза механизма разметки. (Первое измерение) https://developer.android.com/reference/android/view/ViewGroup.html, int, int, int)

Но в любом случае, вы можете попробовать позвонить View.requestLayout(), Вызывайте это, когда что-то изменилось, что сделало недействительным макет этого представления.
https://developer.android.com/reference/android/view/View.html

Единственная проблема в том, что по какой-то причине он не будет работать с 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();
        }
    });
}
Другие вопросы по тегам