尝试为 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.widget包中的DatePicker PagerAdapter这样的Android类?