• ú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í
    MRAKY
    MRAKY --- ---
    P19: tohle znam. ale ja bych chtel spise neco uceleneho. neco nad cim sednu na 3-4 dny a projdu si to systematicky...
    P19
    P19 --- ---
    MRAKY: http://developer.android.com/sdk/installing/studio.html Já to všechno bral odsuď a přišlo mi to dobrý.
    MRAKY
    MRAKY --- ---
    nez se pustim do vlastniho zkoumani - znate nekdo ucelenou knizku/ zdroj , popisujici android studio pro cloveka co nezna intelij? nejaky uceleny set rad, doporuceni, seznam zkratek pro zefektivneni prace atd...
    DATEL
    DATEL --- ---
    DATEL, DATEL: tak chyba objevena - v té vyhledávací podmínce nemá být _ID, ale CONTACT_ID:

    String where = ContactsContract.Data.CONTACT_ID + " = "
            + uriData.getLastPathSegment()
            + " AND " + ContactsContract.Data.MIMETYPE + " = '"
            + ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE
            + "'";
    DATEL
    DATEL --- ---
    DATEL: v tom where je chyba, to "ContactsContract.Data.MIMETYPE" samozřejmně nemá být uvnitř řetězce, ale má být připojen. Pak podmínka vypadá správně takhle:

    _id = 14 AND mimetype = 'vnd.android.cursor.item/postal-address_v2'


    Nicméně to stejně pořád nic nevrací.
    DATEL
    DATEL --- ---
    Ahoj, potřeboval bych poradit s načtením detailu kontaktu ze systémové databáze. Prošel jsem kupu diskuzí a všude je to v podstatě stejné:

        Uri uriData = data.getData();
    
        String where = ContactsContract.Data._ID + " = "
                + uriData.getLastPathSegment()
                + " AND ContactsContract.Data.MIMETYPE = '"
                + StructuredPostal.CONTENT_ITEM_TYPE
                + "'";
        Log.d(TAG, "where: " + where);
    
        String[] projection = new String[] {
                StructuredPostal.STREET,
                StructuredPostal.CITY,
                StructuredPostal.POSTCODE,
                StructuredPostal.REGION,
                StructuredPostal.COUNTRY};
    
        Cursor cursor = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
                projection,
                where,
                null,
                null);
        if (cursor.moveToFirst()) {
            mEtStreet.setText(cursor.getString(0));
            mEtCity.setText(cursor.getString(1));
            mEtPostcode.setText(cursor.getString(2));
            mEtRegion.setText(cursor.getString(3));
            mEtCountry.setText(cursor.getString(4));
        } else {
            Log.e(TAG, "nic nenalezeno");
        }
    
        cursor.close();
    


    Log pro "where" je např.:

    where: _id = 14 AND ContactsContract.Data.MIMETYPE = 'vnd.android.cursor.item/postal-address_v2'

    To ID je získáno z intentu:

    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent, 1);
    


    V adresáři mám testovací 3 kontakty, pouze lokální v telefonu. Každý kontakt má adresu, ale pokaždé jiný typ (doma, práce, jiné). Problém je, že kurzor je vždy prázdný. Chybu tam nikde nevidím a tento postup byl většinový.
    DACAN
    DACAN --- ---
    vtipnej javadoc :)
    platform_frameworks_base/services/java/com/android/server/power/ElectronBeam.java at master · android/platform_frameworks_base · GitHub
    https://github.com/...orks_base/blob/master/services/java/com/android/server/power/ElectronBeam.java
    DATEL
    DATEL --- ---
    DRIZDIK, DRIZDIK: super, díky moc za objasnění! Jdu zrušit předávání entity přes argumenty :)
    DRIZDIK
    DRIZDIK --- ---
    DRIZDIK: Tam si ale zase hodně fieldů už stavu udežuje samo, protože na každém view se volá onSaveInstanceState automaticky, ale když máš třeba nějaký robalovačky v layoutu nebo složitější logiku, tak si stav uložíš pomocí onSaveIntance
    DRIZDIK
    DRIZDIK --- ---
    DATEL: b) je správně ;-)
    saveInstance je na fragmentu třeba pro formulářový pole, který bys měl změněný oproti původnímu stavu a další věci nezávislý na datech (entitě), entitu určitě nedávat do saveInstance.
    Arguments je třeba kdybys měl list entit a chtěl říct, že tenhle fragment zobrazuje ID 10, tak si desítku předáš v arguments, změníš jeden field a otočíš displej, tam je saveInstance na řadě
    DATEL
    DATEL --- ---
    DRIZDIK: DRIZDIK: díky za objasnění. Akorát mi teda do toho zas nepasuje ten můj původní problém, že z aktivity předávám entitu do fragmentu přes Parcelable objekt a pak ji znovuvytvářím. Jsou tedy dvě možnosti:

    1. skutečně používat pro entitu Parcelable, a to jak při vytváření fragmentu (getArguments), tak při ukládání stavu (onSaveInstanceState)

    2. krom jiných způsobů použít třeba to co jsem psal, tj. aktivita implementuje rozhraní, které fragment vynucuje (kontrola v onAttach), a pak si fragment sám načte entitu z aktivity, ukládá do ní data, a tedy není potřeba (pokud to není potřeba pro jiná data) entitu ukládat pomocí onSaveInstanceState a vytvářet pomocí getArguments atd. Akorát teda... když to tak píšu, tak to asi není úplně správné řešení z hlediska používaných vzorů, ikdyž je to zase rychlé a jednoduché řešení.

    Je obecně akceptovatelný postup bodu 2?
    DRIZDIK
    DRIZDIK --- ---
    Dulezity je tam, ze se budes spolehat pouze na neparametricky konstruktor.
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Nainicializujes z Arguments a pokud neni null, tak prepises z savedInstance
    DATEL
    DATEL --- ---
    DRIZDIK: takže v onCreateView mám v podstatě dva vstupy - parametr Bundle savedInstanceState, který bude naplněn, pokud implementuju onSaveInstaceState() a něco tam předám, a pak pomocí metody getArguments() můžu získat jiný Bundle. Přednost by měl mít ten ze savedInstanceState parametru, pokud je naplněn. Což mi ale nezaručuje stejný způsob vytvoření fragmentu, ne? V argumentech z getInstance() může být úplně něco jiného než když něco uložím v savedInstanceState... Tak teď vlastně nevím, jak bych to měl správně použít, aby to bylo konzistentní - do savedInstanceState bych měl ukládat minimálně to samé, co je v argumentech?
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Nutí (umoňuje) ti to zpracovat jak obnovení, tak vytvoření fragmentu stejným zůsobem. Fragment musí mít bezparametrický konstruktor, aby ho mohl systém obnovit v případě jeho zavření a arguments ti mezi tím udrží.
    DATEL
    DATEL --- ---
    Díky, nakonec jsem to udělal tak, že v base aktivitě / fragementu inicializuju potřebné věci ke GA a pak jen v konkrétních aktivitách / fragmentech zavolám hit. Nechceme totiž sledovat úplně všechno.

    Ještě bych se vrátil k mému předchozímu dotazu (DATEL, DRIZDIK) - proč se vlastně používá pro vytvoeřní fragmentu ten vzor přes statickou getInstance() metodu, kdy se jí předávají v parametrech vstupní data, metoda vytvoří instanci a přes argumenty předá do fragmentu? To samé přece můžu udělat přímým voláním konstruktoru s těmi samými parametry...
    Jediné, co mě teda napadá, je nějaká možnost ukládání stavu fragmentu a jeho obnovy automaticky systémem, kdy ukládá vše co je v Bundle objektu (přes getArguments()) - ale jestli to tak skutečně je, to netuším. Ale tohle asi nebude ono, fragment může být zrušen i během práce, tj. data na základě vstupních parametrů už můžou být změněna, tj. ono uchování stavu je podle mě stejně třeba dělat ručně přes onSaveInstaceState() a pak v onCreate() (apod.) obnovit.
    Takže mi stejně u použití getArguments() a getInstance() není jasné, v čem je přínos... Proč tedy?
    ROTTWEILER
    ROTTWEILER --- ---
    DATEL: Stačí udělat něco typu BaseActivity, od které oddědíš a do ní dáš kód na trackování.
    DRIZDIK
    DRIZDIK --- ---
    DATEL: Opravdu to zapíná automatický logování View události pro zobrazení aktivity. Mně funguje správně. Zkoušels to přes "V reálném čase", jestli se tam zobrazuješ?
    DATEL
    DATEL --- ---
    DATEL: hm, tak klasika, hodinu pátrám na netu, nic, napíšu dotaz do diskuzáku a vzápětí najdu odpověď na netu :)

    Takže, nejspíš jde o nějaký bug v SDK, je nutno zavolat nad instancí GoogleAnalytics ještě enableAutoActivityReports(), pak to funguje.

    Google Analytics for Android v4 - Automatic Screen Measurement not working? - Stack Overflow
    http://stackoverflow.com/...google-analytics-for-android-v4-automatic-screen-measurement-not-working

    a posléze

    android - enableAutoActivityTracking not automatically tracking activities? - Stack Overflow
    http://stackoverflow.com/...activitytracking-not-automatically-tracking-activities/23256722#23256722

    Nicméně jsem zjistil, že to je stejně až od API 14, a protože máme aplikaci od API 9, tak to budu muset dělat ručně.
    DATEL
    DATEL --- ---
    DRIZDIK: díky za tip... Vzhledem k tomu, že na vývoj je málo času, tak asi zatím použiju tu variantu, kdy aktivita má k dispozici metodu "getEntity()", kterou si fragment zavolá a získá tak stejnou instanci objektu + po všech změnách v entitě pak fragment zavolá v aktivitě metodu pro oznámení změny.
    DATEL
    DATEL --- ---
    Měl bych otázku ohledně Google Analytics SDK - není mi jasné, jak pracuje volba "ga_autoActivityTracking", když ji zapnu. Podle popisu mám za to, že nepotřebuju pro Aktivity ručně vyvolávat Hit, tj. jak mám u fragmentů:

    mTracker.setScreenName("xxxxxx");
    mTracker.send(new HitBuilders.AppViewBuilder().build());

    a mělo by to být automaticky. Jenže v logu nic nevidím, že by se dělo. Při ručním hitu z fragmentu to tam zaloguje, ale když jdu na aktivitu, tak nic. Asi jsem tuto funkcionalitu špatně pochopil, můžete mi to prosím někdo objasnit? Musím tedy i v těch aktivitách vyvolat ten Hit ručně? K čemu potom to automatické trackování je dobré?
    Kliknutím sem můžete změnit nastavení reklam