使用setcontentview两次

时间:2012-09-26 06:06:37

标签: android android-layout android-canvas paint bar-chart

我想实现类似结构的图表。

对于条形图,我正在使用否。按钮在我的主要活动中,因此输出如下:

screenshot


然后我正在创建扩展View的新类,以便使用画布绘制图形的x和y轴,如下所示:

public class Draw extends View {

Paint paint = new Paint();

public Draw(Context context) {
    super(context);
    paint.setColor(Color.BLACK);
  }

@Override
public void onDraw(Canvas canvas) {

    canvas.drawLine(20, 50, 20, 200, paint);
    canvas.drawLine(20, 200, 200, 200, paint);
  }
}

但问题是,在我的主要活动中使用以下代码行之后:

Draw draw = new Draw(this);
setContentView(draw);

当我再次设置ContentView时,我得到以下输出:

screenshot


所以我的问题是如何整合这两个视图以获得低于输出的结果:

screenshot

还有其他方法可以做同样的事吗?任何帮助都会得到回应。

修改

根据各种建议,我删除了

Draw draw = new Draw(this);
setContentView(draw);

来自我的活动类,而是将这些行放在主xml布局中。

<com.example.calci.Draw 
    android:id="@+id/draw" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" />

但我正在关注 EXCEPTION

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.calci/com.example.calci.CalciActivity}: android.view.InflateException: Binary XML file line #468: Error inflating class com.example.calci.Draw

Caused by: java.lang.NoSuchMethodException: Draw(Context,AttributeSet)
at java.lang.Class.getMatchingConstructor(Class.java:643)
at java.lang.Class.getConstructor(Class.java:472)
at android.view.LayoutInflater.createView(LayoutInflater.java:480)

编辑2

通过向构造函数添加AttributeSet attributeSet,我得到了所需的结果。

但任何人都可以建议我是否应该使用画布中的按钮或矩形来绘制条形图。

请注意,我需要根据seekbar值动态修改条形图的高度。

2 个答案:

答案 0 :(得分:4)

如果您使用xml进行条形图布局,则可以在此处包含新创建的视图:

<view
    class="your.package.name.ProjectName$NameOfYourClass" 
    id="@+id/draw"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

有关使用自定义组件的更多信息:http://developer.android.com/guide/topics/ui/custom-components.html

答案 1 :(得分:1)

要回答您的问题,您可以将Draw视图包含在与条形图布局相同的布局中,也可以放在FrameLayout中,并避免将内容视图设置两次。

然而,使用图表应用程序的按钮看起来更像是黑客。您可以考虑在Canvas上绘制条形图,就像绘制轴的方式一样。