Problem bei Quiz Entwicklung

  • Antworten:29
Heretsu
  • Forum-Beiträge: 37

20.10.2014, 15:22:10 via Website

Hallo, wir haben in der Schule kürzlich mit der App Entwicklung für Android angefangen und ich wollte darauf hin ein Quiz erstellen. Ich hab da aber ein Problem mit den Fragen. Undzwar will ich nicht hunderte Activities und Layouts erstellen um die Fragen anzeigen zu lassen. Also von Activity & Layout 1 mithilfe eines Buttons zu Activity & Layout 2. Kann mir vielleicht jemand eine Methode nennen wie ich mehrere Fragen in einer Activity und Layout nacheinander anzeigen kann? Mithilfe von einer Datenbank müsste es doch gehen, oder? Weiß nur nicht wie :/

MfG

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

20.10.2014, 16:18:56 via Website

Hallo,
Das könntest du als Grundlage benutzen: http://www.bhecker.com/workshops/ap-quizApp.pdf
Zudem lässt sich das ganze ganz einfach lösen, indem du eine Frestgelekte klassen Struktur erstelltst, fragen werden dann z.b. aus einer DB geladen verarbeitet und nach einer Reihenfolge (oder random) angezeigt.
Eigentlich musst du ein Layout erstellen dass für alle Fragen allgemein ist. Per Code kannst du dann die Daten in das ALyout aden.

LG Pascal

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

Antworten
Heretsu
  • Forum-Beiträge: 37

20.10.2014, 16:31:47 via Website

Vielen Dank für deine Hilfe! Ich habe dieses Tutorial allerdings schon hinter mir. Genau so sieht im Moment mein Quiz aus(Naja gut, anderes Design und andere Fragen und ein Button weniger). Aber in diesem Tutorial wird nur eine einzige Frage verwendet und nicht aus einer Datenbank geladen bzw keine weiteren Fragen werden erstellt :/

Und wie kann ich den Fragen + Antworten von der Datenbank laden bzw als erstes in die Datenbank reinschreiben?

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

20.10.2014, 16:38:49 via Website

Für DBs ist dieses Tut ganz gut : http://www.vogella.com/tutorials/AndroidSQLite/article.html
Beachte, dass du auch bei google suchen kannst, anstatt hier nach zu fragen :P
Meist geht das sogar schneller..

LG Pascal

— geändert am 20.10.2014, 16:38:57

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

Antworten
Heretsu
  • Forum-Beiträge: 37

21.10.2014, 14:56:28 via Website

Hab es nun endlich hingeklickt, die Fragen und antworten werden endlich angezeigt, vielen Dank für deine Hilfe!
Nun kommt aber das nächste Problem: Nach den 5 Fragen stürzt die App ab, obwohl sie eigentlich zu den Ergebnissen weiterleiten sollte.
LogCat zeigt mir folgende Fehler, die ich so nicht verstehe. Google hat auch nicht weitergeholfen :/
Ich poste mal den Quellcode:

package com.example.quiz;

import java.util.List;

import com.example.quiz.R;

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.content.Intent;
public class QuizActivity extends Activity{
protected static final String TAG = null;
List<Question> quesList;
Button b1, b2, b3;
int qid=0;
int score=0;
Question currentQ;
TextView txtQuestion;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        DbHelper db=new DbHelper(this);
        quesList=db.getAllQuestions();
        currentQ=quesList.get(qid);
        txtQuestion=(TextView)findViewById(R.id.textView2);
        b1 =(Button)findViewById(R.id.button1);
        b2 =(Button)findViewById(R.id.button2);
        b3 =(Button)findViewById(R.id.button3);

        setQuestionView();
        b1.setOnClickListener(new View.OnClickListener() {      
            private View view;
        @Override
            public void onClick(View v) {                   
                switch (v.getId()) {
                case R.id.button1:
                    Log.i(TAG, "Answer A was clicked");
                    checkAnswer("A");
                    break;
                case R.id.button2:
                    Log.i(TAG, "Answer B was clicked");
                    checkAnswer("B");
                    break;
                case R.id.button3:
                    Log.i(TAG, "Answer C was clicked");
                    checkAnswer("C");
                    break;
                    }
                {
                    score++;
                    Log.d("score", "Your score"+score);
                }
                if(qid<5){                   
                    currentQ=quesList.get(qid);
                    setQuestionView();
                }else{
                    Intent intent = new Intent(view.getContext(), ResultActivity.class);
                    Bundle b = new Bundle();
                    b.putInt("score", score); 
                    intent.putExtras(b); 
                    startActivity(intent);
                    finish();
                }
            }
                private void checkAnswer(String string) {
                // TODO Auto-generated method stub
    }
        });

