自定义视图不显示
我有一个自定义的视图类从视图扩展,我想在活动中使用它,但它不显示任何内容。它没有运行错误,但黑屏没有输出。我的代码如下:自定义视图不显示
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();
}
}
呼叫Activity
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中进行设置,但我不想那样做。谢谢
为什么它 - 你没有数据。你创建了一个线性布局和文本视图,但它们不是你的孩子。所以你没有任何数据可以绘制(并且无论如何都没有重写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文件中的*标记应该是一个标记,而不是布局
的任何ViewGroup,你可以请示例使用视图组。 – user606669 2013-02-19 17:12:28
伟大的作品。谢谢 – user606669 2013-02-19 17:26:09
也尝试设置textview的布局参数,因为您只声明父级线性布局的布局参数,而不是子级textview它不会得到高度和宽度。
首先创建的线性布局不会被添加到任何视图中。而且你也不能添加任何其他视图到简单的视图,因为它不是一个容器。你可以尝试扩展你的MoveableMenuLayout – Triode 2013-02-19 17:05:12