Text Inhalt einer TextView mit Switch Case ändern mit Android und Eclipse

  • Antworten:18
  • Bentwortet
Joachim Matthias Harksen
  • Forum-Beiträge: 15

16.09.2014, 22:08:09 via Website

Hallo Leute,

Ich komme alleine leider nicht weiter, es gibt zum Thema Android App Entwicklung Inhalt einer TextView mit switch Case ändern kaum brauchbare Anleitungen. Ich habe es mit Eclipse geschafft, keinen Fehler mehr angezeigt zu bekommen. Leider funktioniert die App auf dem Mobile Galaxy SIV nicht, wird nach aufrufen sofort geschlossen. Da ich keine Fehler Meldung von Eclipse erhalte. Gehe ich mal davon aus, dass mein Fehler nicht so groß sein kann. Ich finde Ihn aber nicht. Hier mal mein Code soweit ich Ihn bis jetzt habe. (Narr, Magier, Herrscher usw sind Tarotkarten.) Der Text soll ich nach klicken von btn1. jeweils ändern. btn2 schließt die App und funktioniert sonst auch. Aber Switch Case bekomme ich nicht zum laufen. Vielleicht hab ich ein Brett vorm Kopf und jemand kann mir einen Tip geben. Ich habe alle Quellen soweit abgesucht. Google, YouTube, Foren, aber zum Thema Switch Case unter Android gibt es kaum was. Hier nun der Code aus Eclipse, wie gesagt, Eclipse meldet keinen Fehler. Vielen Dank im Voraus.

package de.joachim.textprojekt2;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

Button btn1,btn2;
TextView tv1,tv2;



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

    btn1 = (Button) findViewById(R.id.btn1);
    btn2 = (Button) findViewById(R.id.btn2);
    tv1  = (Button) findViewById(R.id.tv1);
    tv2  = (Button) findViewById(R.id.tv2);

    btn1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            int id=v.getId();

            switch(id) {

            case 0: 

               tv1 = (TextView) findViewById(R.id.tv1);
                //Sets the new text to TextView (runtime click event)
                tv1.setText("Narr");

               break;

               case 1: 
               tv1 = (TextView) findViewById(R.id.tv1);
                //Sets the new text to TextView (runtime click event)
                tv1.setText("Magier");

                break;

               case 2: 
                   tv1 = (TextView) findViewById(R.id.tv1);
                   //Sets the new text to TextView (runtime click event)
                   tv1.setText("Herrscher");

                break;

               case 3: 
                   tv1 = (TextView) findViewById(R.id.tv1);
                   //Sets the new text to TextView (runtime click event)
                   tv1.setText("Herrscherin");

                   break;                  





            }







        }
    });

    btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // btn2 schließt die App

            finish();
            System.exit(0);


        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

— geändert am 16.09.2014, 22:09:42

Antworten
Micha Roth
  • Forum-Beiträge: 26

17.09.2014, 01:04:44 via Website

Ich weiß nicht, ob mein Vorgänger das meinte, aber du initialisiert dein Textfeld "tv1 = (TextView) findViewById(R.id.tv1);" auch 4 mal.
Deshalb wirft eclipse noch keinen Fehler, aber ich könnte mir vorstellen, dass wenn du in deiner App 4 mal das TextView initalisierst, Fehler erscheinen.

Außerdem verstehe ich deinen Anfang nicht ganz:

 tv1  = (Button) findViewById(R.id.tv1);

Hier ist tv1 ein Button und in deiner switch-case ist es ein TextView? Die gleichen Namen verwirren und könnten auch für die Fehler verantwortlich sein. Ohne Logcat ist es ein wenig schwer :)

Versuch es einfach mal, in dem du es wie folgst schreibst:

btn1 = (Button) findViewById(R.id.btn1);
btn2 = (Button) findViewById(R.id.btn2);
tv1  = (TextView) findViewById(R.id.tv1);
tv2  = (TextView) findViewById(R.id.tv2);

