Von App Inventor zu Android Studio: Hier Multiscreens?

arnony

arnony

Neues Mitglied
0
Hallo

ich möchte so langsam den Umstieg von App Inventor zu Android Studio wagen.
Meine nächste App wollte ich in beiden parallel entwickeln und so die Unterschiede kennenlernen. Android Studio ist ein ganz anderes Kaliber.

Kann mir jemand verraten was das Äquivalent zu "open new screen" ist? Ich möchte mehrere Unterseiten eröffnen, praktisch wie Schritt 1 Schritt 2 etc. Muss ich mehrere XML Layouts anlegen? Wie springe ich von einem zum nächsten?
 
Das, was du vermutlich als "Screen" meinst, sind "Activities". Für diese brauchst du eine Klasse, die von Activity erbt und das Aussehen wird durch ein XML-Layout definiert (außer man lässt es dynamisch machen).

Öffnen kann man Activities durch Intents: Starting Another Activity | Android Developers
 
Hahaha... oh gott ich glaube ich werde alt.

Also kann ich mir erstmal im alten Frontepage Stiel eine acivity_fullscreen2.xml dann eine acivity_fullscreen3.xml etc. zusammenklicken?

Unter src/res/layout ? Wenn ich damit fertig bin würde ich dann schauen wie ich das Java mäßig zusammengefummelt bekomme ;)
 
Für alle anderen die auch grade anfangen wie ich:

Habs gefunden. Wird hier nochmal nett für Android Studio erklärt.
Adding a Second Activity in Android Studio - YouTube

Jeder neue Screen ist eine neue Aktivität in der Java Klasse und im XML Design.
Das XML wird automatisch mitangelegt beim erstellen der neuen Java Klasse.
Kann man aber im java Code hier anpassen wenn man bereits zuvor XMLs erstellt hat:

setContentView(R.layout.activity_fullscreen2);

("Wenn man's nicht dynamisch macht" ;) )

Alles unter Vorbehalt. Möchte nur zukünftigen Googlern weiterhelfen.

Der ursprüngliche Beitrag von 11:19 Uhr wurde um 11:50 Uhr ergänzt:

Hm ich bekomme jetzt "Leider wurde App-Name beendet" beim Start im Emulator.
Ich hab lediglich die Start XML geändert und den Button auf die Screen2Activity verlinkt..

Wie bekomme ich raus wo der fehler ist? Im Code ist nichts mehr rot.
 
Zuletzt bearbeitet von einem Moderator:
Logcat!

Ich vermute, dass du die neue Activity nicht in der AndroidManifest deklariert hast, aber pure Vermutung, ohne Logcat kann man dir nichts richtiges sagen...
 
danke danke danke.

du hast vollkommen recht das wirds sein. das sind genau die kleinen Anstöße die ich brauche um weiterzukommen. ich schau sofort nach
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app" >

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.app.FullscreenActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/FullscreenTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Screen2Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/title_activity_scrren2"
android:theme="@style/FullscreenTheme" >
</activity>
</application>

</manifest>

Hmm doch scheint automatisch eingefügt worden zu sein.


Logcat hat ja doch Fehler ausgespuckt:

03-24 08:12:46.942 1118-1118/com.example.app E/AndroidRuntime FATAL EXCEPTION: main
Process: com.example.app, PID: 1118
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.app/com.example.app.FullscreenActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:3813)
at com.example.app.FullscreenActivity.<init>(FullscreenActivity.java:165)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
************at android.app.ActivityThread.access$800(ActivityThread.java:135)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:136)
************at android.app.ActivityThread.main(ActivityThread.java:5017)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:515)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
************at dalvik.system.NativeStart.main(Native Method)
 
Zuletzt bearbeitet:
Nur mal so, deine Screen2Activity wurde sogar doppelt deklariert in der manifest-Datei :D
 
  • Danke
Reaktionen: arnony
Thx. Ist korrigiert. Crash ist noch da.

Die FullscreenActivity gehört zu screen1.xml und sollte die sein, die beim App Start gestartet wird. Ich nehme an hier irgendwo liegt auch schon der Fehler.
 
Zuletzt bearbeitet:
Zeig mal deinen Code rund um Zeile 165 deiner FullscreenActivity.java
 
das ist auch so ne sache.. wo blende ich hier die zeilennummern ein?? bin grad unterwegs. schaue heute abend sofort.
 
Im Menü View -> Active Editor -> Show Line Numbers.

Alternativ wird auch in der Statuszeile recht bspw. sowas angezeigt "66:10" -> 66. Zeile, 10. Zeichen
 
ab 165:
Intent intent = new Intent(this, Screen2Activity.class);


/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, Screen2Activity.class);
startActivity(intent);
}
}

*unschuldig guck*

Der ursprüngliche Beitrag von 20:10 Uhr wurde um 21:30 Uhr ergänzt:

Hab dem Code einem anderen Tuturial angepasst. lautet jetzt ab Zeile 165:


public void buttonOnClick(View v) {
Button button=(Button) v;
startActivity(new intent(getApplicationContext(), Screen2Activity.class));
}
}

Stürzt jetzt auch nicht mehr ab. Aber dafür passiert bei einem Button Click auch nichts.

Das intent war erst rot. Dann bin ich mit ALT+ENTER drauf, dann hat er mir eine Intent Class angelegt. Drinnen steht:

package com.example.app;

import android.content.Context;
import android.content.Intent;

/**
* Created by Chris on 24.03.2014.
*/
public class intent extends Intent {
public intent(Context applicationContext, Class<Screen2Activity> screen2ActivityClass) {
}
}


+++++++++++

Dritter Versuch. Alle Button Codes deaktiviert und einfach im XML Editor auf dem Button unter onClick folgendes ausgewählt: @string/title_activity_screen2

Jetzt passiert was, wenn man den Button klickt, aber nichts gutes => Absturz. :-/
 
"new intent" -> Java ist Case-sensitive!

"intent" (mit kleinem i) gibts eben nicht, weshalb du mit der ALT+ENTER-Lösung eine neue Klasse erstellt hast, was du aber garnicht willst.

Intent wird immer mit großem I geschrieben.
 
arnony muss noch viel lernen....
Neuer Tag neues Glück!

Der ursprüngliche Beitrag von 11:07 Uhr wurde um 12:07 Uhr ergänzt:

Code lautet jetzt:

public void buttonOnClick(View v) {
Button Button=(Button) v;
((Button)v).setText("clicked");
startActivity(new Intent(getApplicationContext(), Screen2Activity.class));
}
}

Beim Button Click passiert genau nichts. auch wird er nicht auf "clicked" gesetzt. Füge ich

Intent Intent = new Intent(this, Screen2Activity.class);

vorher ein crashed die App. Der Button heisst definitiv auch "Button" großgeschrieben.

Gibt es irgendwo fertige Projekte für Android Studio die man importieren kann und auf deren Grundlage man arbeiten / lernen kann?
 
Wir ordnest du die Methode buttonOnClick dem button zu? Du musst sie entweder in der XML-Datei einstellen (beim button android:onClick="buttonOnClick"), oder in der java-Datei in der onCreate Methode, ungefär so:
findViewbyId(R.id.Button).setOnClickListener(new OnClickListener { [..] buttonOnClick(v); [..] }

Wenn du weder das eine noch das andere tsut, dann wird deine Methode nie aufgerufen.

Übrigens, was du da machst ist ganz großer Mist. Button ist die Klasse für den Knopf, aus der Android-Library. Genau wie Intent. Durch die Anweisung
Button Button
überdeckst du die Klasse "Button" mit deiner Variable "Button". Variablen in Java immer klein schreiben. Es ist egal wie dein Button in der XML-Datei heißt, das spielt nur eine Rolle wenn du ihn mit R.id.Button referenzierst. Die Objektvariable in java kannst du ganz anders nennen, wie ist egal, aber eben nicht wie eine vorhandene Klasse ;-)
 
Habs jetzt im XML editor zugeordnet! Der Button text wird nach dem Klick auch geändert! Dann stürzt die App wieder app Yeha.. ohne Logcat Error..

public void buttonOnClick(View v) {
Button button=(Button) v;
((Button)v).setText("clicked");
startActivity(new Intent(getApplicationContext(), Screen2Activity.class));
}
}
 
Warum es nicht funktioniert weiß ich nicht. Da muss aber irgendwas im LogCat stehen, schau noch mal genau. Aber zu deinem Code:

Button button=(Button) v;
((Button)v).setText("clicked");

Du legst eine Variable "button" vom Typ "Button" an, und weist ihr die übergebene View v zu, soweit so korrekt. Aber du machst dann nichts damit, sondern benutzt in der nächsten Zeile direkt v. Also entweder du schreibst in der zweiten Zeile button.setText("clicked"), oder du löscht die erste Zeile, denn so ist sie unnötig :) (Android Studio müsste dir "button" auch unterkringeln, da die Variable nie benutzt wird)
 
  • Danke
Reaktionen: arnony
gut sieht jetzt so aus:
public void buttonOnClick(View v) {
((Button)v).setText("clicked");
startActivity(new Intent(getApplicationContext(), Screen2Activity.class));
}
}


muss man den intent jetzt noch vorbereiten?
Intent intent = new Intent(this, Screen2Activity.class);

Logcat wirft nichts aus. Ich start AS mal neu.

Der ursprüngliche Beitrag von 15:47 Uhr wurde um 15:49 Uhr ergänzt:

Projekt templates würden mir echt weiterhelfen, wo diese Funktion schon benutzt wird... bin schon drei Tage an dieser simplen Funktion :-/
 
Nein, vorbereiten muss man da eigentlich nichts, außer du willst Daten mit übergeben (intent.putExtra). Eigentlich scheint das alles korrekt zu sein, und wenn die Activity im Manifest korrekt angegeben ist müsste es laufen. Es kann natürlich sein dass du in deiner aufzurufenden Activity einen Fehler hast, oder in der dazugehörigen XML-Datei, der dann deine App zum Absturz bringt.
 
Siehe da nach dme Neustart geht Logcat auch wieder...

threadid=1: thread exiting with uncaught exception (group=0xb1a12ba8)
03-25 10:59:28.182 2289-2289/com.example.app E/AndroidRuntime FATAL EXCEPTION: main
Process: com.example.app, PID: 2289
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.Screen2Activity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.app.util.SystemUiHiderHoneycomb.setup(SystemUiHiderHoneycomb.java:74)
at com.example.app.Screen2Activity.onCreate(Screen2Activity.java:61)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
************at android.app.ActivityThread.access$800(ActivityThread.java:135)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
************at android.os.Handler.dispatchMessage(Handler.java:102)
************at android.os.Looper.loop(Looper.java:136)
************at android.app.ActivityThread.main(ActivityThread.java:5017)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:515)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
************at dalvik.system.NativeStart.main(Native Method)
 

Ähnliche Themen

R
  • Robby1950
2
Antworten
23
Aufrufe
1.004
Robby1950
R
D
Antworten
23
Aufrufe
2.505
Data2006
D
5
Antworten
0
Aufrufe
1.141
586920
5
Zurück
Oben Unten