我有一个从视图扩展的自定义视图类,我想在一个活动中使用它,但它没有显示任何内容。没有错误它运行但黑屏没有输出。我的代码如下:
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布局并使用setcontentview直接在Activity中设置它,但我不想这样做。谢谢
答案 0 :(得分:1)
为什么你没有数据?您创建了线性布局和文本视图,但它们不是您的孩子。所以你没有数据可以绘制(并且还没有覆盖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文件中的顶级标记应该是标记,而不是布局
答案 1 :(得分:0)
尝试设置textview的布局参数,因为你只是声明父线性布局的布局参数,而不是子文本视图,它不会得到高度和宽度。