繁体   English   中英

自定义视图未显示

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM