# Hilfe bei Android-App



## Crymes (13. April 2013)

Hallo,
Ich habe jetzt entschlossen meine Ballsimulation noch auf mein Galaxy S3 zu portieren.
Ich habe schon ein paar Erfahrungen mit Java, die Android Bibliotheken sind mir jedoch völlig fremd.
Jetzt habe ich ein paar Fragen:

-Wie würdet ihr zeichnen? Ich hätte jetzt mal das Canvas genommen, ist OpenGL vll. besser für den Anfang?
-Ich habe mir erstmal die Funktion zur Lifecycle-Verwaltung hingeschrieben, warum ist bei mir jedes Override außer bei onCreate falsch obwohl es auch in der Dokumentation so steht?


```
import android.app.Application;
import android.os.Bundle;


public class BallSimulation extends Application {
	
	//Variables and Objects
		
	@Override
    public void onCreate()
	{		
    	super.onCreate();
	}    
	@Override
    public void onStart()
    {    	
    	super.onStart();
    }
	@Override
	public void onPause()
	{
		super.onPause();
	}
	@Override
	public void onResume() 
	{
	    super.onResume();  
	}
	@Override
	public void onStop()
	{
		super.onStop();
	}
	public void onDestroy()
	{
		super.onDestroy();
	}

}
```

Wie mache ich das mit der Eingabe? Läuft das über Listener wie bei Java und laufen die dann auch parallel (nicht wie bei Applets) ? Kennt ihr vll. ein gutes Tuorial zur Eingabe?


----------



## Leandros (13. April 2013)

Du extendest Application. Application hat die Lifecycle Methods nicht. Du musst in deinem fall, da du ja ein Fenster haben möchtest, Activity extenden.
Außerdem sind die auch nicht alle wirklich korrekt, es ist z.B onCreate(Bundle savedInstanceState)

Canvas ist für den Anfang Ok, aber nicht optimal.


Fang mal hier an: http://developer.android.com/training/index.html


----------



## Crymes (13. April 2013)

Ok, ich hab mich noch ein Bisschen eingelesen. Für die Eingabe brauch ich unter anderem die Bibliothek Android.view.
In der bekomme ich das ontouchevent.
Jetzt will ich aber den touch event meiner ganzen App/Fenster haben und nicht auf einem Button, wo muss ich da den Callback registrieren und muss ich dann überhaupt noch etwas in der Designer xml-Datei eintragen?


----------



## Leandros (13. April 2013)

Erstmal eine Frage, welches IDE nutzt du oder wie compilest du? Mit Ant, Maven?

Um imports musst du dir nämlich normal keine Sorgen machen, das macht alles die IDE für dich.

