Array Items in einziger textView rotieren lassen

  • 8 Antworten
  • Letztes Antwortdatum
D

Dawg

Neues Mitglied
0
Guten Tag Droidianer,

zuerst einmal ich bin neu hier und jetzt schon total begeistert :biggrin:.

Nun zu meinem Problem ich habe ein Array(String-Array) welches in der Arrays.xml mit items "gefüllt" ist.
Ich möchte das man mit 2 Buttons zum nächsten und davorigen ArrayItem wechseln kann. Wenn das letzte Item erreich ist soll wieder zum Item nr. 0 gewechselt werden und anders rum auch.

Mein Ansatze wäre wie folgt
(INFO: Die Buttons wurden in der dazugehörigen XML mit onClick und der Methode nextTextItem "bestückt")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);

String textOut = "";
int textNumber = 0;
int arrayLength;

TextView text = (TextView) findViewById(R.id.textViewDemo);
String[] a = getResources().getStringArray(R.array.DemoArray);
arrayLength = a.length;

text.setText(textOut);
textOut = a[textNumber];
}
public void nextTextItem(View view) {
switch(view.getId())
{
case R.id.nextArrayItemButton:
if(textNumber == arrayLength){
textNumber = 0;
}
else {
textNumber = textNumber + 1; /*(Ich weiß das man auch textNumber += 1 schreiben kann mir gefällt aber diese Form besser.)*/
}
break;
case R.id.previousArrayItemButton:
if(textNumber == 0){
textNumber = arraylength;
}
else {
textNumber = textNumber - 1;
}
break;
}
}

Leider weiß ich nicht wie ich aus der Methode nextTextItem auf die Variablen der Methode onCreate zugreifen kann.

Ich hoffe ihr könnt mir unter die Arme greifen :laugh:

Ps. Ich weiß es gehört hier eigentlich nicht rein aber ich freue mich über Empfehlungen von "Lernmöglichkeiten" für Java im Zusammenhang mit Android (Sprich kein reines Java Buch). Bitte per PN falls ihr was habt :drool:
 
füg die textview als member variable der klasse hinzu.
 
Gut nun wird die App angehalten :sad:

So sieht die App jetzt aus
public class DemoActivity extends ActionBarActivity {

String textOut = "";
int textNumber = 0;
int arrayLength;

TextView text = (TextView) findViewById(R.id.textViewDemo);
String[] a = getResources().getStringArray(R.array.DemoArray);


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);

arrayLength = a.length;

text.setText(textOut);
textOut = a[textNumber];
}
public void nextTextItem(View view) {
switch(view.getId())
{
case R.id.nextArrayItemButton:
if(textNumber == arrayLength){
textNumber = 0;
}
else {
textNumber = textNumber + 1; /*(Ich weiß das man auch textNumber += 1 schreiben kann mir gefällt aber diese Form besser.)*/
}
break;
case R.id.previousArrayItemButton:
if(textNumber == 0){
textNumber = arraylength;
}
else {
textNumber = textNumber - 1;
}
break;
}
}