        b2.setOnClickListener(new View.OnClickListener() {      
        private View view;
        @Override
        public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                Log.i(TAG, "Answer A was clicked");
                checkAnswer("A");
                break;
            case R.id.button2:
                Log.i(TAG, "Answer B was clicked");
                checkAnswer("B");
                break;
            case R.id.button3:
                Log.i(TAG, "Answer C was clicked");
                checkAnswer("C");
                break;
                }
            {
                score++;
                Log.d("score", "Your score"+score);
            }
            if(qid<5){                   
                currentQ=quesList.get(qid);
                setQuestionView();
            }else{
                Intent intent = new Intent(view.getContext(), ResultActivity.class);
                Bundle b = new Bundle();
                b.putInt("score", score); 
                intent.putExtras(b); 
                startActivity(intent);
                finish();
            }
        }
        private void checkAnswer(String string) {
            // TODO Auto-generated method stub
        }
    });

        b3.setOnClickListener(new View.OnClickListener() {      
            private View view;

@Override
            public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button1:
                Log.i(TAG, "Answer A was clicked");
                checkAnswer("A");
            break;
            case R.id.button2:
                Log.i(TAG, "Answer B was clicked");
                checkAnswer("B");
            break;
            case R.id.button3:
                Log.i(TAG, "Answer C was clicked");
                checkAnswer("C");
            break;
        }
    {
        score++;
        Log.d("score", "Your score"+score);
    }
    if(qid<5){                   
        currentQ=quesList.get(qid);
        setQuestionView();
    }else{
        Intent intent = new Intent(view.getContext(), ResultActivity.class);
        Bundle b = new Bundle();
        b.putInt("score", score); 
        intent.putExtras(b); 
        startActivity(intent);
        finish();
    }
}

private void checkAnswer(String string) {
// TODO Auto-generated method stub
}
});
}

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    private void setQuestionView(){
        txtQuestion.setText(currentQ.getQUESTION());
        b1.setText(currentQ.getANTA());
        b2.setText(currentQ.getANTB());
        b3.setText(currentQ.getANTC());
        qid++;
    }
}

und nun die Fehler von LogCat:
image

MfG

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

21.10.2014, 15:11:34 via Website

Nach Zählen komme ich darauf, dass das

Intent intent = new Intent(view.getContext(), ResultActivity.class);

Zeile 62 ist wo die

NullPointerException

auftritt.
Also entweder ist view.getContext() null oder die ResultActivity. Wieso nimmst du denn view.getContext und nicht einfach this?

Oder es ist eine ganz andere Zeile. Dann müsstest du eben schreiben welche Zeile die 62. ist.

— geändert am 21.10.2014, 15:12:09

Antworten
Heretsu
  • Forum-Beiträge: 37

21.10.2014, 15:47:07 via Website

Falls ich view.getContext() entferne und this einfüge, also:
Intent intent = new Intent(this, ResultActivity.class);
Erscheint folgender Fehler: The constructor Intent(new View.OnClickListener(){}, Class<ResultActivity>;) is undefined

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

21.10.2014, 15:50:02 via Website

Achso dann versuch es mal mit getContext() oder getApplicationContext() anstatt this.

Ich bin auch nur Anfänger und die Sache mit dem Context ist für mich auch noch nicht komplett klar.

Antworten
Heretsu
  • Forum-Beiträge: 37

21.10.2014, 15:57:16 via Website

Okay, ich hab den Fehler gefunden, ein dummer Fehler von mir ^^
public void onClick(View v)
Die View wird hier ja "v" benannt, aber ich benutze weiterhin "view" stattdessen. Nun funktioniert es. Trotzdem vielen Dank für deine Hilfe und viel Erfolg und Spaß beim Programmieren :D

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

21.10.2014, 15:59:37 via Website

Okay oder so :D

Antworten
Heretsu
  • Forum-Beiträge: 37

23.10.2014, 23:13:08 via Website

