[英]Custom view not showing up
我有一个从视图扩展的自定义视图类,我想在一个活动中使用它,但是它什么也没显示。 它没有错误运行,但黑屏无输出。 我的代码如下:
public class MoveableMenuLayout extends View {
public MoveableMenuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LinearLayout ll = new LinearLayout(context);
ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
TextView tv = new TextView(context);
tv.setText("TES_______________");
ll.addView(tv);
this.invalidate();
this.requestLayout();
}
public MoveableMenuLayout(Context context) {
super(context);
LinearLayout ll = new LinearLayout(context);
ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
TextView tv = new TextView(context);
tv.setText("TES_______________");
ll.addView(tv);
this.invalidate();
this.requestLayout();
}
}
通话活动
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MoveableMenuLayout layout = new MoveableMenuLayout(this);
setContentView(layout);
}
}
我已经尝试通过将其包括在xml布局中来进行尝试,但仍然没有输出。 我不确定自己在做什么错。 我不想更改样式,使其成为一个单独的类,我知道我可以使用xml布局并直接在Activity中使用setcontentview对其进行设置,但我不想这样做。 谢谢
为什么-您没有数据。 您创建了线性布局和文本视图,但它们不是您的孩子。 因此,您没有要绘制的数据(也没有覆盖onDraw)。
如果要创建包含一组其他视图的自定义视图,则需要派生自ViewGroup,而不是View。 您还需要将顶级子视图添加为子级,而不仅仅是将其作为数据成员。 您甚至最好直接从LienarLayout或RelativeLayout派生,并直接从xml扩展子级。
public class MoveableMenuLayout extends ViewGroup {
public MoveableMenuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LinearLayout ll = new LinearLayout(context);
ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
TextView tv = new TextView(context);
tv.setText("TES_______________");
ll.addView(tv);
addView(ll);
}
public MoveableMenuLayout(Context context) {
super(context);
LinearLayout ll = new LinearLayout(context);
ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
TextView tv = new TextView(context);
tv.setText("TES_______________");
ll.addView(tv);
addView(ll);
}
}
可能会工作。 您可以通过从LinearLayout派生而将其绝对升级。 然后,您不需要内部布局。 像这样:
public class MoveableMenuLayout extends LinearLayout {
public MoveableMenuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TextView tv = new TextView(context);
tv.setText("TES_______________");
addView(tv);
}
public MoveableMenuLayout(Context context) {
super(context);
TextView tv = new TextView(context);
tv.setText("TES_______________");
addView(tv);
}
}
更好的方法是通过xml来实现
public class MoveableMenuLayout extends LinearLayout {
public MoveableMenuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate( ourlayoutid, this );
}
public MoveableMenuLayout(Context context) {
super(context);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate( ourlayoutid, this );
}
}
然后将所需的子级放在xml文件中。 在这种情况下,xml文件中的顶级标签应该是标签,而不是布局
还尝试为textview设置布局参数,因为您仅声明父线性布局而不是子textview的布局参数,因此不会获得高度和宽度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.