Um den Callback zu registrieren, gehst du in die XML deiner Activity rein (nicht vergessen setContentView) zu callen, und weist dem layout eine id zu (z.B android:id="@+id/wasauchimmer).
Dann kannst du den onClick listener auf die view setzen.


----------



## Crymes (13. April 2013)

Ich benutze das vorkonfigurierte Eclipse SDK was man von der Android Seite herunrerladen kann.
Ich werde das Morgen ( oder wenns warm wird übermorgen) mal probieren.
Kann ich, wenn ich mein Handy im Debugmodus hab und die App darauf teste, irgendwas kaputtmachen?


----------



## Leandros (13. April 2013)

Das vorkonfigurierte SDK ist gut, damit kannst mit strg+shift+o automatisch importieren, dann musst du dir da keine Gedanken drum machen.
Nein, kannst nichts mit kaputt machen.


----------



## Crymes (16. April 2013)

Kennt ihr eine Lösung für folgendes Problem?
Ich habe mein Galaxy S3 angeschlossen, USB Debugging Modus und fremde Apps installieren aktiviert. In Eclipse wird es auch angezeigt und wenn ich auf Run drücke wird die App installiert, ich kann sie im Taskmanager des S3 als installiert sehen.
Aber danach passiert nichts mehr Wie kann ich die app zum Testen starten??


----------



## Leandros (16. April 2013)

Kannst du die App über den normalen Launcher / Icon starten? Hast du im Manifest die zu Startende Activity eingestellt?


----------



## Crymes (16. April 2013)

Im Manifest habe ich gar nichts verstellt, der Emulator funktioniert auf meinem Netbook nicht, nach einer Stunde ist immer noch das Android Logo da. Ich werde denke ich das ganze mal aufm PC probieren.


----------



## Leandros (16. April 2013)

Kannst du die App über den normalen Launcher / Icon starten?


----------



## Crymes (16. April 2013)

Wenn du das Handy meinst: Nein, da nirgends ein Icon ds ist, ich sehe es nur im Taskmanager unter installierte Anwendungen und da kann ich es nicht starten.
Wenn du das run Symbol in Eclipse meinst: Aucj nicht, da weder drr Emulator noch mein Handy funktionieren.

Ohme zu Probieren ist eine App zu Entwickeln ja vollkommn sinnlos


----------



## Leandros (16. April 2013)

Naja, sie funktioniert ja auch nicht korrekt. 
Ich kann allerdings, ohne den Code zu sehen, ziemlich wenig Helfen. 

Zeig mal deine MainActivity und dein Manifest.


----------



## Crymes (16. April 2013)

Ich hänge dem Beitrag mal den kompletten Workspace-Ordner des Projektes an.
Den Hauptcode habe ich schon Android-Konform geschrieben, es ist halt die Ein- und ausgabe die wieder komplett anders ist.

Hier sind ein paar Dateien als Text:

Main-Datei:

```
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class BallSimulation extends Activity {
		
	//Variables and Objects
	DrawView Zeichenansicht;
	
	@Override
    public void onCreate(Bundle savedInstanceState)
	{		
    	super.onCreate(savedInstanceState);    	
    	requestWindowFeature(Window.FEATURE_NO_TITLE);
    	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    	Zeichenansicht = new DrawView(this);
    	setContentView(Zeichenansicht);
    	Zeichenansicht.requestFocus();
	}    
	@Override
    public void onStart()
    {    	
    	super.onStart();
    }
	@Override
	public void onPause()
	{
		super.onPause();
	}
	@Override
	public void onResume() 
	{
	    super.onResume();  
	}
	@Override
	public void onStop()
	{
		super.onStop();
	}
	@Override
	public void onRestart()
	{
		super.onRestart();
	}
	public void onDestroy()
	{
		super.onDestroy();
	}	
}
```

Code für ein-und Ausgabe (soweit ich es verstanden habe sollte hier eigentlich alles ablaufen)

```
import android.content.Context;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;


public class DrawView extends View implements OnTouchListener {

	public DrawView(Context context) 
	{
		super(context);		
		setFocusable(true);
		setFocusableInTouchMode(true);
		this.setOnTouchListener(this);
	}
	@Override
	public void onDraw(Canvas canvas)
	{
		
	}
	public boolean onTouch(View view, MotionEvent event)
	{
		return(true);
	}

	
}
```

Und das Manifest

```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ballsimulation"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" android:debuggable="false">
    </application>

</manifest>
```

Mit dem debuggable hatte ich ein Bisschen rumgespielt, als es aur true war ht sich auch nichts getan.


----------



## Leandros (16. April 2013)

Ich sag doch im Manifest fehlt was. 

So ist es korrekt und startet die Activity.


```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ballsimulation"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" android:debuggable="false">
   
        <activity
            android:name=".BallSimulation"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
```


----------



## Crymes (16. April 2013)

Hey Danke, jetzt hab ich ein Symbol bei den Apps und kann die Anwendung starten.
Die App hängt sich zwar auf aber jetzt kann ich wenigstens meienn code testen 

Edit: Jetzt hab ich nochmal eine Frage: Kann ich in meier BallSimulation Datei, in der auch auch die Lebenszyclus Methoden drin stehen, folgendes Schreiben: View myView = new View(); ?
Dann hätte ich mir doch auch eine Bildschirmebene erstellt, mit der sich "arbeiten" lässt, oder?
Könnt ich dann der myView einfach die Eingaben Listener anhängen?


----------



## Leandros (16. April 2013)

Was möchtest du für Views? Deine Bälle? Die kannst du überall erzeugen.

Würde aber wie gesagt erstmal ein Layou erstellen (in XML), dieses per setContentView laden und zu diesem layout dann die Views mit addView() hinzufügen.

Falls du aber es vernünftig haben wills: OpenGL


----------



## Crymes (17. April 2013)

Ich brauch doch ein Objekt der Klasse View um ihm meine touch Listener anzuhängen, oder geht das auch ohne?
Im Endeffekt will ich aus Benutzersicht eigentlich nur einen schwarzen Bildschirm auf dem dann alles gezeichnet wird. Am Besten wäre es, wenn ich der kompletten Activity die Listener anhängen könnte.

OpenGL werd ich mir nochmal anschauen, die neuen Versionen sind halt für mich abschreckend da man ja für alles einem Shader braucht.


----------



## Leandros (17. April 2013)

Wie bereits gesagt, erstellt ein XML layout, mit z.B einem RelativeLayout welches den gesamten Bildschirm füllt (layout_height und layout_width = match_parent). 
Das kannst mit setContentView(R.layout.xxx) setzen und dann das RelativeLayout finden (findViewById(R.id.xxxxxx)) und zu diesem Views fügst du deine Views hinzu, z.B so: 

BallView v = new BallView(mContext);
v.setOnClickListener(new BallOnClickListener());
layout.addView(v);

Würde einen eigenen custom view für die Bälle erstellen.


----------



## Crymes (17. April 2013)

Ok ich habe heute noch ein Bisschen gecodet, hab mal das Grundgerüst implementiert. Meine Dateien sehen jetzt so aus:
Main:

```
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;


public class BallSimulation extends Activity {
		
	//Variables and Objects
	BallView Anzeige = new BallView(this); 			
	
	@Override
    public void onCreate(Bundle savedInstanceState)
	{		
    	super.onCreate(savedInstanceState);  
    	requestWindowFeature(Window.FEATURE_NO_TITLE);
    	getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    	setContentView(Anzeige);
	}    
	@Override
    public void onStart()
    {    	
    	super.onStart();
    	Anzeige.start();
    }
	@Override
	public void onPause()
	{
		super.onPause();
		Anzeige.stop();
	}
	@Override
	public void onResume() 
	{
	    super.onResume();  
	    Anzeige.start();
	}
	@Override
	public void onStop()
	{
		super.onStop();
		Anzeige.stop();
	}
	@Override
	public void onRestart()
	{
		super.onRestart();
		Anzeige.start();
	}
	public void onDestroy()
	{
		super.onDestroy();
		Anzeige.stop();
	}	
}
```

View Klasse in der alles abläuft:


```
import android.content.Context;
import android.graphics.Canvas;
import android.view.View;

public class BallView extends View{
	
	//Variables and Objects
	Ballverwaltung Ballengine;
	int blänge;
	int bbreite;
	boolean isrunning;
	
	public BallView(Context context)
	{
		//Initialisieren
		super(context);
		setFocusable(true);
		requestFocus();
		setFocusableInTouchMode(true);
		
		//Add Listener
		
		//Add Objects
		Ballengine = new Ballverwaltung(100);		
		
		//Initialise Variables
		blänge = 0;
		bbreite = 0;
		isrunning = true;
				
	}
	@Override
	public void onSizeChanged(int x, int y, int oldx, int oldy)
	{
		blänge = x;
		blänge = y;
	}
	@Override
	public void onDraw(Canvas canvas)
	{
		//Draw Text
		
		//Draw Balls
		Ballengine.DrawBalls(canvas);		
	}
	public void stop()
	{
		isrunning = false;
	}
	public void start()
	{
		gameloop();
	}
	private void gameloop()
	{
		while(isrunning)
		{
			//Handle Input
			
			//Do computations
			Ballengine.Bewegung();
			Ballengine.KollisionBall();
			Ballengine.KollisionRand(blänge, bbreite);
			
			//Draw all the stuff
			invalidate();
		}
	}
}
```

die Manifest:

```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ballsimulation"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" android:debuggable="true">
   
        <activity
            android:name=".BallSimulation"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
```
Und die main.xml in der das Design definiert ist:

```
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/firstlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

</RelativeLayout>
```

Wenn ich die App starte öffnet sich auf dem Handy erst ein Fenster, dann wird alles bis auf die Statusleiste schwarz und es kommt "BallSimulation wurde angehalten".

In Eclipse kommt folgendes von der Logcat als Fehlermeldung:
Fatal Exception: main
E/AndroidRuntime(22358): Caused by: java.lang.ClassNotFoundException: com.example.ballsimulation.BallSimulation

Liegt das an der main.xml ?


----------



## Leandros (17. April 2013)

Du nutzt doch die Main.xml gar nicht ... 

Musst schon die gesamte LogCat anschauen, mit dem Auszug kann man nicht viel anfangen.


----------



## Crymes (17. April 2013)

Macht Sinn, hier ist die gesamte LogCat:

```
04-17 20:21:05.860: D/dalvikvm(18935): Late-enabling CheckJNI
04-17 20:21:05.920: D/AndroidRuntime(18935): Shutting down VM
04-17 20:21:05.920: W/dalvikvm(18935): threadid=1: thread exiting with uncaught exception (group=0x418fb2a0)
04-17 20:21:05.925: E/AndroidRuntime(18935): FATAL EXCEPTION: main
04-17 20:21:05.925: E/AndroidRuntime(18935): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.ballsimulation/com.example.ballsimulation.BallSimulation}: java.lang.ClassNotFoundException: com.example.ballsimulation.BallSimulation
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2024)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.ActivityThread.access$600(ActivityThread.java:140)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.os.Handler.dispatchMessage(Handler.java:99)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.os.Looper.loop(Looper.java:137)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.ActivityThread.main(ActivityThread.java:4898)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at java.lang.reflect.Method.invoke(Method.java:511)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at dalvik.system.NativeStart.main(Native Method)
04-17 20:21:05.925: E/AndroidRuntime(18935): Caused by: java.lang.ClassNotFoundException: com.example.ballsimulation.BallSimulation
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1057)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015)
04-17 20:21:05.925: E/AndroidRuntime(18935): 	... 11 more
```


----------



## Leandros (17. April 2013)

Ändere im Manifest mal 


```
<activity
            android:name=".BallSimulation"
```


zu 



```
<activity
            android:name="com.example.ballsimulation.BallSimulation"
```


----------



## Crymes (17. April 2013)

Hat nichts geholfen, jetzt kommt dieser Log: 

```
04-17 20:53:07.150: D/dalvikvm(27207): Late-enabling CheckJNI
04-17 20:53:07.220: D/AndroidRuntime(27207): Shutting down VM
04-17 20:53:07.220: W/dalvikvm(27207): threadid=1: thread exiting with uncaught exception (group=0x418fb2a0)
04-17 20:53:07.225: E/AndroidRuntime(27207): FATAL EXCEPTION: main
04-17 20:53:07.225: E/AndroidRuntime(27207): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.ballsimulation/com.example.ballsimulation.BallSimulation}: java.lang.ClassNotFoundException: com.example.ballsimulation.BallSimulation
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2024)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.ActivityThread.access$600(ActivityThread.java:140)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.os.Handler.dispatchMessage(Handler.java:99)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.os.Looper.loop(Looper.java:137)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.ActivityThread.main(ActivityThread.java:4898)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at java.lang.reflect.Method.invokeNative(Native Method)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at java.lang.reflect.Method.invoke(Method.java:511)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at dalvik.system.NativeStart.main(Native Method)
04-17 20:53:07.225: E/AndroidRuntime(27207): Caused by: java.lang.ClassNotFoundException: com.example.ballsimulation.BallSimulation
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1057)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015)
04-17 20:53:07.225: E/AndroidRuntime(27207): 	... 11 more
```


----------



## Leandros (17. April 2013)

Dann hast du deine BallSimulations Klasse in einem anderen package. Da ich leider nicht hellsehen kann, musst du es mir sagen oder selber fixen.


----------



## Crymes (18. April 2013)

So, ich habe heute nochmal ein  neues Projekt erstellt und meinen Code kopiert, nach ein Bisschen Debuggen habe ich endlich meinen ersten Meilenstein erreicht: Es werden im Programmcode erzeugte Bälle simuliert!!!!!

Jetzt habe ich noch ein paar Fragen:
Ich habe folgenden Code: 

```
public void onDraw(Canvas canvas)
	{
		//Draw Text		
		
		//Draw Balls
		Ballengine.DrawBalls(canvas);
		
		//Do a further Loop
		gameloop();
	}
```

und diesen:

```
private void gameloop()
	{
		if(isrunning == true)
		{
			//Handle Input			
			
			//Do computations			
			Ballengine.Bewegung();
			Ballengine.KollisionBall();
			Ballengine.KollisionRand(blänge, bbreite);
			
			//Draw all the stuff
			invalidate();	
		}
	}
```
Ist dies eine gute Art einen Loop zu realisieren? Ich hatte den Gameloop erst in einer while Schleife, doch damit kam kein Bild zustande ???

Wie füge ich am Besten einen KeyListener zu meiner View Klasse hinzu? Über ein Interface?


----------



## Leandros (18. April 2013)

Bei deinen Methoden / Variablen Namen läuft es mir echt Kalt den Rücken runter. 

Naja, man kann es so machen, ist aber jenseits von Performant, weil Androids View Klassen dafür nicht wirklich ausgelegt sind.

Was für ein Listener willst du realisieren?


----------



## Crymes (18. April 2013)

Ich möchte beim Endanwender folgendes:
-Finger auf Display legen, ziehen und loslassen: Ball in die Richtung "schießen"
-Finger auf Ball tippen: Ball löschen
-2 Finger spreizen, zusammenführen: Eine Variable für die Ballgröße ändern
-2, 3 Finger gleichzeitig auf Display legen, Bälle der Reihe nach spawnen, löschen.

Ich denke ich brauche einen onTouch Listener und einen onGesture eListener, hab aber noch nicht so viel darüber gelesen.


----------



## Leandros (18. April 2013)

Ich könnte dir das jetzt groß und ausführlich erklären, aber einfacher ist es, dich hierrauf zu verweisen: Using Touch Gestures | Android Developers


----------



## Crymes (19. April 2013)

So, 
nach einem guten Stück Arbeit und extrem lästigem Debugging (Anfängerfehler  ) hat meine app nun endlich "Silberstatus" erreicht!!! 
Erstmal noch vielen Dank an Leandros für die Hilfe  .
Ich häng die unsignierte .apk Datei und den Quellcode an, würde mich freuen wenn das ein paar testen könnten, ihr müsst auf eurem Handy mindestens android 4 laufen haben und das installieren von Apps, die nicht aus dem Play-Store sind erlauben (unter Einstellungen - Sicherheit).

Jch habe noch ein paar Probleme:
1. Warum hält die app nicht an wenn ich sie verlasse?
2. ICh habe ein Array fester Größe und lösche ein Objekt aus Beliebiger Stelle, dafür verwende ich folgenden Code:


```
for(int position=d; position<anzahl; position++)
{
	ballliste[position] = ballliste[position+1];
}		
anzahl--;
```
Wobei anzahl die Elemente im Array darstellt und position die Stelle darstellt. d ist eine Zahl innerhalb der im Array vorhandenen Elemente. Wenn ich jetzt das letzte Element habe, kommt ein Fehler, da position+1 größer als mein Array ist. 
Habt ihr eine Lösung?

Wenn jemand sonst noch Optimierungsvorschläge hat - immer her damit


----------



## Leandros (19. April 2013)

In der App.zip ist auf jeden fall keine apk drin, sondern die support library.


----------



## DarkMo (20. April 2013)

Crymes schrieb:


> Wenn ich jetzt das letzte Element habe, kommt ein Fehler, da position+1 größer als mein Array ist.
> Habt ihr eine Lösung?


 mach doch einfach ne fallunterscheidung:
if(letztes element) lösche letztes element; (also einfach anzahl--)
else rücke alle ab element auf; (also das, was du jetzt schon hast)

hmm, wäre vllt sinniger, das so zu machen:
if(nicht letztes element) -> dein code
anzahl--

so wird die anzahl in jedem fall verringert, das aufrücken erfolgt aber nur, wenns nicht das letzte is, was gelöscht werden soll.


----------



## Crymes (20. April 2013)

So, dann ist jetzt hier die richtige .apk Datei, habs extra getestet 

Viel Spaß beim Testen


----------



## Crymes (21. April 2013)

So, jetzt ist der Goldstatus erreicht 
Das Problem mit dem nicht - Pausieren war, dass ich die Bewegung per Zeitmessung ausführe. Wenn ich jetzt die Appm Pausiere ist es bis zum nächsten aufruf der Funktion ein extrem großeß Zeitfenster und die Bälle sind ganz woanders hinbewegt worden - muss man erstmal finden den Fehler .
Ich stell die App wieder in den Anhang, wem noch Fehler auffallen sollten der sagt einfach bescheid


----------



## Festplatte (4. Juli 2013)

Hab sie mir mal geladen, ist echt super programmiert!


----------