Und dein switch case:

 switch(id) {
        case 0: 
            tv1.setText("Narr");
            break;
//usw.
} //switch schließen

usw.

Schau dir gerne mal

Stirnraten.de an, viele Grüße

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

17.09.2014, 03:39:22 via Website

Hi,

danke für die Antworten. Im Manifest hab ich es nicht ein gegeben stimmt. Ich dachte ich kann das wie ein normales TextView behandeln. Da hab ich das auch nicht im Manifest eingegeben und es läuft. Ich muss dazusagen ich komme von VB zu 'Android, daher eventuell mein Fehler.
ich hatte es auch schon so probiert. Ich werde eure Hinweise ausprobieren, was mich wundert. dass es zu switch case in Android praktisch keine Anleitung gibt. Ich bin ja wohl kaum der einzige der da hängen bleibt. Hintergrund ist ich versuche ein Programm das ich in VB2010 geschrieben in Android zu übersetzen.

case 0:

                       tv1 = (TextView) findViewById(R.id.tv1);
                       //Sets the new text to TextView (runtime click event)
                       tv1.setText("Narr");

                       break;

blöde Frage logcat, sagt mir im Moment leider nicht viel. Ich bin noch nicht so lange bei Android. Wenn ich es finde, schreibe ich es euch rein.
Danke schon mal für die Ideen.

Gruß

Joachim

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.09.2014, 06:45:13 via App

http://logbuch.dmaertens.de/android/entwicklung/logcat

Kleines tut für LogCat.
Es gibt genügend tutorials und beispiele im Inet aber du darfst dich nicht aufs stichwort Android festelgen. Die Programmiersprache ist Java und da gibts zig Beispiele dazu.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

17.09.2014, 15:42:09 via Website

Da hast du sicher recht, ich bekomme das mit java auch problemlos hin. Wie auch in VB2010 ohne Probleme. Aber eben noch nicht in Android, da gibt es doch einige kleine Unterschiede. Aber mit den Hinweisen von euch komme ich erst mal weiter.
LogCat muß ich mir noch anschauen. Hab da noch nichts gemacht.

lieben Gruß und Danke

Joachim

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

17.09.2014, 16:38:15 via Website

Hallo Leute,

der Code sieht jetzt so aus, immerhin läuft es jetzt,auf dem Smartphone schon mal, soweit so gut, leider bricht der Code nach dem ersten break, ab. in der TextView wird nur das erste Element aufgerufen so viel kann ja eigentlich nicht mehr falsch sein. Nicht am btn2 stören, es gibt diesmal nur den einen Button und zwei TextViews. Wobei ein TextView nur die Begrüßung selber ist. Das andere den Text aufruft. Was jetzt bis zum ersten Element auch läuft, danach aber dann hinter break abbricht. Ich habs auch ohne break versucht. Das funktioniert ja in VB2010. Ich dachte, ausprobieren kann ja nicht schaden, da ja beide Sprachen auf c++ basieren, muss es doch ähnlich aussehen. Es geht auch, dann wird aber nur das letzte Element in der TextView angezeigt. Irgendwas fehlt anscheinend noch. In Java läuft es doch ohne Probleme, der Unterschied kann doch nicht so groß sein. Switch-Case muss doch auch unter Android laufen. Hat noch jemand eine Idee. Oder eventuell einen Link zu einem Tutorial. Auch gerne in Englisch.

Zusatz mit R.id.btn2 hab ich auch probiert, aber das klappt dann nicht mit Case 0, Case 1, Case 2 usw.

Vielen Dank für eure Anregungen.

package de.joachim.textprojekt3;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

