1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Einer Activity ein Menü "vorschalten"?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MarcelT., 10.06.2012.

  1. MarcelT., 10.06.2012 #1
    MarcelT.

    MarcelT. Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    10.06.2012
    Phone:
    Samsung Galaxy S3
    Mahlzeit,

    mein Problem sieht wie folgt aus:
    Ich bin gerade dabei ein kleines (wirklich kleines) Spielchen zu entwickeln, da ich mich jetzt zwar schon mehrere Monate mit Java beschäftige, allerdings noch nicht lange mit Android-App-Programmierung.
    Zum Start habe ich in Anlehnung an ein paar Tutorials schon die grobe Mechanik implementiert und die funktioniert auch soweit.
    Nun wollte ich dem ganzen aber noch ein Menü vorschalten, wenn man die App startet (Spiel starten, Highscores, Hilfe, etc). Zumindest den Rohbau mit einem einfach "Spiel Starten"-Button.
    Meine Idee war, dass ich der bisherigen Activity (main.class):

    Code:
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Window;
    
    public class Main extends Activity {
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(new GameView(this));
        }
    }

    eine neue Activty "vorschalte", die in ungefähr so aussieht:

    Code:
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class StartActivity extends Activity implements OnClickListener {
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            Button button = (Button) findViewById(R.id.button1);
            button.setOnClickListener((OnClickListener) this);
        }
        
       
        public void onClick (View v) {
            
            startActivity(new Intent(this,Main.class));
        }
    }                

    Also einfach einen Button, der beim Klick dann die main-Activity aufruft. Jedoch findet er die main-Activity nichtmehr, wenn ich in der Manifest-Datei die andere als Start setze

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="de.marcel.catchthemall"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="8" />
    
        <application
            android:icon="@drawable/staricon"
            android:label="@string/app_name" >
            <activity
                android:name=".StartActivity"
                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>

    Daher meine Frage: Muss ich die main noch irgendwo mit angeben (wenn ja wo) bzw. ist das überhaupt ein "guter" Weg oder geht das ganze eleganter?

    MfG Marcel
     
  2. Sentenza, 10.06.2012 #2
    Sentenza

    Sentenza Erfahrener Benutzer

    Beiträge:
    224
    Erhaltene Danke:
    65
    Registriert seit:
    15.08.2011
    Die Activitys müssen auf alle Fälle beide in der Manifest Datei stehen (also zwei Activity-Tags). Wobei ich das bei mir über den Grafischen Editor eingegeben habe. Woran Android erkennt, welche zuerst gestartet werden soll, weiß ich nicht... vermutlich die mit dem ersten Tag.
    //Edit oder die Angabe mit dem "Intent-Filter" steuert die Start-Activity, das würde mehr Sinn machen. Ich würde jedenfalls an deiner Stelle erstmal alles so lassen wie es ist, aber zusätzlich die Main-Acitivity über die Grafische Benutzeroberfläche hinzufügen (AndroidManifest.xml --> Application --> Application Nodes --> Add... )
     
    MarcelT. bedankt sich.
  3. MarcelT., 10.06.2012 #3
    MarcelT.

    MarcelT. Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    10.06.2012
    Phone:
    Samsung Galaxy S3
    Ah, das ist natürlich der naheliegendste Weg die hinzuzufügen, danke.
    Aber auch nach dem hinzufügen scheint er immernoch die main nicht zu finden.

    Manifest sieht nun nach dem hinzufügen über die Grafische Benutzeroberfläche so aus:
    Code:
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="de.marcel.catchthemall"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk android:minSdkVersion="8" />
    
        <application
            android:icon="@drawable/staricon"
            android:label="@string/app_name" >
            <activity
                android:name=".StartActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name="Main"></activity>
        </application>
    
    </manifest>
    Trotzdem schmiert mir die App beim klicken auf den Button (welcher in der StartActivity ist) noch direkt ab, anstatt zum Spiel zu wechseln.
    (Vorher hatte ich ja nur die main als Activity und da ging das Spiel halt direkt beim Starten der App auch schon los).

    Auszug aus dem Log:
    Code:
    06-10 17:53:16.705: E/AndroidRuntime(860): FATAL EXCEPTION: main
    06-10 17:53:16.705: E/AndroidRuntime(860): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.marcel.catchthemall/de.marcel.catchthemall.Main}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.os.Handler.dispatchMessage(Handler.java:99)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.os.Looper.loop(Looper.java:123)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at java.lang.reflect.Method.invokeNative(Native Method)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at java.lang.reflect.Method.invoke(Method.java:521)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at dalvik.system.NativeStart.main(Native Method)
    06-10 17:53:16.705: E/AndroidRuntime(860): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
    06-10 17:53:16.705: E/AndroidRuntime(860):     at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:172)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.Activity.requestWindowFeature(Activity.java:2719)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at de.marcel.catchthemall.Main.onCreate(Main.java:12)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    06-10 17:53:16.705: E/AndroidRuntime(860):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    06-10 17:53:16.705: E/AndroidRuntime(860):     ... 11 more
    

    Edit: Ok habs gefunden. Musste "requestWindowFeature(Window.FEATURE_NO_TITLE);" in der main-Activity auskommentieren, warum ist mir zwar nicht bewusst, weils vorher ja auch geklappt hat, aber nun leitet der Button wenigstens aufs Spiel weiter, das ist ja schonmal schön :) Theoretisch sollte das ja auch mit "requestWindowFeature(Window.FEATURE_NO_TITLE);" ja auch mit dem Theme.Black.NoTitleBar.Fullscreen zu lösen sein.
     
    Zuletzt bearbeitet: 10.06.2012
  4. Sentenza, 10.06.2012 #4
    Sentenza

    Sentenza Erfahrener Benutzer

    Beiträge:
    224
    Erhaltene Danke:
    65
    Registriert seit:
    15.08.2011
    Ich weiß nicht, vielleicht muss das .Main heißen statt einfach nur Main, ansonsten bin ich überfragt ^^
     
  5. MarcelT., 11.06.2012 #5
    MarcelT.

    MarcelT. Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    10.06.2012
    Phone:
    Samsung Galaxy S3
    Ein neuer Tag ein neues "Problem", passt zwar nicht direkt zum Ursprungsthema allerdings muss man ja nicht für jedes Problem einen neues Thema aufmachen.

    Und zwar möchte ich aus einer normalen Klasse eine Activity aufrufen, geht das einfach so?
    Als Beispiel in meinem Spiel: Das Level ist vollständig gelöst (Liste aller Items die einzusammeln sind ist leer) und daher möchte ich zurück ins Hauptmenü beispielsweise.
    Also irgendwie sagen, wenn Liste leer, dann führe StartActivity aus (wo ja mein Menü liegt).

    Habe danach auch schon gegooglet, aber nichts hilfreiches finden können.
    Ist bestimmt wieder so ein "Man sieht den Wald vor lauter Bäumen nicht"-Problem.
     

Diese Seite empfehlen