Abend, ich bins wieder :D
Ich bin mit dem Quiz nun größtenteils fertig, was mir nun fehlt ist, dass der Highscore gespeichert wird und das man diese Highscores anschauen kann. Ich bin bei meiner Recherche immer auf sharedPreferences gekommen, aber ich hab echt keine Ahnung in welcher Activity und wo genau ich dies einfügen muss, vielleicht kann mir da ja jemand helfen?
Ich verschaffe euch mal einen Überblick über die meiner Meinung nach relavanten Activities:
QuizActivity -> Hier spielt sich das Quiz ab, man wird hierher geleitet nachdem man in der MainActivity auf Spiel starten klickt.
ResultActivity -> Hier wird der Score angezeigt, den man erzielt hat. Hierher wird man nach der letzten beantworteten Frage in der QuizActivity weitergeleitet.
Ich nehme an, dass Quellcodes benötigt werden, aber ich möchte den Thread nicht noch mehr unnötig zumüllen, darum warte ich lieber auf die Anweisung :)

MfG

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

24.10.2014, 08:45:33 via Website

Solange der Highscrore nur lokal (nicht mit anderen Usern zusammen) sein soll, dann ist SharedPreferences oder eine DB das richtige.
Am besten du machst das genze in der ResultActivity, dort dann speihern und evntl. andere Spielstände anzeigen lassen.
Erklärung: http://stackoverflow.com/questions/3624280/how-to-use-sharedpreferences-in-android-to-store-fetch-and-edit-values

LG Pascal

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

Antworten
Heretsu
  • Forum-Beiträge: 37

27.10.2014, 17:57:41 via Website

Es funktioniert :)

Aber... neuer Tag, neues Problem :D
Ich wollte die GUI etwas übersichtlicher gestallten, jedoch stürzt die App ab oder startet erst gar nicht wenn ich kleine Änderungen vornehme.
Beispiel: Funktionierendes Design: image

Nicht Funktionierendes Design:
image
Logcat:
10-27 17:53:41.254: W/asset(3002): Copying FileAsset 0x739c84d8 (zip:/data/app/com.example.quiz-2.apk:/resources.arsc) to buffer size 110816 to make it aligned.
10-27 17:53:41.374: I/dalvikvm-heap(3002): Grow heap (frag case) to 14.666MB for 8640016-byte allocation
10-27 17:53:41.434: I/MediaPlayer(3002): setLPAflag() in
10-27 17:53:41.434: I/MediaPlayer(3002): mContext is null, can't getMirrorDisplayStatus!!!
10-27 17:53:41.434: I/MediaPlayer(3002): setLPAflag() out
10-27 17:53:41.434: W/MediaPlayer(3002): info/warning (1, 902)
10-27 17:53:41.444: D/MediaPluginDLNA: [getIsRegionSupported] sRegionCode: 6
10-27 17:53:41.454: D/MediaPluginDLNA: not in Mirror mode
10-27 17:53:41.454: D/MediaPlayer(3002): doStart() in
10-27 17:53:41.454: D/MediaPlayer(3002): Htc_getIntParameter = 902
10-27 17:53:41.474: W/dalvikvm(3002): threadid=1: thread exiting with uncaught exception (group=0x41719e18)
_____________________________________________________________
AB HIER IST DIE SCHRIFT IM LOGCAT ROT
_____________________________________________________________
10-27 17:53:41.484: E/AndroidRuntime(3002): FATAL EXCEPTION: main
10-27 17:53:41.484: E/AndroidRuntime(3002): Process: com.example.quiz, PID: 3002
10-27 17:53:41.484: E/AndroidRuntime(3002): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.quiz/com.example.quiz.MainActivity}: java.lang.NullPointerException
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2641)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.ActivityThread.access$800(ActivityThread.java:156)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.os.Handler.dispatchMessage(Handler.java:102)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.os.Looper.loop(Looper.java:157)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.ActivityThread.main(ActivityThread.java:5867)
10-27 17:53:41.484: E/AndroidRuntime(3002): at java.lang.reflect.Method.invokeNative(Native Method)
10-27 17:53:41.484: E/AndroidRuntime(3002): at java.lang.reflect.Method.invoke(Method.java:515)
10-27 17:53:41.484: E/AndroidRuntime(3002): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
10-27 17:53:41.484: E/AndroidRuntime(3002): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
10-27 17:53:41.484: E/AndroidRuntime(3002): at dalvik.system.NativeStart.main(Native Method)
10-27 17:53:41.484: E/AndroidRuntime(3002): Caused by: java.lang.NullPointerException
10-27 17:53:41.484: E/AndroidRuntime(3002): at com.example.quiz.MainActivity.onCreate(MainActivity.java:28)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.Activity.performCreate(Activity.java:5312)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
10-27 17:53:41.484: E/AndroidRuntime(3002): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2541)
10-27 17:53:41.484: E/AndroidRuntime(3002): ... 11 more

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