Button btn2;
TextView tv1,tv2;


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

    btn2 = (Button) findViewById(R.id.btn2);
    tv1 = (TextView)findViewById(R.id.tv1);
    tv2 = (TextView)findViewById(R.id.tv2);

     btn2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

                      int id = 0;

                        switch(id){

            case  0:
                tv2.setText("Narr");
                break;                  
            case 1:
                tv2.setText("Magier");
                break;  
            case 2:
                tv2.setText("Hohepriesterin");
                break;  
            case 3:
                tv2.setText("Herrscherin");
                break;  
            case 4:
                break;      
            case 5:
                tv2.setText("Hierophant");
                break;  


            }

— geändert am 18.09.2014, 04:33:45

Antworten
Micha Roth
  • Forum-Beiträge: 26

19.09.2014, 18:39:20 via Website

Hey,

also, ich denke dein Code ist richtig. Das liegt wohl an einer anderen Eintstellung.

Ich habe den Code mal etwas modifiziert und er funktioniert auf meinem Handy fehlerfrei. Du kannst ihn ja zum Vergleichen verwenden:

package com.example.testtext;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

Button btn1;
TextView tv2;
EditText et1; //über EditText gibt man die Zahl an, womit das switch case arbeitet

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


    btn1 = (Button) findViewById(R.id.btn1);
    tv2 = (TextView)findViewById(R.id.tv2);
    et1 = (EditText)findViewById(R.id.et1);



         btn1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String text = et1.getText().toString();

                int id = Integer.parseInt(text);

                switch(id){
                case  0:
                    tv2.setText("Narr");
                    break;                  
                case 1:
                    tv2.setText("Magier");
                    break;  
                case 2:
                    tv2.setText("Hohepriesterin");
                    break;  
                case 3:
                    tv2.setText("Herrscherin");
                    break;  
                case 4:
                    break;      
                case 5:
                    tv2.setText("Hierophant");
                    break;
                default:
                    tv2.setText("Ungueltige Eingabe");
                    break;
                }
            }
         });
}

}

Mit Logcat ist ein Ansichtsfenster in Eclipse gemeint. Wenn Fehler auftreten, werden diese im Logcat angezeigt. Evtl. musst du das Logcat erst einblenden: Windows -> Show View -> Logcat

Hoffe, das hilft dir.

Gerne mal meine App anschauen auf

Stirnraten.de

Antworten
Georg C.
  • Forum-Beiträge: 235

20.09.2014, 00:14:46 via Website

@Joachim Matthias Harksen
ich gehe davon aus, dass du sich bis dato mit Java - case vertraut gemacht hast.
Hier noch mal:
Die switch Klausel ist NUR! für char, byte, short, oder int (Primitive Data Objekte) bestimmt.
Es ist wie im (z.B. auch VB ) - also verstehe nicht deine Probleme mit.

Im VB:
Dim number As Integer = 1024
(?Select) case number
case 1
...
case 1024

