Android Switch покажет шоу в ViewGroup
Я хочу создать виджет как это:
Но то, что показано, это:
Почему это 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);
}
...
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();
}
});
}