27.10.2014, 18:24:58 via App

Irgend eine Variable ist null da
MainActivity.onCreate(MainActivity.java:28)

Zeig mal bitte den Code

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

Antworten
Heretsu
  • Forum-Beiträge: 37

27.10.2014, 19:16:18 via Website

Nicht nötig, habs irgendwie hinbekommen ^^
Hatte in der Main 2 verschiedene Methoden um Musik abzuspielen ( Intro und Buttonklick ). Hab mich nun für eine von beiden(MediaPlayer) entschieden und nun gehts.
Der alte Code mit 2 Methoden und einem NULL

package com.example.quiz;

import java.io.IOException;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.media.MediaPlayer;

public class MainActivity extends Activity {
private static final String TAG = null;
private SoundPool soundPool;
private int klickId = -1;
public MediaPlayer mp1;

@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mp1 = MediaPlayer.create(MainActivity.this, R.raw.intro);
    mp1.start();
    Button high = (Button) findViewById(R.id.Button01);
    Button next = (Button) findViewById(R.id.button1);
    next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent intent = new Intent(view.getContext(), SecondActivity.class);
            startActivity(intent);
            soundPool.play(klickId, 1, 1, 0, 0, 1);
            }

});
high.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), OptionsActivity.class);
startActivity(intent);
soundPool.play(klickId, 1, 1, 0, 0, 1);
} });
Log.i(TAG, "Loading klick sound";);
soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
try {klickId = soundPool.load(getAssets().openFd("sounds/klick.mp3";), 1);
} catch (IOException e) {
e.printStackTrace();}

}
}

Und der 2., funktionierende und "gesäuberte" Code:

package com.example.quiz;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.media.MediaPlayer;

public class MainActivity extends Activity {
public MediaPlayer mp1, mp2;

@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mp1 = MediaPlayer.create(MainActivity.this, R.raw.intro);
    mp2 = MediaPlayer.create(MainActivity.this, R.raw.klick);
    mp1.start();
    Button high = (Button) findViewById(R.id.Button01);
    Button next = (Button) findViewById(R.id.button1);
    next.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent intent = new Intent(view.getContext(), SecondActivity.class);
            startActivity(intent);
          mp2.start();
            }

});
high.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), OptionsActivity.class);
startActivity(intent);
mp2.start();
} });

}
}
Ich muss generell mal auf die Sauberkeit meiner Codes achten, ich hab das Gefühl, dass meistens auch unnötiges dabei ist, was alles unübersichtlicher macht :)
Ich meld mich wahrscheinlich demnächst mit dem nächsten Fehler :D
MfG

Antworten
Heretsu
  • Forum-Beiträge: 37

28.10.2014, 21:02:55 via Website

Ich kriegs nicht hin die Fragen in einer zufälligen Reihenfolge anzeigen zu lassen :/ Ich hab bereits versucht dies:

db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null);

hinzuzufügen, macht aber nix :(
Ich glaube dies ist der relevante Quellcodeabschnitt in der Datenbank:

    public List<Question> getAllQuestions() {
    List<Question> quesList = new ArrayList<Question>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_QUEST;
    dbase=this.getReadableDatabase();
    Cursor cursor = dbase.rawQuery(selectQuery, null);
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Question quest = new Question();
            quest.setID(cursor.getInt(0));
            quest.setQUESTION(cursor.getString(1));
            quest.setANSWER(cursor.getString(2));
            quest.setANTA(cursor.getString(3));
            quest.setANTB(cursor.getString(4));
            quest.setANTC(cursor.getString(5));
            quesList.add(quest);
        } while (cursor.moveToNext());
    }
    // return quest list
    return quesList;
}
public int rowcount()
{
    int row=0;
    String selectQuery = "SELECT  * FROM " + TABLE_QUEST;
    SQLiteDatabase dbchi = this.getWritableDatabase();
    Cursor cursor = dbchi.rawQuery(selectQuery, null);
    row=cursor.getCount();
    return row;
}

Kann mir da (schon wieder) jemand weiterhelfen? Vielen dank :)

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

28.10.2014, 21:42:35 via App

