自定义视图未显示

时间:2013-02-19 17:01:27

标签: android android-layout

我有一个从视图扩展的自定义视图类,我想在一个活动中使用它,但它没有显示任何内容。没有错误它运行但黑屏没有输出。我的代码如下:

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中设置它,但我不想这样做。谢谢

2 个答案:

答案 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的布局参数,因为你只是声明父线性布局的布局参数,而不是子文本视图,它不会得到高度和宽度。