【问题标题】:Trying to make an extending class for a pre-existing class in Android尝试为 Android 中的现有类创建扩展类
【发布时间】:2016-09-02 16:26:02
【问题描述】:

所以我使用的是 MPAndroidChart LineCharts,这意味着在 XML 中我是这样定义的:

<com.github.mikephil.charting.charts.LineChart
    android:id="@+id/line_chart"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

但是我正在尝试使用各种默认设置等来使用此图表,所以我创建了一个自定义类来尝试扩展它:

public class MyLineChart extends com.github.mikephil.charting.charts.LineChart {
    private Context mContext;

    public MyLineChart(Context context) {
        super(context);
        mContext = context;
    }
    //...

所以当我想在我的代码的其他地方使用它时,我有:

private MyLineChart mChart;

...

mChart = new MyLineChart(getActivity());
mChart = (MyLineChart) findViewById(R.id.line_chart);

这一切似乎都可以正常编译,但随后会引发运行时错误,因为它说我无法将 LineChart 转换为 MyLineChart。

【问题讨论】:

  • 你也必须在你的 xml 中使用 MyLineChart
  • 您显示的不是“包装”,而是“扩展”。并且LineChart 不能转换为MyLineChart,因为前者不是后者的子类。 MyLineChart 可以转换为 LineChart,但反之则不行。
  • 我尝试在 XML (com.mypackagename.appname.MyLineChart) 中使用 MyLineChart,但在尝试为活动布局充气时出现充气错误
  • @SashaSalauyou 我改用了extend而不是wrap
  • 你能添加那个错误吗?因为那是你应该这样做的方式。顺便说一句,为什么要创建两次,第二次分配(findViewById)应该足够了。

标签: java android xml android-activity mpandroidchart


【解决方案1】:

要在 xml 中使用 MyLineChart 成为可能,您需要在此处再定义两个构造函数,例如:

public class MyLineChart extends com.github.mikephil.charting.charts.LineChart {
    private Context mContext;

    public MyLineChart(Context context) {
        super(context);
        mContext = context;
    }

    public MyLineChart(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    public LineChart(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
    }

    // ...
}

【讨论】:

  • 为什么需要这三个构造函数?任何可作为 XML 视图包含的类都需要它们吗?
  • 注入作为android:id=...android:layout_width=...等传递的属性
  • 快速问题:这是否也意味着我不能传入除上下文之外的任何额外参数?就像我想传入一些其他变量(例如 Fragment 参数或 Textview 参数)。
  • @user6183183 当然,您可以根据需要定义任意数量的其他构造函数,并使用它们以编程方式创建视图。这三个是从xml布局描述创建它所必需的。
  • 但是怎么做呢?如果我已经在做mChart = findViewById(R.id.line_chart); 那么这不是已经有效地调用了构造函数吗?我如何也发送一个额外的论点?
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 2013-09-12
  • 2016-04-20
  • 2017-06-15
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多