2013-02-19 120 views
0

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

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

+0

首先创建的线性布局不会被添加到任何视图中。而且你也不能添加任何其他视图到简单的视图,因为它不是一个容器。你可以尝试扩展你的MoveableMenuLayout – Triode 2013-02-19 17:05:12

回答

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文件中的顶级标记应该是一个标记,而不是布局

+0

的任何ViewGroup,你可以请示例使用视图组。 – user606669 2013-02-19 17:12:28

+0

伟大的作品。谢谢 – user606669 2013-02-19 17:26:09

0

也尝试设置textview的布局参数,因为您只声明父级线性布局的布局参数,而不是子级textview它不会得到高度和宽度。