Gehen Gesten auch ohne Layout xml ?

  • Hallo,
    nachdem ich so vor mich hin gepusselt habe läuft meine App, an der ich lernen wollte auch schon ganz gut.
    Ich habe im Moment nur noch ein Problem:
    Es gelingt mir nicht bei einer Activity, die nicht auf einer Layout XML basiert, sondern wo erst alle Objekte im Activitycode zur Laufzeit erzeugt werden einen GestureOverlayView so einzubauen, dass es funktioniert
    In den anderen Activitys funktioniert dieser Code:


    Nur, weil ich kein View aus einer Layout xml erstellen kann stehe ich auf dem Schlauch.
    Kann mir jemand aus meiner Denkblockade helfen?
    Blockierte und wartende Grüße,
    schymura :S

  • Hallo ChampS,
    danke schon mal für die Antwort.
    Aber leider habe ich ja das Problem, dass ich

    Code
    View inflate = getLayoutInflater().inflate(R.layout.activity_info_main, null);


    diese Zeile ja in einer Activity, die keine Laylouy-Datei besitzt nicht in die "gestureOverlayView" einfügen kann.....
    Weitere erwartungsvolle Grüße, schymura ^^

  • Hallo ChampS,
    da habe ich (Anfänger in Java und Android) wohl irgendwas nicht richtig verstanden...

    Zitat

    wenn das implementieren klappt musst du das auch nichtmehr

    Wie kann ich denn

    Code
    View inflate = getLayoutInflater().inflate(R.layout.activity_info_main, null);


    einfügen, wenn ich kein Layout habe, aber GestureOverlayView das Layout braucht, damit er Gesten über Schalter und so weiter nicht beachtet?
    Falls es dir nicht zu viel ist, dann mach mir das doch bitte über 1,2 Quelltextzeilen klar.
    Erwartungsvolle Grüße, schymura ^^

  • Hallo ChampS,
    danke für den Link, den hatte ich jedoch auch schon durchgetestet....

    Zitat

    er benutzt dann das gesetzte activity layout soweit ich weiß.

    Ja, das ist das Problem.... Was also wird genutzt, wenn es kein Activity Layout gibt?
    Ein falsche Layout, also zum Beispiel das einer anderen, in der App vorhandenen Activity kann man zwar einbinden, jedoch fürht es beim Laufen zu einem Absturz.


    Weitere erwartungsvolle Grüße, schymura :-X

  • Hallo ChampS

    Zitat

    wie soll eine activity kein layout haben?

    das ist halt möglich, wenn man, wie ich schon beim Stellen der Frage geschrieben habe

    Zitat

    erst alle Objekte im Activitycode zur Laufzeit erzeugt werden

    keine Layout Datei (xml) für die Activity hat, sondern das Layout wenn du so willst, erst im Code der Activity erzeugt, indem man dort die einzelnen Objekte beim Erzeugen auch positioniert.


    Den von dir geposteten Link habe ich vollständig, so weit es meine sehr ungenügenden Englisch-Kenntnisse zu lassen, durchgearbeitet.


    Schöne Grüße, schymura ^^

  • nein du verstehst das was falsch, die activity hat also wohl ein layout, nur weil du das zur laufzeit generierst und nicht im code definierst ändert das nichts an der tatsache das das generiert layout in dem interface genutzt wird

  • Ich glaube, ihr würfelt gerade 'layout' und 'contentView' durcheinander.
    Ein via XML definiertes Layout muss die Activity nicht haben. Wohl braucht sie aber einen ContentView.
    Dieses getLayoutInflater.inflate() sorgt ja nur dafür, dass aus dem via XML definierten Layout irgendwie die Root View extrahiert wird.
    Im nächsten Schritt würde diese dann via setContentView() gesetzt.


    Im Link wäre es dann ungefähr so:

    Java
    GestureOverlayView gestureOverlayView = new GestureOverlayView(this);
    gestureOverlayView.addOnGesturePerformedListener(this);
    setContentView(gestureOverlayView);


    Das GestureOverlayView hat jetzt natürlich kein unterliegendes View, sollte aber dennoch zumindest die Gesten abfangen.
    Falls nicht (beispielsweise, weil es ein View braucht um seine Grenzen zu sehen, bis wo hin es die Gesten auffangen soll), musst du programmatisch ein View mit den gewünschten Dimensionen erstellen und einhängen.
    Also einfach das, was dort mit layoutInflater.inflate() gemacht wird händisch nachbauen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Lucas de Vil,
    habe deinen Vorschlag (natürlich) sofort getestet.
    Ergebins: App-Absturz, genau als wenn ich dem setContentView() irgend eine falsche View untergeschoben hätte.
    Lasse ich die Zeile

    Code
    setContentView(gestureOverlayView);


    weg, so geht es fehlerfrei, aber halt auch ohne Gestenerkennung....
    Vielliecht sollte ich noch schreiben, dass es sich bei der Activity um eine PreferenceActivity handelt.
    Und ob ich den Aufruf der create-Methode vor oder nach dem setContentView mache ist völlig egal....
    Die ersten 3 Zeilen der create-Methode sind

    Code
    private PreferenceScreen createPreferenceHierarchy() {
    PreferenceScreen roots = getPreferenceManager().createPreferenceScreen(this);	
    setPreferenceScreen(roots);


    Aber das kann es eigentlich nicht sein, meine ich.......
    Schöne, fragende Grüße, schymura ?(

  • Hallo Lucas de Vil,
    hast ja Recht, hatte ich nicht gemacht, Schusseligkeit von mir.

    Code
    01-15 16:37:07.359: D/AndroidRuntime(1372): Shutting down VM
    01-15 16:37:07.359: W/dalvikvm(1372): threadid=1: thread exiting with uncaught exception (group=0x40018578)
    01-15 16:37:07.359: E/AndroidRuntime(1372): FATAL EXCEPTION: main
    01-15 16:37:07.359: E/AndroidRuntime(1372): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.schymura.biorhythmus/com.schymura.biorhythmus.EinstellungenActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'


    Das ist die Fehlermeldung, wenn ich

    Code
    setContentView(gestureOverlayView);

    vor dem Aufruf der create-Methode

    Code
    PreferenceScreen createPreferenceHierarchy()

    setzen und dann der gleiche Fehler

    Code
    01-15 16:37:07.359: W/dalvikvm(1372): threadid=1: thread exiting with uncaught exception (group=0x40018578)
    01-15 16:37:07.359: E/AndroidRuntime(1372): FATAL EXCEPTION: main
    01-15 16:37:07.359: E/AndroidRuntime(1372): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.schymura.biorhythmus/com.schymura.biorhythmus.EinstellungenActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'


    wenn ich sie erst danach aufrufe.
    Schöne, hoffende Grüße, schymura :)

  • Joah, du hast da wohl einen ListAdapter am Laufen. Der kann nicht ohne ein ListView mit der Id android.id.list.
    Wirf den raus und das sollte laufen. ;)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Lucas de Vil,
    ja, ich habe da einen Listadapter am Laufen, dfen ich aber nicht erzeugt habe, sondern der allein schon durch

    Code
    public class EinstellungenActivity  extends  PreferenceActivity implements OnPreferenceChangeListener, OnGesturePerformedListener {


    diese Zeile erzeugt wird.
    Da dann der GestenLiustener anscheined eine Liste voraussetzt in einer PreferenceActivity hab ich ja auch die Frage gestellt, wie man es machen kann mit den Gesten ohne Layout.xml.
    Jede andere Activity laäuft so, nur halt die PreferenceActivity nicht.


    Über PreferenceActivity nachdenkende Grüße, schmyura ?(

  • Naja, PreferenceActivity erbt von ListActivity, ListActivity benötigt ZWINGEND ein ListView mit genannter ID.


    Du kommst also nicht umhin, dem GestureOverlay ein eben solches mitzugeben.

    Java
    ListView preferencesList = new ListView(this);
    preferencesList.setId(android.R.id.list);
    gestureOverlayView.addView(preferencesList);
    setContentView(gestureOverlayView);


    Das liegt aber nicht daran, das Gesten ohne Layout nicht gehen. Das liegt daran, dass PreferencesActivity als Subklasse von ListActivity zwingend ein ListView mit passender ID benötigt.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • im übrigen hat jede activity ein layout.


    layout heißt eine rootview mit inhalt.


    ob ich den spaß über setContentView setze oder es inflate ist irrelevant.



    aber lucas hat richtig erkannt dein problem liegt im moment eher bei der liste.

  • im übrigen hat jede activity ein layout.
    layout heißt eine rootview mit inhalt.


    Ich würde ein einfaches leeres View nicht als Layout bezeichnen. Das kann man seiner Activity aber auch als ContentView unterjubeln.
    Tatsächlich würde ich nur die Layouts als Layout bezeichnen, also ViewGroup und alle direkt oder indirekt davon abgeleiteten Klassen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • nö eine View ist imho ein Container in den du dann wieder andere Views packen kannst


    es ist ein leeres layout aber meiner meinung nach immernoch ein layout.


    denn die view wird von der activity ja auch angezeigt, es ist einfach nur leer.


    ich mein eine html seite hat trotzdem ein layout
    laut wikipedia ist ein layout "Ein professionelles Layout besteht aus sämtlichen abstrakten Elementen mit definierten Eigenschaften, ist aber zunächst ohne Inhalt"


    somit ist eine einzelne view einfach ein leeres layout :P

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!