Hinzufügen einer benutzerdefinierten Ansicht als Ansicht von XML-layout
Das Szenario ist das folgende:
Habe ich eine Tätigkeit RunTrainingWorkoutsView mit XML-layout _run_workout.xml_ mit einigen labels, die aktualisiert werden CountDownTimer. Funktioniert einwandfrei...
Nun, abgesehen von den Etiketten, die aktualisiert werden jede sec von onTick() callback-Methode des Countdown-Timers Objekt möchte ich hinzufügen, um eine benutzerdefinierte Oberfläche Blick auf meine _run_workout.xml layout_, dass würde ziehen einige Bögen aktualisiert, die von den gleichen onTick() Methode jede Sekunde...
meine run_workout.xml:
<training.timer.CounterClockView
android:id="@+id/counter_clock_surface"
android:layout_width="300dp"
android:layout_height="240dp">
</training.timer.CounterClockView>
Meine benutzerdefinierte Ansicht erweitert surfaceView
public class CounterClockView extends SurfaceView {
Paint paint = new Paint();
Paint paint2 = new Paint();
final RectF rect = new RectF();
final RectF rect2 = new RectF();
int counterArcAngle = 15;
//constructor
public CounterClockView(Context context, AttributeSet attributeSet) {
super(context);
//setting some paint properties...
this.setBackgroundColor(Color.TRANSPARENT);
}
@Override
public void onDraw(Canvas canvas) {
rect.set(50, 50, 150, 150);
rect2.set(50, 50, 150, 150);
this.layout(0, 0, 200, 200);
canvas.drawArc(rect, -90, 360, false, paint);
canvas.drawArc(rect2, -90, counterArcAngle, false, paint2);
}
Meine main-Klasse erweitert Aktivität ist immer der Verweis auf eine benutzerdefinierte surfaceView im layout mit dem folgenden code:
//counterClockView is declared outside of onCreate() as CounterClockView counterClockView;
//later in onCreate(){....
counterClockView = (CounterClockView) findViewById(R.id.counter_clock_surface);
Das problem ist, und ändern Sie den Wert der member-Variablen der customView Objekt (counterClockView)
counterClockView.counterArcAngle = 10;
Absturz der app...
Auch von meinem Haupt-Aktivität, die ich nennen möchte invalidate () - Methode zum wiederholen der Oberfläche Ansicht nach ändern der counterArcAngle Wert, aber dieser verursacht die app zum Absturz zu...
Warum nicht erstellen kann counterClockView Objekt und Referenz zu einem xml-layout-element des gleichen Typs und die ändern Ihr Gewand, dass es ungültig ist usw. ?
BEARBEITEN LogCat:
threadid=1: thread exiting with uncaught exception (group=0x40015560)
ERROR/AndroidRuntime(487): FATAL EXCEPTION: main
ERROR/AndroidRuntime(487): java.lang.RuntimeException: Unable to start activity ComponentInfo{training.timer/training.timer.RunTrainingWorkoutsView}: java.lang.NullPointerException
ERROR/AndroidRuntime(487): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
ERROR/AndroidRuntime(487): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
ERROR/AndroidRuntime(487): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(487): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.main(ActivityThread.java:3683)
ERROR/AndroidRuntime(487): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(487): at java.lang.reflect.Method.invoke(Method.java:507)
ERROR/AndroidRuntime(487): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
ERROR/AndroidRuntime(487): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
ERROR/AndroidRuntime(487): at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(487): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(487): at training.timer.RunTrainingWorkoutsView.onCreate(RunTrainingWorkoutsView.java:72)
ERROR/AndroidRuntime(487): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
ERROR/AndroidRuntime(487): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
ERROR/AndroidRuntime(487): ... 11 more
LogCat
Ich habe den log. danke...
RunTrainingWorkoutsView.onCreate()
bei dieser Methode, Linie 72 in dieser Datei RunTrainingWorkoutsView.java
, ein Objekt wird NULL
. Check it out!Gut, das ist die Frage... Wenn ich einen hätte:TextView txt = (TextView) findViewById(...) wäre es nicht NULL, so ist die Frage, warum ist meine benutzerdefinierte Ansicht (surfaceView) NULL???
InformationsquelleAutor luigi7up | 2011-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hab es nach 3 Tagen schlug meinen Kopf gegen die Wand und durch googeln, stacOverflowing etc.
Tatsächlich, es war diese dumme kleine Sache...
Meine XML-Datei, wo ich das layout mit einigen üblichen android-Ansichten (textView und Tasten nämlich) und meine benutzerdefinierte Ansicht CounterClockView, die ich hatte:
hatte wo ich jetzt eine weitere Zeile!
Ich habe keine Ahnung, warum das namespace-Zeile gemacht, so einen großen Unterschied, aber es funktioniert Super!
Jetzt kann ich update meine eigene Ansicht aus meiner Haupttätigkeit auf jeden onTick() von Countdown-Timers()...
Folgende Antwort war sehr hilfreich:
findViewById() gibt null zurück, für die benutzerdefinierte Komponente im layout-XML, nicht für andere Komponenten
InformationsquelleAutor luigi7up
Hatte das gleiche Problem, also habe ich Sie einfach umgesetzt alle drei Konstruktoren, die in der Java-Klasse meiner benutzerdefinierten Ansicht werden alle drei Konstruktoren plus onDrow Methode und es funktionierte wie ein Charme. Versuchen Sie es.
XML :
InformationsquelleAutor daniel kilinskas