2016-05-07 3 views
2

So verwende ich MPAndroidChart LineCharts, die in XML bedeutet, definiere ich es so:Der Versuch, in Android eine abgeleitete Klasse für eine bereits bestehende Klasse zu machen

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

Jedoch habe ich diese Grafik zu verwenden, ich versuche mit verschiedenen Standardeinstellungen und so weiter, so dass ich eine benutzerdefinierte Klasse gemacht, um zu versuchen, sie zu verlängern:

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

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

und so an anderer Stelle in meinem Code, wenn ich es verwenden will, ich habe:

private MyLineChart mChart; 

... 

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

Und alles scheint gut zu kompilieren, aber dann wirft es einen Laufzeitfehler, weil es besagt, dass ich das LineChart nicht in MyLineChart konvertieren kann.

+1

Sie haben – Stefan

+0

Sie ist zeigen, was zu MyLineChart in Ihrem xml verwenden nicht „Wrapping“, es ist "erweitern". Und 'LineChart' kann nicht in' MyLineChart' umgewandelt werden, da ersteres keine Unterklasse des letzteren ist. 'MyLineChart' könnte in' LineChart' umgewandelt werden, aber nicht umgekehrt. –

+0

Ich versuchte MyLineChart in der XML (com.mypackagename.appname.MyLineChart), aber dann hatte ich einen inflationierenden Fehler beim Versuch, das Aktivitätslayout aufzublasen – user6183183

Antwort

1

es möglich, mit MyLineChart in xml zu machen, Sie zwei weitere Konstrukteure dort definieren müssen, wie:

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; 
    } 

    // ... 
} 
+0

Warum sind diese drei Konstruktoren? erforderlich? Werden sie für jede Klasse benötigt, die als XML-View enthalten sein soll? – user6183183

+0

Attribute zu injizieren als 'android: id = ... ',' android: layout_width = ... 'usw. –

+0

Schnelle Frage: Bedeutet dies auch, dass ich keine weiteren Argumente außer dem Kontext übergeben kann? Wie wäre es, wenn ich andere Variablen übergeben möchte (zum Beispiel ein Fragment-Argument oder ein Textview-Argument). – user6183183