So falsch sieht das doch gar nicht aus. Für das sql statement müsste ich selber erstmal schauen, aber andere Metode :
Fragen in eine Array bzw. Liste und dann in Java eine Random Zahl zwischen 1 und der Arraylänge. Dann über den Index das aktuelle Objekt bekommen.

Schau aber doch nochmal nach dem sql.
Ich habe da du Test immer eine DB auf dem PC laufen die ich per weboberfläche phpMyAdmin abrufen kann.

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

Antworten
Heretsu
  • Forum-Beiträge: 37

28.10.2014, 23:06:53 via Website

Hab hinbekommen :) Ich musste

String selectQuery = "SELECT  * FROM " + TABLE_QUEST;

durch das:

String selectQuery = "SELECT * FROM Chiquest ORDER BY RANDOM()";

ersetzen :D Nun gehe ich mal auf die Suche um die Antworten auch in einer random Reihenfolge anzuzeigen, ich danke dir für deine Hilfe :)

Antworten
Heretsu
  • Forum-Beiträge: 37

29.10.2014, 18:24:59 via Website

Nun zu den letzten Feinheiten :D
Ich möchte, dass die GUI auf jedem Gerät gleich aussieht, weiß aber nicht wie.
Soweit ich mitbekommen habe, wäre die 1. Variante dp statt px im Layout zu verwenden.
Diese Variante fällt aber schon mal weg, da ich nirgends px benutze.
Die andere ist es, dies im Manifest einzufügen:
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true" />
Diese Methode hat aber nichts gebracht.

Hier mal eine Ansicht wie es auf meinem Handy und generell aussehen sollte:

image

Und hier wie es auf dem kleineren Handy meiner Schwester aussieht:
image

MfG

Edit: Ist dies der einzige weg? https://www.youtube.com/watch?v=OtsZbdbC370
Hab wirklich keine Lust jetzt meine 10 Layouts jeweils 4x neu zu gestallten :/

— geändert am 29.10.2014, 22:29:58

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

30.10.2014, 06:13:54 via App

Das wie im video ist eine Möglichkeit und nicht all zu aufwändig. Das würde ich auch so machen.
Eine gute Alternative gibt es kaum bsp. könntest du die grösse per Code noch errrechnen aber wie gesagt komplizierter.
Ausserdem kannst du copy&paste verwenden und dann anpassen ;)

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

Antworten
Heretsu
  • Forum-Beiträge: 37

06.11.2014, 19:09:23 via Website

Abend, Ich schon wieder :)
Ich würde jetzt gerne einen Timer implementieren, nicht so einfach wie ich zuvor dachte.
Jedenfalls bin ich mittlerweile so weit, dass nach einer bestimmten Zeit die nächste Frage angezeigt wird.
Nun muss sich der Timer zurücksetzten, also wieder von z.B 5 Sekunden auf 0 runter und dann die nächsten Fragen anzeigen.
Hab bisher aber keinen Weg gefunden, dies zu machen. Ich habs versucht indem ich
public void run() {
TextView tv = (TextView) findViewById(R.id.textView1);
tv.setText(String.valueOf(time));
time -=1;
if(time == -1)
{ currentQ=quesList.get(qid);
setQuestionView();}
}
mehrfach eingesetzt habe, so tut sich aber nichts am Timer.
Habe ebend hier im Forum paar Threads gefunden, mich und mein Problem hat da aber nicht wirklich was angesprochen :/

Ich hoffe jemand kann mir da helfen, mfg

Hier nochmal die gesamte Timer Methode:

Timer t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                runOnUiThread(new Runnable() {
                    public void run() {
                        TextView tv = (TextView) findViewById(R.id.textView1);
                        tv.setText(String.valueOf(time));
                        time -=1;
                        if(time == -1)
                        { currentQ=quesList.get(qid);
                            setQuestionView();} 
                    }

                }); 
            }

        },

        0,//Nach wievielen Sekunden der Timer starten soll

        1000);//Wieviel Millisekunden er runterzählen soll

Antworten
Heretsu
  • Forum-Beiträge: 37

06.11.2014, 20:23:42 via Website

Oh, so einfach kanns auch gehen (laughing)
Nun bin ich aber immer noch vor meinem Problem mit dem reseten und dem ändern der Fragen :(

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

06.11.2014, 20:38:59 via App

Nächste Frage einfach als Objekt laden und dann ins layout einbetten.
Das sollte doch gehen oder?

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

Antworten
Heretsu
  • Forum-Beiträge: 37

06.11.2014, 21:36:04 via Website

Ja ja, die Frage wechselt ja nachdem der Counter auf 0 ist, nur ist das Problem, dass der Counter sich nicht auf die Ursprünglichen Sekunden zurücksetzt, sondern bei 0 bzw 1 bleibt. Also müsste ich erst den Counter reseten um zu schauen obs wirklich mit allen Fragen funktioniert, weiß aber nicht wie ich den resete :/

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

06.11.2014, 21:37:53 via App

Wie sieht denn dein Counter aus?
Unter dem Namen stelle ich mir ne normale Integer vor.
Für was ist dieser Counter zuständig?

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

Antworten
Heretsu
  • Forum-Beiträge: 37

06.11.2014, 21:39:48 via Website

So sieht der counter im moment aus:

final TextView t = (TextView) findViewById(R.id.textView1);
        new CountDownTimer(20000, 1000) {
            public void onTick(long millisUntilFinished) {
                t.setText(" " + millisUntilFinished / 1000);
             }
            public void onFinish() {
                 currentQ=quesList.get(qid); // Hier werden die Fragen geladen
                 setQuestionView(); //
             }
            }
            .start();

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

07.11.2014, 13:41:11 via App

Wenn eine neue Frage kommt kannst du ja einfach sagen, dass der timer wieder starten soll.
Das ist doch gar kein Problem.

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

Antworten
Heretsu
  • Forum-Beiträge: 37

07.11.2014, 17:48:28 via Website

Ich weiß nicht wie, hab bereits einiges probiert, passiert ist aber nix :(

Edit: Okay, nun funktioniert es. Hab Testweise this.start benutzt und es geht :D

— geändert am 07.11.2014, 18:10:41

Antworten
Heretsu
  • Forum-Beiträge: 37

27.11.2014, 20:15:36 via Website

Abend!
Ich wollte nun den Score etwas dynamischer machen indem ich bei einer falschen Antwort Punkte abziehe.
Dadurch kann ich nicht mehr die alte Methode zum anzeigen des Score's benutzen:

switch (score)
    {
    case 0:  
    case 10: t.setText("Deine Punkte: " + score+"/100\nDu solltest öfters Scrubs schauen, Bambi!");
    t.setTextColor(Color.parseColor("#B40404"));
    break;
    case 20: 
    case 30: t.setText("Deine Punkte: " + score +"/100\nGeh am besten noch einmal lernen, Flachzange!");
    t.setTextColor(Color.parseColor("#FF4000"));
    break;
    case 40:
    case 50: t.setText("Deine Punkte: " + score +"/100\nGute Leistung, aber selbst Barbie ist besser! ");
    t.setTextColor(Color.parseColor("#D0FA58"));
    break;
    case 60:
    case 70:
    case 80:
    case 90:
    case 100:  t.setText("Deine Punkte: " + score +"/100\nBist du Chefarzt im Sacred Heart?");
    t.setTextColor(Color.parseColor("#088A08"));
    break;
    }

Stattdessen verwende ich folgende, im Internet gefundene Variante:

if (score >= 0 && score <= 19){
        t.setText("Deine Punkte: " + score +"/100\nDu solltest öfters Scrubs schauen, Bambi!");
        t.setTextColor(Color.parseColor("#B40404"));   }
    else if (score >= 20 && score <= 39){
        t.setText("Deine Punkte: " + score +"/100\nGeh am besten noch einmal lernen, Flachzange!"); 
        t.setTextColor(Color.parseColor("#FF4000"));}
    else if (score >= 40 && score <= 59){
        t.setText("Deine Punkte: " + score +"/100\nGute Leistung, aber selbst Barbie ist besser! ");
        t.setTextColor(Color.parseColor("#D0FA58"));}  
    else if (score >= 60 && score <= 79){
        t.setText("Deine Punkte: " + score +"/100\nWow, das war wirklich eine überwältigende Leistung! Medizinstudium bestanden! ");
        t.setTextColor(Color.parseColor("#D0FA58"));   }
    else if (score >= 80 && score <= 100) {
         t.setText("Deine Punkte: " + score +"/100\nDu solltest dich für den Posten als Chefarzt im Sacred Heart bewerben!");
         t.setTextColor(Color.parseColor("#088A08")); }

Aber mit dieser Variante wird dem Spieler immer angezeigt, dass er 0 Punkte erspielt hat, also wird immer die erste if Anweisung genommen, warum?
Und wie kann man das beheben?
MfG

— geändert am 27.11.2014, 20:19:04

Antworten