Hilfe bei Android-App

C

Crymes

Guest
Hallo,
Ich habe jetzt entschlossen meine Ballsimulation noch auf mein Galaxy S3 zu portieren:daumen:.
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?

Code:
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:what:) ? Kennt ihr vll. ein gutes Tuorial zur Eingabe?
 
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
 
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?
 
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.
 
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?
 
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.
 
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:hail: Wie kann ich die app zum Testen starten??
 
Kannst du die App über den normalen Launcher / Icon starten? Hast du im Manifest die zu Startende Activity eingestellt?
 
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.
 
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 :(
 
Naja, sie funktioniert ja auch nicht korrekt.
Ich kann allerdings, ohne den Code zu sehen, ziemlich wenig Helfen. :D

Zeig mal deine MainActivity und dein Manifest.
 
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:
Code:
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)
Code:
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
Code:
<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.
 
Ich sag doch im Manifest fehlt was. :schief:

So ist es korrekt und startet die Activity.

Code:
<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>
 
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 :daumen:

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?
 
Zuletzt bearbeitet:
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
 
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.
 
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.
 
Ok ich habe heute noch ein Bisschen gecodet, hab mal das Grundgerüst implementiert. Meine Dateien sehen jetzt so aus:
Main:
Code:
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:

Code:
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:
Code:
<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:
Code:
<?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 ?
 
Du nutzt doch die Main.xml gar nicht ...

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