Log auszug
05-12 15:09:04.448 4620-4620/com.... W/dalvikvm threadid=1: thread exiting with uncaught exception (group=0x4190b898)
05-12 15:09:04.468 4620-4620/com.... E/AndroidRuntime FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com..../com...}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2219)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.access$700(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.app.Activity.findViewById(Activity.java:1914)
at com.....<init>(DemoActivity.java:21)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1130)
at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2210)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
at android.app.ActivityThread.access$700(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
at dalvik.system.NativeStart.main(Native Method)
 
TextView text = (TextView) findViewById(R.id.textViewDemo);
String[] a = getResources().getStringArray(R.array.DemoArray);

Das muss in onCreate rein.

Gesendet von meinem Nexus 5 mit der Android-Hilfe.de App
 
findViewById funktioniert erst, nachdem du setContentView aufgerufen hast.
 
Mhmm nun ist alles i.O. bis auf die Tatsache das die Strings nicht ausgegeben werden.
Es passiert nichts wenn ich auf die Buttons klicke weder im Log noch sonst wo.
<item name="android:onClick">nextTextItem</item> damit sind die Buttons bestückt.

Könnte es sein das ich einen Fehler in der nextTextItem Methode habe?
Ggf. die Break; ´s ? Darf ich überhaupt if und else dort nutzen?

Sorry für die wahrscheinlich teils "laienhafte Fragen". :sad:

Ps. Eigentlich müsste ja sobald ich in die Activity wechsel das erste ArrayItem als textView angezeigt werden oder (unabhängig von den Buttons und der nextTextItem Methode)?
 
Dawg schrieb:
Ps. Eigentlich müsste ja sobald ich in die Activity wechsel das erste ArrayItem als textView angezeigt werden oder (unabhängig von den Buttons und der nextTextItem Methode)?

Nein weil du machst:
text.setText(textOut);
textOut = a[textNumber];

textOut ist zu dem Zeitpunkt noch "" also leer.
SetText funktioniert nur mit dem aktuellen Wert der in textOut steht.
Wenn du das ganze umdrehst
textOut = a[textNumber];
text.setText(textOut);

Dann steht das erste Element aus dem Array in der TextView.

Du musst in deiner nextTextItem Methode noch irgendwo text.setText() aufrufen und den entsprechenden Text setzen.
Allerdings solltest du zuerst textnumber erhöhen oder erniedrigen dann die Zahl prüfen und dann erst anzeigen.
 
Vielen dank schonmal :thumbup:
Mhmm scheine immer noch einen Fehler zu haben.

Problem 1:
Immer wenn die If-Statements gegeben sind stürzt die App ab.

Problem 2:
Hinzu kommt das die App komischerweise beim ersten mal erst nach 2 Tippen auf den Next-Button den String[1] aus der Array ausgibt.

Problem 3:
Drücke ich 2 mal auf Next bin ich bei String[1] ein weiterer Klick auf den Button bringt mich zu String[2] dann klicke ich auf den Button Previous und er bringt mich zu String[3] ein weiterer Klick darauf dann wieder zu String[2] und dann String[1].

Ich versteh nicht was mein Fehler ist :confused2:.
Ggf. die If-Statements vor den Case´s ?
Sprich:
switch() {
if(){
case:
....
break;
}
}

Hier der aktuelle Code.
public void changeTextItem(View view) {

TextView text = (TextView) findViewById(R.id.textViewDemo);

String[] a = getResources().getStringArray(R.array.DemoArray);

arrayLength = a.length;

textOut = a[textNumber];

switch(view.getId())
{
case R.id.nextArrayItemButton:
if(textNumber > arrayLength){
textNumber = 0;
text.setText(textOut);
}
else {
textNumber = textNumber + 1;
text.setText(textOut);
}
break;
case R.id.previousArrayItemButton:
if(textNumber < 0){
textNumber = arrayLength;
text.setText(textOut);
}
else {
textNumber = textNumber - 1;
text.setText(textOut);
}
break;
}
}
 
Du holst schon wieder zuerst den Text und dann erhöhst du die zahl.

Geh doch mal im kopf durch was in deiner App passiert:
Aller erstser Aufruf:
textNumber ist 0.
Du holst also mit
textOut = a[textNumber];
Das 0.Element, das steht jetzt in textOut.

Sagen wir du hast den NextButton gedrückt.
textNumber ist immer noch 0 und arrayLenght wird vermutlich größer sein also passiert
folgendes:
textNumber = textNumber + 1;
text.setText(textOut);

Und wir erinner uns textOut ist immer noch das 0.element wird aber hier erst angezeigt
erst wenn du nochmal auf next drückst ist textNumber 1 und es wird das erste Element angezeigt.

ich zitiere mich nochmal selber:
"Allerdings solltest du zuerst textnumber erhöhen oder erniedrigen dann die Zahl prüfen und dann erst anzeigen."
und konkretisiere:
Nicht nur dann erst anzeigen sondern erst dann das Element aus dem Array auslesen.


Du dürftest auch einen Fehler bekommen, wenn textnumber = arrayLength ist und du next drückst.
Beim nächsten Aufruf ist textnumber auf jedenfall größer als arrayLength damit wird
textOut = a[textNumber];
auf jedenfall einen Fehler werfen (eigentlich sogar schon früher wenn textNumber genau gleich arrayLength ist)

Denn ein Array mit 5 Einträgen hat die Einträge: 0,1,2,3,4 aber arrayLength ist = 5.
Wenn du nun mit Textnumber 4 auf next klickst wird textNumber um einen erhöht ist dann also 5.
Und direkt beim nächsten Aufruf macht du dann
textOut = a[5];
und prüfst erst später ob textNumber > arrayLenght ist (was es übrigens noch nicht mal ist), das führt aber zu einem Fehler da die höchste zahl die du eingeben kannst 4 ist (also immer arraylength - 1).
 
Zurück
Oben Unten