尝试为 Android 中的现有类创建扩展类

Posted

技术标签:

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

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

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

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

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)应该足够了。 【参考方案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); 那么这不是已经有效地调用了构造函数吗?我如何也发送一个额外的论点?

以上是关于尝试为 Android 中的现有类创建扩展类的主要内容,如果未能解决你的问题,请参考以下文章

从现有源创建android项目后缺少R类[重复]

向其他文件中的现有 C++ 类添加方法

你如何扩展像Android.widget包中的DatePicker PagerAdapter这样的Android类?

通用扩展类 AND 在 Kotlin 中实现接口

如何使用 android 中的 SQLite 扩展类在数据库中插入值?

如何在现有 UIKit 类(如 UIColor)的扩展中添加初始化程序?