Android Switch 没有显示在 ViewGroup 中
Android Switch dosent show in ViewGroup
我想创建一个像这样的小部件:
image 1
但是,显示的是这样的:
image 2
为什么 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);
}
...
为布局创建资源文件可能更容易:
<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());
}
我想创建一个像这样的小部件:
image 1
但是,显示的是这样的:
image 2
为什么 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);
}
...
为布局创建资源文件可能更容易:
<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());
}