In der Java:
int number = 1024;
switch(number){
case 1
...
case 1024

Weiter (für mehr Klarheit) etwas aufwendiger

switch(Display.getHight(caputero.viewButton_minimalisiere.getId(1))){
case 0:
{
// Wenn
// Display.getHight(caputero.viewButton_minimalisiere.getId(1)) bekommt den Wert 0
// wird das Teil hier ausgeführt.
break;
}
case 1024:
{
// Wenn
// Display.getHight(caputero.viewButton_minimalisiere.getId(1)) bekommt den Wert 1024
// wird das Teil hier ausgeführt.
break;
}
...
}

Also bitte etwas Selbständigkeit.

VB hat AUCH! Funktionen (in Java werden die zwar Methoden genant) ABER ich bitte dich!!!!!!!

...
public void onClick(View v) {
// TODO Auto-generated method stub
int id = 0; <---------------------------------
switch(id){ ... <----------------------------

Kopfschütteln

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.09.2014, 07:37:28 via App

@Micha dein Code ist auch nicht besser..

Du darfst nie int id = Integer.parseInt(text);

einen Text in eine Integer parsen. Wie soll das funktionieren..
Zudem bekommt man due id der View mit v.getId(); dann fehlt nur noch die switch.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

20.09.2014, 20:58:50 via Website

danke dir für deine Mühe Micha, war leider wegen Arbeit im Stress, hab deinen Beitrag erst heute gesehen und werd das nach her direkt ausprobieren.

lG Joachim

— geändert am 20.09.2014, 21:06:13

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

20.09.2014, 21:05:11 via Website

Hallo Georg,

ich kann dir den Code in c++, VB2010 und Java zeigen, überall funktioniert es. Nur eben nicht in Android. Ich gebe aber einen möglichen Denkfehler auf Grund Betriebsblindheit zu. Ich muss mir das noch mal in Ruhe ansehen.

int id = 0;
switch(id){

war auch nur ein Versuch. Man darf ja auch mal was ausprobieren. Zugegeben allerdings nicht ziel führend. Du hast recht, in VB2010 ist das Case Select. und du hast auch richtig vermutet. Bislang hab ich mich mit Java - Case befasst. Bislang hab ich mir alles selber bei gebracht. Kann auch sein, dass sich da was falsches eingeschlichen hat.

— geändert am 20.09.2014, 21:19:39

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

20.09.2014, 21:07:45 via Website

danke Pascal für die Mühe, ein wertvoller Hinweis.

— geändert am 20.09.2014, 21:21:04

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

20.09.2014, 21:11:13 via Website

Hi Micha,

war auch zu gegeben ne eher dumme Frage, bin noch nicht so lange bei Android. Die Logcat läuft bei mir, das war ja das was mich irritiert hat. dass da keine Fehler Meldungen kamen.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.09.2014, 21:14:29 via App

Hat es denn jetzt funktioniert?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Joachim Matthias Harksen
  • Forum-Beiträge: 15

21.09.2014, 09:08:21 via Website

Hallo Micha,

ich hab es jetzt trotz Kritik der anderen erst mal so umgesetzt wie du vorgeschlagen hast, es läuft jetzt auch bei mir einwandfrei. Damit ist meine grundsätzliche Frage ja beantwortet. Als nächstes werde ich mich aber noch mit dem Thema saubere Programmierung wie durch Pascal und George angesprochen kümmern. Danke an euch alle für die Mühe. Ihr habt mir echt weiter geholfen. Ich wünsche allen ein schönes Wochenende.

Antworten
Micha Roth
  • Forum-Beiträge: 26

21.09.2014, 19:34:49 via Website

Du darfst nie int id = Integer.parseInt(text);

Mal so ganz blöd gefragt, warum nicht? Kann es ja surrounden mit einer try catch, die als Fehler wirft: "Bitte Zahleneingabe machen". Außerdem möchte ich ja nicht die ID der TextView (oder in meinem Beispiel des EditText), sondern den Inhalt und der Inhalt ist in meinem Beispiel erstmal als String zu behandeln. Den kriegt man doch nur per getText() oder?

Klär mich gerne auf :)

gruß

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.09.2014, 20:12:40 via App

ja schon. Das was du nun sagst ist richtig. Aber 1. Kann man per filter das Textfeld nur auf Zuffern beschränken und
2. Switchst du dann nach der ausgelesenen id und suchst in den case Teilen die R.id also die Resource id heraus. Das kann und kommt zu fehlern, da das die resource id ja ganz anders sein kann als die eingegebene. Wenn du diesen Fehler vermeiden willst benutzt du View#getID zum lesen der Id des gecklickten buttons. Sonst kann ich ja auf einen Buttonklick alles mögliche ausführen lassen wenn eine falsche id im Textfeld steht.

Edit :Gerade noch mal durchgeschaut und bemerkt dass es mein Fehler war.....
Ich hatte deinen Code mit dem Code des te aus dem 1. Post vermischt. Sorry

— geändert am 21.09.2014, 20:17:27

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten