Hi, ich will eine zum Vokabellernen erstellen. Aber wenn ich die App starte und eine der beiden Activities öffne, stürzt meine App sofort ab. Dabei zeigt meine LogCat immer folgendes an: "android.widget.RelativeLayout cannot be cast to android.widget.TextView"
Hier mein Quellcode:
Ausgabe:
Java
package com.protoapp.protoapp;
import android.content.Intent;
import android.database.Cursor;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Locale;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
public class Ausgabe extends AppCompatActivity {
boolean continueSpeak = true;
boolean stopSpeak = false;
boolean runAusgabe = false;
DatabaseHelper Database;
Button buttonStart;
Button buttonPause;
Button buttonStop;
TextToSpeech toSpeech;
Spinner spinnerStack3;
Locale locGerman = new Locale("de", "DE");
Locale locSpanish = new Locale("es", "CL");
Locale locEnglish = new Locale("en", "us");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ausgabe);
Database = new DatabaseHelper(this);
buttonStart = (Button) findViewById(R.id.buttonStart); //Button zum Ausgeben des Lernstoffes
buttonPause = (Button) findViewById(R.id.buttonPause); //Button zum Pausieren
buttonStop = (Button) findViewById(R.id.buttonStop); //Button zum Stoppen und Zurückkehren zum Startmenü
spinnerStack3 = (Spinner) findViewById(R.id.spinnerStack3); //Spinner zum Auswählen eines Stapels
spinnerStack3.setAdapter(GetTablesArrayAdapter());
toSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) { }
});
}
public void Ausgabe(View v) //Methode wird aufgerufen, wenn einer der Buttons gedrückt wird (siehe xml-Datei -> android:onClick="Ausgabe"
{
if (runAusgabe == false) //Wird nur ausgeführt, wenn nicht gerade eine Ausgabe stattfindet
{
runAusgabe = true; //Dass die Ausgabe nicht nochmal gestartet werden kann
final Cursor words = Database.getWords(spinnerStack3.getSelectedItem().toString()); //Cursor für das Auslesen der Datenbank wird initialisiert und die Methode getWords vom Layout DatabaseHelper ausgeführt, wo die select-Anweisung durchgeführt wird
words.moveToFirst(); //Cursor wird in die erste Reihe gesetzt
Runnable runnableSprachausgabe = new Runnable() { //Sprachausgabe in eine Runnable (Thread) packen
@Override
public void run() {
for(int x = 1; x <= words.getCount();) //so lange noch Zeilen nachkommen, wird die Schleife ausgeführt
{
if(stopSpeak == true) //Bei Stop: Stoppen und beenden
{
toSpeech.stop();
stopSpeak = false;
continueSpeak = true;
runAusgabe = false; //Dass man die Ausgabe wieder starten kann
break;
}
if(continueSpeak == true) //Schauen, ob die Ausgabe pausiert ist
{
toSpeech.setLanguage(locGerman); //Sprache auf Deutsch
toSpeech.speak(words.getString(0), TextToSpeech.QUEUE_ADD, null); //Sprachausgabe des deutschen Wortes
toSpeech.setLanguage(locEnglish);
toSpeech.speak(words.getString(1), TextToSpeech.QUEUE_ADD, null); //Sprachausgabe des englischen Wortes
while (toSpeech.isSpeaking() == true) //Warten, bis Sprachausgabe fertig ist; sonst werden alle Wörter sofort reingespielt und man kann nicht mehr pausieren
{
delay100Millis(1);
}
toSpeech.stop(); //ToSpeek stoppen (brauche ich glaube ich nicht)
if (x != words.getCount()) //Wenn eine Zeile nachfolgt, wird der Curser eine Zeile weiter gesetzt
{
words.moveToNext();
}
x++;
}
else //Wenn pausiert: Delay, dass der Prozessor nicht überhitzt
{
delay100Millis(1);
}
}
runAusgabe = false; //Dass man die Ausgabe wieder starten kann
}
};
Thread threadSprachausgabe = new Thread(runnableSprachausgabe); //In einen Thread packen
threadSprachausgabe.start(); //Und starten
}
else
{
Toast.makeText(this, "Warten, bis Sprachausgabe beendet ist", Toast.LENGTH_SHORT).show();
}
}
public void Pause (View v) //Beim Pause/Resume Button: zwischen true und false wechseln
{
if (runAusgabe == true)
{
if (continueSpeak == true)
{
continueSpeak = false;
Toast.makeText(Ausgabe.this, "Ausgabe pausiert", Toast.LENGTH_SHORT).show();
}
else
{
continueSpeak = true;
Toast.makeText(Ausgabe.this, "Ausgabe fortgesetzt", Toast.LENGTH_SHORT).show();
}
}
else
Toast.makeText(Ausgabe.this, "Ausgabe muss zuerst gestartet werden", Toast.LENGTH_SHORT).show();
}
public void Stop (View v)
{
stopSpeak = true;
Toast.makeText(Ausgabe.this, "Ausgabe gestoppt", Toast.LENGTH_SHORT).show();
}
public void delay100Millis(int x) //Delay 100 Millisekunden
{
for(int y = 0; y < x; y++)
{
try {
wait(100);
} catch (Exception e) {}
}
}
public ArrayAdapter<String> GetTablesArrayAdapter() //Methode, um die Tabellennamen in einen Adapter zu speichern, um sie in den Spinner im Dialogfenster einzufügen
{
final Cursor tables = Database.getTables();
tables.moveToFirst();
ArrayList<String> stacks = new ArrayList<String>();
for(int i = 0; i < tables.getCount(); i++)
stacks.add(tables.getString(0));
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.activity_ausgabe, stacks);
return adapter;
}
}
Alles anzeigen
Activity Ausgabe:
Code
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Ausgabe">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="133dp"
android:layout_marginLeft="133dp"
android:layout_marginTop="40dp"
android:text="Ausgabe"
android:textSize="30sp" />
<Button
android:id="@+id/buttonStart"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="223dp"
android:onClick="Ausgabe"
android:text="Start" />
<Button
android:id="@+id/buttonPause"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="322dp"
android:onClick="Pause"
android:text="Pause/Resume" />
<Button
android:id="@+id/buttonStop"
android:layout_width="180dp"
android:layout_height="40dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="429dp"
android:onClick="Stop"
android:text="Stop" />
<Spinner
android:id="@+id/spinnerStack3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="132dp"
android:gravity="center_horizontal" />
</RelativeLayout>
Alles anzeigen