M
miriki
Neues Mitglied
- 0
Moinsens!
Nachdem ich hier schon länger lesend im Forum unterwegs bin, hab ich mich jetzt mal angemeldet, um auch mal selbst eine Frage reinstellen zu können:
Ich versuche gerade, eine eigene Klasse zu erstellen, die von einer textView (genau genommen
AppCompatTextView) abgeleitet ist. Diese soll sich selbständig (z.Z. per Timer) aktualisieren. Leider geht .setText() nicht aus dem Widget heraus. Es kommt zum Fehler: "android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."
Also... Ich habe...
a) Eine "public class MainActivity extends AppCompatActivity" (API 19, soll noch auf meinem alten Note II laufen)
b) Eine "class MrkTextClockWidget extends AppCompatTextView"
In a) wird dann die textView erzeugt und gesetzt:
wird vom onCreate() aufgerufen:
In b) rufen die 3 Varianten des Constructor dann init() auf:
Und dann die eigentliche Routine, die das Widget aktualisieren soll:
Tja, aber wie im Betreff und eingangs beschrieben, klappt das so nicht. Und ich krieg einfach die Syntax nicht hin, wie es laufen soll. Im Web finde ich bislang nur Beispiele, wie eine Timer-textView im "main" läuft. Ich brauch das aber zwingend als eigene Klasse (und damit wohl auch eigenen Thread, soweit ich das verstanden habe). Diese textView Geschichte ist nur anfängliche Spielerei. Ich brauche später etwas aufwändigere Widgets, die so selbständig wir nur irgend möglich arbeiten. Ich will eigentlich im "main" nur noch das Widget setzen und ggf. ein paar Properties setzen, mich aber ansonsten nicht mehr drum kümmern müssen.
Hilft mir hier jemand auf die Sprünge? Ist ja vielleicht echt nur 'ne Kleinigkeit. Aber ich dreh mich hier langsam im Kreis.
Gruß, Michael
Nachdem ich hier schon länger lesend im Forum unterwegs bin, hab ich mich jetzt mal angemeldet, um auch mal selbst eine Frage reinstellen zu können:
Ich versuche gerade, eine eigene Klasse zu erstellen, die von einer textView (genau genommen
AppCompatTextView) abgeleitet ist. Diese soll sich selbständig (z.Z. per Timer) aktualisieren. Leider geht .setText() nicht aus dem Widget heraus. Es kommt zum Fehler: "android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."
Also... Ich habe...
a) Eine "public class MainActivity extends AppCompatActivity" (API 19, soll noch auf meinem alten Note II laufen)
b) Eine "class MrkTextClockWidget extends AppCompatTextView"
In a) wird dann die textView erzeugt und gesetzt:
Code:
private void createLayoutAndWidgets() {
LinearLayout ll;
LayoutParams lp;
MrkTextClockWidget t;
ll = new LinearLayout( this );
ll.setOrientation(LinearLayout.VERTICAL);
lp = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT );
ll.setLayoutParams( lp );
t = new MrkTextClockWidget( myContext );
lp = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT );
t.setLayoutParams( lp );
ll.addView( t );
setContentView( ll );
} // createLayoutAndWidgets
wird vom onCreate() aufgerufen:
Code:
@override
protected void onCreate( Bundle savedInstanceState ) {
super.onCreate(savedInstanceState);
myContext = getApplicationContext();
// displayMessage( "onCreate" );
createLayoutAndWidgets();
} // onCreate
In b) rufen die 3 Varianten des Constructor dann init() auf:
Code:
private void init() {
Calendar c;
Date n;
Timer t;
TimerTask tt;
Date ft;
long p;
t = new Timer();
c = Calendar.getInstance();
n = c.getTime();
tt = new TimerTask() {
@override
public void run() {
updateWidget();
}
};
ft = n;
p = 1000;
t.scheduleAtFixedRate( tt, ft, p );
} // init
Und dann die eigentliche Routine, die das Widget aktualisieren soll:
Code:
private void updateWidget() {
Calendar c;
Date n;
DateFormat f;
c = Calendar.getInstance();
n = c.getTime();
f = android.text.format.DateFormat.getDateFormat( myContext );
setText( f.format( n ));
}
Tja, aber wie im Betreff und eingangs beschrieben, klappt das so nicht. Und ich krieg einfach die Syntax nicht hin, wie es laufen soll. Im Web finde ich bislang nur Beispiele, wie eine Timer-textView im "main" läuft. Ich brauch das aber zwingend als eigene Klasse (und damit wohl auch eigenen Thread, soweit ich das verstanden habe). Diese textView Geschichte ist nur anfängliche Spielerei. Ich brauche später etwas aufwändigere Widgets, die so selbständig wir nur irgend möglich arbeiten. Ich will eigentlich im "main" nur noch das Widget setzen und ggf. ein paar Properties setzen, mich aber ansonsten nicht mehr drum kümmern müssen.
Hilft mir hier jemand auf die Sprünge? Ist ja vielleicht echt nur 'ne Kleinigkeit. Aber ich dreh mich hier langsam im Kreis.
Gruß, Michael
Zuletzt bearbeitet: