• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    LWEEKAndroid development
    Diskuse o vývoji aplikací pro platformu Android.
    -----------------
    Tipy, Triky, Postřehy, Začátečnický help, Nápady na nové aplikace.

    Oficiální developerská stránka: http://developer.android.com
    Něco málo v češtině na WiKi android fora: http://wiki.androidforum.cz/index.php/Programov%C3%A1n%C3%AD
    Článek na Zrojáku: http://zdrojak.root.cz/clanky/vyvoj-pro-android-ii/

    Docela zajímavé tutoriály přímo od vývojářů ze Sony Ericsson:

    na tvorbu vlastního View adapteru
    http://blogs.sonyericsson.com/developerworld/2010/05/20/android-tutorial-making-your-own-3d-list-part-1/

    zajímavý nápad na zoomování jedním prstem - aneb vytváření gest
    http://blogs.sonyericsson.com/developerworld/2010/05/18/android-one-finger-zoom-tutorial-part-1/
    rozbalit záhlaví
    VIRTUALVOID
    VIRTUALVOID --- ---
    DATEL: potom sa ti este moze stat, ze sa cela aktivita zrusi (nedostatok pamati, etc.) a bude treba robit fragment znova. mal som nedavno podobny problem s nyxdroidom.
    ale zas, ja som tam robil "prasarny" s tymi fragmentami...
    ZACK
    ZACK --- ---
    DATEL: pred onStop je vzdycky onPause.
    DATEL
    DATEL --- ---
    Tak jsem si do toho fragmentu přidal všechny onXxx metody týkající se životního cyklu a zjistil jsem, že když přeruším aplikaci stisknutím Home tlačítka, tak se zavolá onPause, kde se Cursor i databáze zavře, pak onStop. Když vzápětí aplikaci vyvolám z launcheru, tak se volá až onStart a onResume. Tj. vůbec se nezavolá onActivityCreated, kde mám vytvoření modelu a zavolání updateList() metody, která vytváří Cursor, dává ho CursorAdapteru a ten předá FragmentListu.

    Takže ve výsledku to opravdu shodilo celou aplikaci, protože žádný Cursor neexistoval. Přesunul jsem tedy to co bylo v onActivityCreated do onStart a zatím to jede bez problému.

    Akorát teď nevím, jestli bych neměl přesunout i to co je v onPause (tj. uzavření kurzoru a db) do onStop?

    No, to je tak, když se začátečník spoléhá na tutoriály :(
    DATEL
    DATEL --- ---
    REDGUY: ten kurzor je jediný, který se používá a na jednom místě.
    Tu onPause() ve FragmentList jsem tedy naimplementoval takto:

        public void onPause() {
            if (!this.c.isClosed()) {
                this.c.close();
            }
            
            this.model.close();
            
            super.onPause();
        }
    


    Při překlápění obrazovky mi to zatím tu výjimku nevyhodilo, ale bohužel to teď náhodně shazuje aplikaci, ať už při zastavení tlačítkem Home nebo naopak znovu vyvolání. Ale taky ne pokaždé, prostě náhodně. Ta výjimka je:

    06-04 18:10:32.493: E/AndroidRuntime(2284): FATAL EXCEPTION: main
    06-04 18:10:32.493: E/AndroidRuntime(2284): java.lang.RuntimeException: Unable to pause activity {cz.test/cz.test.activity.MainActivity}: android.database.StaleDataException: Access closed cursor
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3348)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3305)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3288)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread.access$2500(ActivityThread.java:125)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.os.Handler.dispatchMessage(Handler.java:99)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.os.Looper.loop(Looper.java:123)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread.main(ActivityThread.java:4627)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at java.lang.reflect.Method.invokeNative(Native Method)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at java.lang.reflect.Method.invoke(Method.java:521)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at dalvik.system.NativeStart.main(Native Method)
    06-04 18:10:32.493: E/AndroidRuntime(2284): Caused by: android.database.StaleDataException: Access closed cursor
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:99)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.support.v4.widget.CursorAdapter.getItemId(CursorAdapter.java:226)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.widget.AbsListView.onSaveInstanceState(AbsListView.java:885)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.widget.ListView.onSaveInstanceState(ListView.java:3625)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.view.View.dispatchSaveInstanceState(View.java:6068)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:1197)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.widget.AdapterView.dispatchSaveInstanceState(AdapterView.java:759)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:1184)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.view.View.saveHierarchyState(View.java:6051)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.support.v4.app.FragmentManagerImpl.saveFragmentViewState(FragmentManager.java:1574)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1594)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1655)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:527)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.Activity.performSaveInstanceState(Activity.java:1036)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1180)
    06-04 18:10:32.493: E/AndroidRuntime(2284): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3330)
    06-04 18:10:32.493: E/AndroidRuntime(2284): ... 12 more
    REDGUY
    REDGUY --- ---
    DATEL: Kdyz si do toho onPause das nejakou debugovaci hlasku, opravdu se vola pred tim, nez ti ho hodi tu vyjimku? A vis jiste ze se ta vyjimka netyka nejakeho jineho kurzoru nez co zaviras?
    DATEL
    DATEL --- ---
    Ahoj, mám začátečnický dotaz k SQLite Cursorům, když jsou použité ve vlastním Adapteru v ListFragmentu. Vycházel jsem původně ze seriálu na Zdrojáku, prohledal jsem kupu příspěvků na stackoverflow.com i jinde, ale výsledek se nedostavil.
    Problém je, že ať dělám co dělám, tak mi při testování v emulátoru při otáčení obrazovky vyhazuje do logu výjimku, že nemám uzavřený cursor. Aplikace je rozložená zhruba takto:

    Třída s modelem, kde je vnitřní třída SQLiteOpenHelper a dále metody pro zpracování, mimo jiné getRecords, která vrací Cursor. Dále mám třídu s ListFragmentem, která je posléze vložena do hlavní activity. V této třídě mám metodu updateList:

    public void updateList() {
            Context ctx = getActivity();
            this.c = this.model.getRecords();
            TachoListAdapter adapter = new TachoListAdapter(ctx, this.c, 0);
            setListAdapter(adapter);
            //this.model.close();
    }
    


    model.close() zavírá databázi. No a právě když otáčím obrazovku (nebo i v jiných případech, kdy dojde ke "zničení") mi to vyhazuje výjimku do logu (ale aplikaci to neshodí), že není uzavřen Cursor.

    Zkoušel jsem dát tedy this.c.close() před model.close(), ale to nepomohlo. Pak jsem to zkusil dát do onPause() fragmentu. To bohužel taky nepomohlo. Taky mi občas vyhodil výjimku, že zavírám Cursor, který je již zavřený, tak jsem to upravil takto:

    public void onPause() {
            super.onPause();
            if (!this.c.isClosed()) {
                this.c.close();
            }
            
            //this.model.close();
    }
    


    Jenže i přesto mi tu výjimku se zavřeným Cursorem vyhazoval. Zkoušel jsem dát volání super.onPause() u za to volání uzavření cursoru, zkoušel jsem různě přesunovat zavírání modelu, ale nic.

    Už tu nad tím laboruju 2 dny, ale nepodařilo se mi to vyřešit :( Můžete mi prosím někdo poradit, jak tedy správně používat databázi a kurzory ve Fragmentech (konkrétně v tom FragmentList). Já měl za to, že uzavření toho kurzoru v onPause() by mělo fungovat, ostatně tohle jsem našel i v mnoha příspěvcích na netu, ale tam to bylo vždycky v Aktivitě.

    Díky za pomoc.
    DRIZDIK
    DRIZDIK --- ---
    Potřebuju aby kdy na jednom view začnu šmrdlat prstem a přejedu na druhý, který je napozicovaný nekde nad ním v layoutu, tak aby si mi i na tom druhém projevovaly TouchEventy .. projevujou se mi ale pořád jen na tom zadním. Jak to donutit ke polupráci?
    VIRTUALVOID
    VIRTUALVOID --- ---
    SPIRAL_FORCE: lubi sa mi ten napad s monitoredactivity :)
    SPIRAL_FORCE
    SPIRAL_FORCE --- ---
    udelal sem malou knihovnicku pro interaktivni orezavani obrazku, vice zde: https://github.com/biokys/cropimage
    mozna se nekomu bude hodit ;-)
    P0CIN
    P0CIN --- ---
    Hledám programátora android, případně iOS aplikací.

    Mám v hlavě myšlenku na jednu aplikaci, bohužel o programování nevím absolutně nic, takže bych to potřeboval zrealizovat a případně probrat, jestli to má vůbec cenu.

    Pro více info SZ :)
    Díky
    DARKIE
    DARKIE --- ---
    pocujte, nie je develeoperska konzola, cez ktoru sa publikuju aplikacie volajaka rozmrdana? nastavil som totiz v manifeste ze akcelerometer je required a ono mi to tam hodilo ze 0 supported devices. ked som z manifestu vyhodil tuto vec tak v pohode to tomu priradilo divajsis potom
    JACKER
    JACKER --- ---
    DEEJAYY: Ahoj, super díky. Byl bych pak moc rád, kdybys mi mohl napsat, v čem jsou České Noviny lepší. Já podle toho zdokonalím, díky.

    KAPITAN_JACK: Také děkuji za vyzkoušení a za hodnocení! :)
    DEEJAYY
    DEEJAYY --- ---
    JACKER: vyzkouším, zatím jsem si dost oblíbil České noviny ...
    KAPITAN_JACK
    KAPITAN_JACK --- ---
    Vypadá dobře, co by se mělo zlepšit je české zpravodajství.
    Badum tish
    http://www.badum-tish.com/
    JACKER
    JACKER --- ---
    Ahoj,
    vytvořil jsem aplikaci na prohlížení českého zpravodajství, jako např.: ČT24, iDNES, Lidovky, Novinky.cz, ...
    Všechno je v jedné aplikaci.

    Budu moc rád pokud mojí aplikaci vyzkoušíte a napíšete mi svůj názor.
    https://play.google.com/store/apps/details?id=com.jakubflaska.novinkyrss

    Máte prosím nápad, co by se dalo zlepšit?

    Děkuju moc.
    SIRLOON
    SIRLOON --- ---
    ANONYM_CZ: no ve starych programovacich jazycich a skriptech sme debugovali jenom pres logy a bylo to mnohdy bezpecnejsi a pohodlnejsi, nez se oprcavat s nejakyma breakpointama ;)
    ANONYM_CZ
    ANONYM_CZ --- ---
    VIRTUALVOID: +1 za debug pomoci "kokot" .. uz jsme tak vyresili tolik zaseku, ani to nespocitam ;)
    VIRTUALVOID
    VIRTUALVOID --- ---
    stacilo si len zanadavat, tak, ze to pocul cely barak :)
    VIRTUALVOID
    VIRTUALVOID --- ---
    aha uz viem kde je problem, takto to bolo treba robit :

    		FragmentManager fm = getFragmentManager();
    
    		homeFragment = (WriteupsHomeFragment) fm.findFragmentByTag("wuhome");
    		currentFragment = writeupsFragment = (WriteupsFragment) fm.findFragmentByTag("wulist");
    
    		FragmentTransaction ft = fm.beginTransaction();
    
    		if (homeFragment == null) {
    			homeFragment = new WriteupsHomeFragment();
    		} else {
    			Log.w(Constants.TAG, "KOKOT1");
    		}
    		ft.add(R.id.empty_view_ll, homeFragment, "wuhome");
    		ft.hide(homeFragment);
    
    		if (currentFragment == null) {
    			currentFragment = writeupsFragment = new WriteupsFragment();
    		} else {
    			Log.w(Constants.TAG, "KOKOT2");
    		}
    		ft.add(R.id.empty_view_ll, writeupsFragment, "wulist");
    		ft.show(writeupsFragment);
    
    		ft.commit();
    
    VIRTUALVOID
    VIRTUALVOID --- ---
    REDGUY: problem je nasledovny (ak by si chcel vediet, konkretne sa to tyka nyxdroidv2) :
    - vyrabam fragmenty, ktore su odvodene len od Fragment (t.j. ziadny ListFragment, etc), mam na to nejaky dovod...
    - aby som sa vyhol recreatovaniu viewu, v metode aktivity onCreate tieto fragmenty pridam cez add a v zavislosti od toho, ktory ma byt viditelny ako prvy ten jeden show a druhy hide.
    - vsetko funguje ok
    - data dostanem do listviewu
    - teraz stlacim home tlacitko a pouzivam ine aplikacie.
    - save instance state
    - po case sa zavola onTrimMemory co naznacuje aj to, ze aktivita, ktoru som predtym pausol cez home uz pravdepodobne neexistuje a treba ju vyrobit.
    - teraz pustam app znova, chcem aby sa recreatla aktivita s fragmentami a vsetko ide dokolecka.
    - restore instance state sa zavola tiez
    - ???
    - fragmenty niesu restornute/recreated.
    VIRTUALVOID
    VIRTUALVOID --- ---
    REDGUY: za ten svet neviem prinutit restornut listview vo fragmente :)
    Kliknutím sem můžete změnit nastavení reklam