Új hozzászólás Aktív témák

  • Illetve még amit akartam, hogy erre:
    public class Discover {

    IntentFilter discoveryFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(_dicoveryReceiver, discoveryFilter);
    IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    registerReceiver(_foundReceiver, foundFilter);

    ...

    }

    mi a csudáért húzza alá nekem a registerReceiver(_dicoveryReceiver, discoveryFilter); és registerReceiver(_foundReceiver, foundFilter); sorokat? A _dicoveryReceiver, és a _foundReceiver fgv-nyek meg vannak alattuk írva pedig.

  • Karma
    félisten

    Sziasztok!

    Kiszeretném írni egy egyszerű stringbe a bluetooth státuszát. Hova kellene tennem, vagy meghívnom ezt a függvényt, hogy folyamatosan fusson le, és változásnál az oda tartozó stringet írja ki? Ugyanis csak a program indításnál fut le így.

    public void BT_stat_Check(){

    TextView t = new TextView(this);
    t = (TextView)findViewById(R.id.BtStat);

    if(bluetooth.isEnabled()){
    //kiírom a bluetooth adatait
    String mydeviceaddress = bluetooth.getAddress();
    String mydevicename = bluetooth.getName();
    status = mydevicename + " : " + mydeviceaddress;
    t.setText(status); // kirakom a képernyőre a státuszt
    }
    else{
    status = "Bluetooth is disabled.";
    t.setText(status);
    }
    }

    Szerintem ez kell neked: [link]

  • Sziasztok!

    Kiszeretném írni egy egyszerű stringbe a bluetooth státuszát. Hova kellene tennem, vagy meghívnom ezt a függvényt, hogy folyamatosan fusson le, és változásnál az oda tartozó stringet írja ki? Ugyanis csak a program indításnál fut le így.

    public void BT_stat_Check(){

    TextView t = new TextView(this);
    t = (TextView)findViewById(R.id.BtStat);

    if(bluetooth.isEnabled()){
    //kiírom a bluetooth adatait
    String mydeviceaddress = bluetooth.getAddress();
    String mydevicename = bluetooth.getName();
    status = mydevicename + " : " + mydeviceaddress;
    t.setText(status); // kirakom a képernyőre a státuszt
    }
    else{
    status = "Bluetooth is disabled.";
    t.setText(status);
    }
    }

  • SektorFlop
    aktív tag

    http://www.cypressnorth.com/blog/mobile-application-development/android-studio-not-working-in-windows-7-or-8-fixed/

    köszi, sikerült elindítani. nekem eszembe se jutott hogy rákeressek :(

  • thon73
    tag

    http://www.cypressnorth.com/blog/mobile-application-development/android-studio-not-working-in-windows-7-or-8-fixed/

    Ez a probléma valahonnét ismerősnek tűnik!! :))
    Mindenesetre ez a 0.1 verzió, ha jól látom. Amíg eljut az első verzióig, még akár ki is nőheti magát. Hajrá, Guglik :K !

  • Konair
    csendes tag

    http://www.cypressnorth.com/blog/mobile-application-development/android-studio-not-working-in-windows-7-or-8-fixed/

  • SektorFlop
    aktív tag

    Sziasztok!

    Láttátok, hogy megjelent az új fejlesztőkörnyezet, az Android Studio? Én kipróbáltam, sztem az Eclipse nagyon megveri...

    Kipróbálom én is.

  • thon73
    tag

    Hm. Úgy látom, a fragmentek kérdéskörével egyedül maradtam. :(( Én végül is változókban (is) tároltam el a visszakapott Fragmenteket. Így sikerült a számukat darabonként egyetlenre korlátozni. Ez az egy példány aztán hol bekerül egy View-be, hol kiveszem onnan. A kód működik, de hogy ez helyes megoldás-e, nem tudom. Gondoltam, azért esetleges későbbi olvasókkal ezt megosztom.

    Egy másik problémával kapcsolatban kérnék viszont jó tanácsot: Látszólag jól működik a program, tehát elfordításra is szabványosan leáll és újraindul. De ha az elfordítást kikapcsolt állapotban végzem el, akkor a program - hibaüzenet nélkül - leáll; pontosabban a Log-on jelentkezik egy le nem kezelt exception, amiről fogalmam sincs, hol ered. Az utolsó log-bejegyzés szerint az onPause lefutott. (minden visszahívást log-oltam) A hiba bekapcsoláskor jelenik meg, és ekkor már nem kapok debug üzeneteket.

    A programot még tesztelem. A kérdés az, hol találhatok leírtást arról, mi (más) történik a programmal miközben a készülék stand-by-ba (és vissza) kapcsol? Azt gondolom, hogy egy onPause-onResume hívásnak kellene következnie, de erről nem találtam infot. Tud valaki esetleg ilyen jellegű forrást?

    A kérdésem második felével kapcsolatban - vagyis, hogy mi történik, amikor a telefon elalszik - is érdekes viselkedést találtam:
    Elalváskor dob egy onPause-onResume-onPause hármast, ébredéskor uez. visszafelé: -onResume-onPause-onResume.
    A tesztet az Eclipse által létrehozott alapprogrammal (sehol egy fragment!) is megcsináltam, eredmény uez.
    Tudja valaki, hogy ennek mi az értelme és magyarázata?

    (((Természetesen elfogadom, hogy minek kell izgasson ez az egész - ha egyszer működik. Csak a személyes gondom az volt, hogy elalváskor a rendszer a második onPause után valamiért belenyúl egy, az onPause-ban már lezárt adatbázisba. Ezt csak úgy tudtam kikerülni, hogy átpakoltam az egészet az onResume-onPause cikluson kívülre, így működik. Ami érdekes, hogy a hiba kizárólag elalváskor, és a második onPause után jelenik meg.)))

  • WonderCSabo
    félisten

    Vagy csak támogatja a pluginjeit? Mintha ilyesmi rémlene.

    De az is lehet, hogy teljes képzavar :D Amúgy mi a gondod evvel a (totál beta) cuccal?

    Nem totál béta cucc. Maga a kódszerkesztő az full stabil, 12 éve működő szoftver.

  • fatal`
    titán

    Tudtommal az IntelliJ nem az Eclipsre épül. Library projecteket kezel. Git support van.

    Vagy csak támogatja a pluginjeit? Mintha ilyesmi rémlene.

    De az is lehet, hogy teljes képzavar :D Amúgy mi a gondod evvel a (totál beta) cuccal?

  • WonderCSabo
    félisten

    Hali!

    Még nem próbáltam, már megszoktam az eclipset. Hogy működik? Library projecteket kezeli? GIT support van?

    Ha jól látom IntelliJ IDEA-ra épül, ami meg, ha jól tudom, akkor az Eclipsere, szóval olyan nagy varázslat ezekszerint nincs. Ellenben érdekelne, hogy mennyire herélték ki. :)

    Tudtommal az IntelliJ nem az Eclipsre épül. Library projecteket kezel. Git support van.

  • fatal`
    titán

    Sziasztok!

    Láttátok, hogy megjelent az új fejlesztőkörnyezet, az Android Studio? Én kipróbáltam, sztem az Eclipse nagyon megveri...

    Hali!

    Még nem próbáltam, már megszoktam az eclipset. Hogy működik? Library projecteket kezeli? GIT support van?

    Ha jól látom IntelliJ IDEA-ra épül, ami meg, ha jól tudom, akkor az Eclipsere, szóval olyan nagy varázslat ezekszerint nincs. Ellenben érdekelne, hogy mennyire herélték ki. :)

  • WonderCSabo
    félisten

    Sziasztok!

    Láttátok, hogy megjelent az új fejlesztőkörnyezet, az Android Studio? Én kipróbáltam, sztem az Eclipse nagyon megveri...

  • SektorFlop
    aktív tag

    Hm. Úgy látom, a fragmentek kérdéskörével egyedül maradtam. :(( Én végül is változókban (is) tároltam el a visszakapott Fragmenteket. Így sikerült a számukat darabonként egyetlenre korlátozni. Ez az egy példány aztán hol bekerül egy View-be, hol kiveszem onnan. A kód működik, de hogy ez helyes megoldás-e, nem tudom. Gondoltam, azért esetleges későbbi olvasókkal ezt megosztom.

    Egy másik problémával kapcsolatban kérnék viszont jó tanácsot: Látszólag jól működik a program, tehát elfordításra is szabványosan leáll és újraindul. De ha az elfordítást kikapcsolt állapotban végzem el, akkor a program - hibaüzenet nélkül - leáll; pontosabban a Log-on jelentkezik egy le nem kezelt exception, amiről fogalmam sincs, hol ered. Az utolsó log-bejegyzés szerint az onPause lefutott. (minden visszahívást log-oltam) A hiba bekapcsoláskor jelenik meg, és ekkor már nem kapok debug üzeneteket.

    A programot még tesztelem. A kérdés az, hol találhatok leírtást arról, mi (más) történik a programmal miközben a készülék stand-by-ba (és vissza) kapcsol? Azt gondolom, hogy egy onPause-onResume hívásnak kellene következnie, de erről nem találtam infot. Tud valaki esetleg ilyen jellegű forrást?

    A hétvégén beleásom magam és ha tudok segítek.

  • thon73
    tag

    Fragmentek körében - tud nekem segíteni valaki? :F

    A kód hosszú, de ha kell elküldöm. A kérdések egyszerűbbek.
    Ha egy Fragment objektumot létrehozok, az - már bizonyos - örökre megmarad.
    Ráadásul, hiába adom ki a remove transactiont (és commit-ot is, persze), utána eltűnik, de az activity újraindulásakor visszalópódzik az elvileg üres View-ba. :W
    A Tag és Id csak akkor él, amikor a Fragment be van rakva a View-ba.

    - Hogyan lehet ezt a létező Fragment-et (remove, commit után) fellelni? ((Az Activity felleli, mert indításkor visszapakolja! De én csak akkor tudom megtalálni, ha egy globális "változóban" tárolom.))
    - vagy hogyan lehetne "destroy"-ra kényszeríteni?
    - Tapasztalta-e már valaki a fentieket, ill. okozott-e ez problémát?
    - Ti ezt hogyan csináljátok?

    A hiba akkor bukott ki, amikor egy amúgy jól működő(?) kód, minden fordításkor szaporítani kezdte a menu elemeket. További vizsgálódáskor találtam ezt, amit a doksi nemigen emleget. A neten a fentiekkel csak kérdés formájában találkoztam, választ nem találtam.
    Előre is köszönöm, ha valaki fáradozik ezzel!

    Hm. Úgy látom, a fragmentek kérdéskörével egyedül maradtam. :(( Én végül is változókban (is) tároltam el a visszakapott Fragmenteket. Így sikerült a számukat darabonként egyetlenre korlátozni. Ez az egy példány aztán hol bekerül egy View-be, hol kiveszem onnan. A kód működik, de hogy ez helyes megoldás-e, nem tudom. Gondoltam, azért esetleges későbbi olvasókkal ezt megosztom.

    Egy másik problémával kapcsolatban kérnék viszont jó tanácsot: Látszólag jól működik a program, tehát elfordításra is szabványosan leáll és újraindul. De ha az elfordítást kikapcsolt állapotban végzem el, akkor a program - hibaüzenet nélkül - leáll; pontosabban a Log-on jelentkezik egy le nem kezelt exception, amiről fogalmam sincs, hol ered. Az utolsó log-bejegyzés szerint az onPause lefutott. (minden visszahívást log-oltam) A hiba bekapcsoláskor jelenik meg, és ekkor már nem kapok debug üzeneteket.

    A programot még tesztelem. A kérdés az, hol találhatok leírtást arról, mi (más) történik a programmal miközben a készülék stand-by-ba (és vissza) kapcsol? Azt gondolom, hogy egy onPause-onResume hívásnak kellene következnie, de erről nem találtam infot. Tud valaki esetleg ilyen jellegű forrást?

  • thon73
    tag

    Bocs, csak úgy értettem, hogy volt-e már valakinek ehhez hasonló tapasztalata. Neki is láttam egy egyszerűsített tesztkódot írni (az enyém meglehetősen hosszú).
    Ez a teszt fragment, egyetlen metódus:

    public class TestFragment extends Fragment
    {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
    TextView tv = new TextView(getActivity());
    tv.setText("Hello világ!");
    return tv;
    }
    }

    És a lényeg: az activity:

    public class MainActivity extends FragmentActivity
    {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    FrameLayout fl = new FrameLayout(this );
    fl.setId(1234);
    setContentView(fl);
    }

    @Override
    public void onResumeFragments()
    {
    super.onResumeFragments();

    FragmentManager fragmentManager = getSupportFragmentManager();

    TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
    if (test == null)
    {
    test = new TestFragment();
    }

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(1234, test, "TEST");
    fragmentTransaction.commit();
    }


    @Override
    public void onPause()
    {
    super.onPause();

    FragmentManager fragmentManager = getSupportFragmentManager();

    TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
    if (test!=null)
    {
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    // fragmentTransaction.detach(test);
    fragmentTransaction.remove(test);
    fragmentTransaction.commit();
    }
    }

    }

    ((Igazából ezeken a kódokon kívül az eclipse saját indítókódján semmit sem kell változtatni, mert a View-k dinamikusan jönnek létre. A rengeteg Log-ot kitöröltem, de akár minden metódus figyelhető a LogCat-ben.))

    A LÉNYEG:

    Sztem. az indítás során az onResumeFragments-ben hozzáadjuk a "TEST" fragmentet,
    leállításnál az onPause-ben eldobjuk. (Ha akarjuk, akkor detach is lehet.)

    A REMOVE UTÁN SZERINTEM A FRAGMENTNEK EL KELLENE PUSZTULNIA A DESTROY FOLYAMÁN!

    Ehhez képest újraindítás után hibaüzenet:
    java.lang.RuntimeException: Unable to resume activity {.fragmenttest.MainActivity}: java.lang.IllegalStateException: Fragment already added: TestFragment{40525cf0 #0 id=0x4d2 TEST}

    Vagyis az eldobott Fragmentünk "visszajött".

    Ugyanez történik ID és Tag alapú keresésnél is: az eldobott Fragment megjelenik
    Ha két (landscape és portrait) layout között váltogatok, akkor még hibaüzenet sem jön, csak a Fragmentek sokasodnak.
    ((Világos, ha a remove átkerül a legelejére, akkor nem lesz hiba, de a Fragment megmarad))

    SZERINTEM:
    A Fragment-ek NEM objektumként működnek, hanem sokkal jobban hasonlítanak az Activity-ra. Vagyis: létrehozás után (ez történik objektumok módjára), mindvégig megmaradnak, csak ide-oda kapcsolgathatjuk őket.
    Az onRetain...-nál annyi különbség lehet, hogy ott érinetetlenül maradnak meg, itt meg a View újra készül.

    Ez azért gond, mert ha egyszer egy Fragmentet valamelyik View-ba bekapcsoltunk, akkor ragaszkodik a saját View-jához, más View ID esetén hibát dob.

    Képzeljünk el egy szituációt: bal oldalon a lista, jobbra az egyes elemek, külön fragmentben. Ha ezt EGY activityvel oldjuk meg, akkor NÉGY fragmentet kell kezelnünk (2 landscape, 2 külön portrait módban) VAGY ha ugyanazt az Id-t adjuk meg a két külön layout-ban lévő fragmentet fogadó View-nak, akkor csak KÉT fragmentet kell kezelnünk.
    Tudom, hogy a KÉT ACTIVITY-vel való kezelést preferálják, de 1. ettől nem tudom meg, miért nem tűnnek el a fragmentek. ((2. Az activity-k közötti kommunikáció miatt ez a megoldás most nem az igazi nekem (de ez a teszt szempontjából lényegtelen))

    Bocs, ha nem teljesen érthető ez, igyekeztem nagyon rövidíteni a kódot. De már csak azért is hajt a kíváncsiság, hogy ez miként műxik.

    Fragmentek körében - tud nekem segíteni valaki? :F

    A kód hosszú, de ha kell elküldöm. A kérdések egyszerűbbek.
    Ha egy Fragment objektumot létrehozok, az - már bizonyos - örökre megmarad.
    Ráadásul, hiába adom ki a remove transactiont (és commit-ot is, persze), utána eltűnik, de az activity újraindulásakor visszalópódzik az elvileg üres View-ba. :W
    A Tag és Id csak akkor él, amikor a Fragment be van rakva a View-ba.

    - Hogyan lehet ezt a létező Fragment-et (remove, commit után) fellelni? ((Az Activity felleli, mert indításkor visszapakolja! De én csak akkor tudom megtalálni, ha egy globális "változóban" tárolom.))
    - vagy hogyan lehetne "destroy"-ra kényszeríteni?
    - Tapasztalta-e már valaki a fentieket, ill. okozott-e ez problémát?
    - Ti ezt hogyan csináljátok?

    A hiba akkor bukott ki, amikor egy amúgy jól működő(?) kód, minden fordításkor szaporítani kezdte a menu elemeket. További vizsgálódáskor találtam ezt, amit a doksi nemigen emleget. A neten a fentiekkel csak kérdés formájában találkoztam, választ nem találtam.
    Előre is köszönöm, ha valaki fáradozik ezzel!

  • thon73
    tag

    Sziasztok!

    Nem teljesen idevág a kérdésem, de tudja vki azt, hogy egy IMEI azonosítószám hossza az milyen hosszú lehet?

    "The IMEI (14 decimal digits plus a check digit) or IMEISV (16 digits) includes information on the origin, model, and serial number of the device. The structure of the IMEI/SV are specified in 3GPP TS 23.003." Itt:
    IMEI Wiki

  • pvt.peter
    őstag

    Sziasztok!

    Nem teljesen idevág a kérdésem, de tudja vki azt, hogy egy IMEI azonosítószám hossza az milyen hosszú lehet?

  • thon73
    tag

    A move alapból tartalmazza a downt (mivel hozzáérsz a kijelzőhöz / lenyomod az egeret, másképp nincs Move androidon) így az egész ág teljesen felesleges.

    (#672) Sianis: Nem használom az emulátort csak app release előtti tesztre így a problémát nem tudom mi okozza, viszont, ha Intel CPU-d van és tud VT-t, akkor tedd fel a HAXM-et, sokkal gyorsabban indul és fut az emu.

    Kötözködés nélkül, és csak a teljesség kedvéért: single-tap esetén csak A_DOWN generálódik először, és csak mozdítás után A_MOVE. A konkrét példában ez nem látható (tehát igazad van), de ha az else-t kivesszük, akkor megfigyelhető, mert közeli érintésre (és nem mozgásra) is mozdul a joy.
    A megelőző példában viszont először én sem tettem be az A_DOWN-t, és érintésre nem jelentek meg a karikák, csak mozgatásra.

  • fatal`
    titán

    És ebből ki lehet szedni a data alatti fájlokat, amikor az app generál?

    Sianis

    Komplett adb támogatás van (annyi, hogy nem mindig automata, úgyhogy van, hogy kell egy adb connect localhost, hogy lássa az eclipse), úgyhogy gondolom ki. Ha máshogy nem, akkor rootolod :)

    Mondjuk nem tudsz vele mindent tesztelni, nem testreszabható, mint az AVD, igazából felhasználóknak van, nem fejlesztőknek. Én azért kezdtem el használni, mert gyors, nem kell fél órát várnom egy-egy buildnél mire rámásolja az apk-t.

  • Sianis
    addikt

    Próbáld a BlueStackset, villámgyors. :)

    És ebből ki lehet szedni a data alatti fájlokat, amikor az app generál?

    Sianis

  • fatal`
    titán

    Be van tolva a HAXM, de ettől még nem szélsebes a hidegindítás. :) Azért kell most emulátor, mert adatbázist abból a legegyszerűbb kicsalni, hogy lássam mi van benne.

    Sianis

    Próbáld a BlueStackset, villámgyors. :)

  • Karma
    félisten

    Be van tolva a HAXM, de ettől még nem szélsebes a hidegindítás. :) Azért kell most emulátor, mert adatbázist abból a legegyszerűbb kicsalni, hogy lássam mi van benne.

    Sianis

    És megy is a HAXM? Azaz emulátor indításkor írja az AVD Manager, hogy HAX is working and emulator runs in fast virt mode? Mert enélkül nem ér semmit :P

    Nekem egy 4.2.2-es image hidegindítása tíz másodperc jelenleg. Mondjuk elég erős a gépem is - de nagyságrendi eltérésnek nem szabadna lennie. Még a tabletemen is feléled húsz alatt.

  • Sianis
    addikt

    A move alapból tartalmazza a downt (mivel hozzáérsz a kijelzőhöz / lenyomod az egeret, másképp nincs Move androidon) így az egész ág teljesen felesleges.

    (#672) Sianis: Nem használom az emulátort csak app release előtti tesztre így a problémát nem tudom mi okozza, viszont, ha Intel CPU-d van és tud VT-t, akkor tedd fel a HAXM-et, sokkal gyorsabban indul és fut az emu.

    Be van tolva a HAXM, de ettől még nem szélsebes a hidegindítás. :) Azért kell most emulátor, mert adatbázist abból a legegyszerűbb kicsalni, hogy lássam mi van benne.

    Sianis

  • fatal`
    titán

    Ennek épp ez a magyarázata: DOWN és MOVE esetén uaz. a case ág fut le. De igazad is van, mert DOWN esetén lehetne "megfogni", MOVE-nál mozgatni a joystickot. Csak a korábbi kódból indultam ki, ahol a MOVE végső soron DOWN-ként működött.

    A move alapból tartalmazza a downt (mivel hozzáérsz a kijelzőhöz / lenyomod az egeret, másképp nincs Move androidon) így az egész ág teljesen felesleges.

    (#672) Sianis: Nem használom az emulátort csak app release előtti tesztre így a problémát nem tudom mi okozza, viszont, ha Intel CPU-d van és tud VT-t, akkor tedd fel a HAXM-et, sokkal gyorsabban indul és fut az emu.

  • Sianis
    addikt

    Azt tudjátok, hogy mitől lehet, hogy elmentek egy emulátort snapshotba, ha mondjuk még aznap használom és indítom akkor semmi baja. Ellenben 24 óra elteltével azt mondja, hogy nem ilyen configgal lett mentve a snapshot, szóval nem lehet onnan indítani. Nem nyúlok semmilyen beállításhoz mégis folyton rákényszerít a lassabb indításra, arról nem is beszélve, hogy a 4.0+ emulátorok általában olyan lassan indulnak, hogy első alkalommal az Eclipse nem is találja meg őket.

    Sianis

  • thon73
    tag

    Ennek épp ez a magyarázata: DOWN és MOVE esetén uaz. a case ág fut le. De igazad is van, mert DOWN esetén lehetne "megfogni", MOVE-nál mozgatni a joystickot. Csak a korábbi kódból indultam ki, ahol a MOVE végső soron DOWN-ként működött.

    Módosítok: az elv jó, csak megfogni nehéz így. Ha viszont az "else"-t kivesszük (vagy opt. miatt lehet "if (joyid[n]!=-1)"), akkor értelmet kap a DOWN ág is. Uis. már érintésre arrébb tud ugrani.

    API17-ben van egy hypot() függvény, ami a distance számítást leegyszerűsíti (nekem API10-ben még nem működik.)

    MATEMATIKUSOK!

    Mi a legegyszerűbb számítás ahhoz, hogy a kör - az érintéstől függően - a periméteren keringjen? Csak szögfüggvénnyel megoldható?

  • thon73
    tag

    Egy apró kiegészítés:

    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:

    Itt, mivel nem csinálsz semmit az ACTION_DOWN ág felesleges. De ha mégis bent akarod/akarjátok hagyni, akkor egy break nem árt utána, mert így action_down esetén is lefut az utána lévő ág.

    Ennek épp ez a magyarázata: DOWN és MOVE esetén uaz. a case ág fut le. De igazad is van, mert DOWN esetén lehetne "megfogni", MOVE-nál mozgatni a joystickot. Csak a korábbi kódból indultam ki, ahol a MOVE végső soron DOWN-ként működött.

  • fatal`
    titán

    Itt egy lehetséges megoldás. API10 és AIDE alatt készült, de elvileg bármiben működik. 800x480 pixeles képernyőm van, de persze a méretek a képnek megfelelően változtathatóak. Az egyszerűség kedvéért beágyazott View-t használtam, ill. nem ellenőrzi a View beállításait, ez végleges megoldásnál ildomos!
    A kód sok helyen nincs optimalizálva, inkább jól érthetőt akartam írni. ((Pl. én nem is tennék két joysticket egy view-ba, vagy ha igen, akkor két külön objektumként stb.))

    public class JoystickActivity extends Activity
    {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(new Felulet(this));
    }

    public class Felulet extends View
    {
    private float[] origox = {200f, 600f};
    private float[] origoy = {180f, 220f};

    private float joyx[] = {origox[0], origox[1]};
    private float joyy[] = {origoy[0], origoy[1]};

    private float joyarea = 150f;
    private float joyrad = 40f;
    private int joyid[] = {-1, -1};

    private Paint area;
    private Paint rad;

    public Felulet(Context context)
    {
    this(context, null, 0);
    }

    public Felulet(Context context, AttributeSet attrs)
    {
    this(context, attrs, 0);
    }

    public Felulet(Context context, AttributeSet attrs, int defStyle)
    {
    super(context, attrs, defStyle);

    area=new Paint();
    area.setStyle(Paint.Style.STROKE);
    area.setColor(Color.RED);
    area.setStrokeWidth(5f);

    rad=new Paint();
    rad.setStyle(Paint.Style.FILL_AND_STROKE);
    rad.setColor(Color.GREEN);
    rad.setStrokeWidth(5f);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:

    int pointerCount = event.getPointerCount();
    for (int n=0; n<2; n++)
    {
    if (joyid[n] == -1)
    {
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    if (distance(joyx[n], joyy[n], event.getX(cnt), event.getY(cnt)) < joyrad)
    {
    joyid[n] = event.getPointerId(cnt);
    break;
    }
    }
    }
    else
    {
    boolean id_flag = false;
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    if (joyid[n] == event.getPointerId(cnt))
    {
    if (distance(origox[n], origoy[n], event.getX(cnt), event.getY(cnt)) < joyarea - joyrad)
    {
    joyx[n] = event.getX(cnt);
    joyy[n] = event.getY(cnt);
    this.invalidate();
    }
    else
    {
    // aránypárral v. szögfüggvénnyel mozgatható a kerületen
    }
    id_flag=true;

    break;
    }
    }
    if (!id_flag)
    reset_joy(n);
    }
    }
    break;

    case MotionEvent.ACTION_UP:
    reset_joy(0);
    reset_joy(1);
    break;
    }
    return true;
    }

    protected void reset_joy(int n)
    {
    joyid[n] = -1;
    joyx[n] = origox[n];
    joyy[n] = origoy[n];

    this.invalidate();
    }

    protected float distance(float x1, float y1, float x2, float y2)
    {
    float x = x1 - x2;
    float y = y1 - y2;

    return FloatMath.sqrt(x * x + y * y);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
    for (int n=0; n<2; n++)
    {
    canvas.drawCircle (origox[n], origoy[n], joyarea, area);
    canvas.drawCircle (joyx[n], joyy[n], joyrad, rad);
    }
    }
    }
    }

    Az elv: a két index a két külön joysticket jelenti. Origox/y a közepe a két joysticknek, Joyx/y pedig az aktuális helyzete. Joyrad (kiskör) karikán belül lehet csak "megfogni" a joysticket, Joyarea (nagykör) sugaron kívül nem tud mozogni. A távolságot Pithagorasz tétellel számolja, ez nem a legjobb helyen van az osztályon belül.
    A JoyId a legfontosabb: ha -1, akkor nincs érintés hozzárendelve (középen van a joystick). Ha egy érintés belelép a kiskörbe, akkor annak id-je lesz a JoyId és azt követi. A nagykör szélén megáll, de az érintéshez továbbra is ragaszkodik. Nem akartam bonyolítani, de az igazi az lenne, ha a köríven menne az ujjad után. (a megjegyzés helyén kezelhető ez)
    Ha az Id eltűnik (ezt ellenőrzi a flag), vagyis azt az ujjad felemelted, akkor középre áll. Szintúgy akkor is, ha ACTION_UP lesz, vagyis minden ujj elhagyta a képet. Ilyenkor lehetne ütemadóval visszaúsztatni, de kis méretben az ugrás sem zavaró.
    Ilyenre gondoltál? Remélem segít továbblépni, a lényeg úgyis az ID kezelés volt. Ha valami nem tiszta, szívesen segítek.

    Egy apró kiegészítés:

    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:

    Itt, mivel nem csinálsz semmit az ACTION_DOWN ág felesleges. De ha mégis bent akarod/akarjátok hagyni, akkor egy break nem árt utána, mert így action_down esetén is lefut az utána lévő ág.

  • Tudtam, hogy már láttam ilyet! Fábián Attila: Cyclon c. játékának irányítása van így megoldva (analog módban). De áruld már el, mire kell KETTŐ joystick?

    Egy robot irányításához kell! :)

  • fatal`
    titán

    Tudtam, hogy már láttam ilyet! Fábián Attila: Cyclon c. játékának irányítása van így megoldva (analog módban). De áruld már el, mire kell KETTŐ joystick?

    Sok esetben kellhet kettő joystick. Pl. az egyik mozgáshoz, a másik forgáshoz.

  • thon73
    tag

    Köszönöm, átnézem! :)

    Tudtam, hogy már láttam ilyet! Fábián Attila: Cyclon c. játékának irányítása van így megoldva (analog módban). De áruld már el, mire kell KETTŐ joystick?

  • Itt egy lehetséges megoldás. API10 és AIDE alatt készült, de elvileg bármiben működik. 800x480 pixeles képernyőm van, de persze a méretek a képnek megfelelően változtathatóak. Az egyszerűség kedvéért beágyazott View-t használtam, ill. nem ellenőrzi a View beállításait, ez végleges megoldásnál ildomos!
    A kód sok helyen nincs optimalizálva, inkább jól érthetőt akartam írni. ((Pl. én nem is tennék két joysticket egy view-ba, vagy ha igen, akkor két külön objektumként stb.))

    public class JoystickActivity extends Activity
    {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(new Felulet(this));
    }

    public class Felulet extends View
    {
    private float[] origox = {200f, 600f};
    private float[] origoy = {180f, 220f};

    private float joyx[] = {origox[0], origox[1]};
    private float joyy[] = {origoy[0], origoy[1]};

    private float joyarea = 150f;
    private float joyrad = 40f;
    private int joyid[] = {-1, -1};

    private Paint area;
    private Paint rad;

    public Felulet(Context context)
    {
    this(context, null, 0);
    }

    public Felulet(Context context, AttributeSet attrs)
    {
    this(context, attrs, 0);
    }

    public Felulet(Context context, AttributeSet attrs, int defStyle)
    {
    super(context, attrs, defStyle);

    area=new Paint();
    area.setStyle(Paint.Style.STROKE);
    area.setColor(Color.RED);
    area.setStrokeWidth(5f);

    rad=new Paint();
    rad.setStyle(Paint.Style.FILL_AND_STROKE);
    rad.setColor(Color.GREEN);
    rad.setStrokeWidth(5f);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:

    int pointerCount = event.getPointerCount();
    for (int n=0; n<2; n++)
    {
    if (joyid[n] == -1)
    {
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    if (distance(joyx[n], joyy[n], event.getX(cnt), event.getY(cnt)) < joyrad)
    {
    joyid[n] = event.getPointerId(cnt);
    break;
    }
    }
    }
    else
    {
    boolean id_flag = false;
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    if (joyid[n] == event.getPointerId(cnt))
    {
    if (distance(origox[n], origoy[n], event.getX(cnt), event.getY(cnt)) < joyarea - joyrad)
    {
    joyx[n] = event.getX(cnt);
    joyy[n] = event.getY(cnt);
    this.invalidate();
    }
    else
    {
    // aránypárral v. szögfüggvénnyel mozgatható a kerületen
    }
    id_flag=true;

    break;
    }
    }
    if (!id_flag)
    reset_joy(n);
    }
    }
    break;

    case MotionEvent.ACTION_UP:
    reset_joy(0);
    reset_joy(1);
    break;
    }
    return true;
    }

    protected void reset_joy(int n)
    {
    joyid[n] = -1;
    joyx[n] = origox[n];
    joyy[n] = origoy[n];

    this.invalidate();
    }

    protected float distance(float x1, float y1, float x2, float y2)
    {
    float x = x1 - x2;
    float y = y1 - y2;

    return FloatMath.sqrt(x * x + y * y);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
    for (int n=0; n<2; n++)
    {
    canvas.drawCircle (origox[n], origoy[n], joyarea, area);
    canvas.drawCircle (joyx[n], joyy[n], joyrad, rad);
    }
    }
    }
    }

    Az elv: a két index a két külön joysticket jelenti. Origox/y a közepe a két joysticknek, Joyx/y pedig az aktuális helyzete. Joyrad (kiskör) karikán belül lehet csak "megfogni" a joysticket, Joyarea (nagykör) sugaron kívül nem tud mozogni. A távolságot Pithagorasz tétellel számolja, ez nem a legjobb helyen van az osztályon belül.
    A JoyId a legfontosabb: ha -1, akkor nincs érintés hozzárendelve (középen van a joystick). Ha egy érintés belelép a kiskörbe, akkor annak id-je lesz a JoyId és azt követi. A nagykör szélén megáll, de az érintéshez továbbra is ragaszkodik. Nem akartam bonyolítani, de az igazi az lenne, ha a köríven menne az ujjad után. (a megjegyzés helyén kezelhető ez)
    Ha az Id eltűnik (ezt ellenőrzi a flag), vagyis azt az ujjad felemelted, akkor középre áll. Szintúgy akkor is, ha ACTION_UP lesz, vagyis minden ujj elhagyta a képet. Ilyenkor lehetne ütemadóval visszaúsztatni, de kis méretben az ugrás sem zavaró.
    Ilyenre gondoltál? Remélem segít továbblépni, a lényeg úgyis az ID kezelés volt. Ha valami nem tiszta, szívesen segítek.

    Köszönöm, átnézem! :)

  • thon73
    tag

    Itt egy lehetséges megoldás. API10 és AIDE alatt készült, de elvileg bármiben működik. 800x480 pixeles képernyőm van, de persze a méretek a képnek megfelelően változtathatóak. Az egyszerűség kedvéért beágyazott View-t használtam, ill. nem ellenőrzi a View beállításait, ez végleges megoldásnál ildomos!
    A kód sok helyen nincs optimalizálva, inkább jól érthetőt akartam írni. ((Pl. én nem is tennék két joysticket egy view-ba, vagy ha igen, akkor két külön objektumként stb.))

    public class JoystickActivity extends Activity
    {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(new Felulet(this));
    }

    public class Felulet extends View
    {
    private float[] origox = {200f, 600f};
    private float[] origoy = {180f, 220f};

    private float joyx[] = {origox[0], origox[1]};
    private float joyy[] = {origoy[0], origoy[1]};

    private float joyarea = 150f;
    private float joyrad = 40f;
    private int joyid[] = {-1, -1};

    private Paint area;
    private Paint rad;

    public Felulet(Context context)
    {
    this(context, null, 0);
    }

    public Felulet(Context context, AttributeSet attrs)
    {
    this(context, attrs, 0);
    }

    public Felulet(Context context, AttributeSet attrs, int defStyle)
    {
    super(context, attrs, defStyle);

    area=new Paint();
    area.setStyle(Paint.Style.STROKE);
    area.setColor(Color.RED);
    area.setStrokeWidth(5f);

    rad=new Paint();
    rad.setStyle(Paint.Style.FILL_AND_STROKE);
    rad.setColor(Color.GREEN);
    rad.setStrokeWidth(5f);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:

    int pointerCount = event.getPointerCount();
    for (int n=0; n<2; n++)
    {
    if (joyid[n] == -1)
    {
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    if (distance(joyx[n], joyy[n], event.getX(cnt), event.getY(cnt)) < joyrad)
    {
    joyid[n] = event.getPointerId(cnt);
    break;
    }
    }
    }
    else
    {
    boolean id_flag = false;
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    if (joyid[n] == event.getPointerId(cnt))
    {
    if (distance(origox[n], origoy[n], event.getX(cnt), event.getY(cnt)) < joyarea - joyrad)
    {
    joyx[n] = event.getX(cnt);
    joyy[n] = event.getY(cnt);
    this.invalidate();
    }
    else
    {
    // aránypárral v. szögfüggvénnyel mozgatható a kerületen
    }
    id_flag=true;

    break;
    }
    }
    if (!id_flag)
    reset_joy(n);
    }
    }
    break;

    case MotionEvent.ACTION_UP:
    reset_joy(0);
    reset_joy(1);
    break;
    }
    return true;
    }

    protected void reset_joy(int n)
    {
    joyid[n] = -1;
    joyx[n] = origox[n];
    joyy[n] = origoy[n];

    this.invalidate();
    }

    protected float distance(float x1, float y1, float x2, float y2)
    {
    float x = x1 - x2;
    float y = y1 - y2;

    return FloatMath.sqrt(x * x + y * y);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
    for (int n=0; n<2; n++)
    {
    canvas.drawCircle (origox[n], origoy[n], joyarea, area);
    canvas.drawCircle (joyx[n], joyy[n], joyrad, rad);
    }
    }
    }
    }

    Az elv: a két index a két külön joysticket jelenti. Origox/y a közepe a két joysticknek, Joyx/y pedig az aktuális helyzete. Joyrad (kiskör) karikán belül lehet csak "megfogni" a joysticket, Joyarea (nagykör) sugaron kívül nem tud mozogni. A távolságot Pithagorasz tétellel számolja, ez nem a legjobb helyen van az osztályon belül.
    A JoyId a legfontosabb: ha -1, akkor nincs érintés hozzárendelve (középen van a joystick). Ha egy érintés belelép a kiskörbe, akkor annak id-je lesz a JoyId és azt követi. A nagykör szélén megáll, de az érintéshez továbbra is ragaszkodik. Nem akartam bonyolítani, de az igazi az lenne, ha a köríven menne az ujjad után. (a megjegyzés helyén kezelhető ez)
    Ha az Id eltűnik (ezt ellenőrzi a flag), vagyis azt az ujjad felemelted, akkor középre áll. Szintúgy akkor is, ha ACTION_UP lesz, vagyis minden ujj elhagyta a képet. Ilyenkor lehetne ütemadóval visszaúsztatni, de kis méretben az ugrás sem zavaró.
    Ilyenre gondoltál? Remélem segít továbblépni, a lényeg úgyis az ID kezelés volt. Ha valami nem tiszta, szívesen segítek.

  • thon73
    tag

    Köszi! Csak ugye, mivel kezdő vagyok, ennek a gyakorlati megvalósításával akadtak gondjaim. :)

    Készítek kódot is hozzá, csak erre a hétvége nem a legalkalmasabb. De hamarosan kész!

  • Pedig az nem nehéz, nekem inkább az időzítéssel gyűlt meg a bajom.
    1. KÉT View esetén csak az egy érintéssel kell foglalkozni sztem.
    2. KÖZÖS View-ban végig kell menni az összes érintés tömbjén, mint a fenti példában.
    Én ellenőrizném a koordináták alapján, melyik ID koordinátája van a joystick körének területén.
    A. lehetőség: Továbbra is végigmegyek az indexen, de ennek az ID-nek az alapján mozgatom a kört. Ha az ID eltűnt, akkor ez az érintés befejeződött. Kell keresnem egy újat, v. visszavinni középre a joysticket, és utána keresni.
    B. lehetőség: ugyanúgy végigmegyek a tömbön, de nem foglalkozom az ID-vel, hanem ami megfelelően közel van a középpontjához, oda mozdítom a kört. Ha nincs ilyen, mehet vissza középre.

    Az egész kulcsa az, hogy amíg egy ponton is érinted a képet, az ID megmarad. Ha elengedted a képet, akkor teljesen új érintés kezdődik, új Idkkel. Ezért kell az elején a megf. érintést mindenképp a koord. alapján kiválasztani.

    Köszi! Csak ugye, mivel kezdő vagyok, ennek a gyakorlati megvalósításával akadtak gondjaim. :)

  • thon73
    tag

    Igazából csak annyi hiányzik már, hogy a két pointert eltudjam különíteni. :)

    Pedig az nem nehéz, nekem inkább az időzítéssel gyűlt meg a bajom.
    1. KÉT View esetén csak az egy érintéssel kell foglalkozni sztem.
    2. KÖZÖS View-ban végig kell menni az összes érintés tömbjén, mint a fenti példában.
    Én ellenőrizném a koordináták alapján, melyik ID koordinátája van a joystick körének területén.
    A. lehetőség: Továbbra is végigmegyek az indexen, de ennek az ID-nek az alapján mozgatom a kört. Ha az ID eltűnt, akkor ez az érintés befejeződött. Kell keresnem egy újat, v. visszavinni középre a joysticket, és utána keresni.
    B. lehetőség: ugyanúgy végigmegyek a tömbön, de nem foglalkozom az ID-vel, hanem ami megfelelően közel van a középpontjához, oda mozdítom a kört. Ha nincs ilyen, mehet vissza középre.

    Az egész kulcsa az, hogy amíg egy ponton is érinted a képet, az ID megmarad. Ha elengedted a képet, akkor teljesen új érintés kezdődik, új Idkkel. Ezért kell az elején a megf. érintést mindenképp a koord. alapján kiválasztani.

  • Én lényegesen leegyszerűsíteném ezt a problémát. Készítenék egy speciális View-t, mely egy ilyen joystick-et mutat be. Ebből aztán kettő is elhelyezhető egy layoutban.
    A joystick mindig középen áll. Ha megérintem valahol máshol a View-t (vagy a View belül egy kört is kijelölhetek erre), akkor a joystick/kör oda ugrik (és persze ezt az értéket kérdezhetem le). Ha elengedem, akkor visszaugrik középre.
    Ez persze nem túl szép, mert a joysticknem ugrál, hanem szépen mozog. Ennek a szimulálására viszont el kell indítani a háttérszálon egy "ütem-adót", ami időnként jelzi a View-nak, hogy mozdítania kell egy kicsit a joystickon. Így úszhat a kör az érintés felé, vagy elengedésnél vissza középre. Az ütemadó nélkül nincs olyan esemény, ami a kör mozgását kiváltaná.
    A másik lehetőség, hogy a kör csak akkor mozdul, ha az érintés a középpontjához megfelelően közel következett be. Ilyenkor nem kell ütem-adó, hiszen az "ugrás" megfelelően kicsi. Ez azt is szimulálja, hogy a joystick nem ugrik magától a kezembe, ha nem a tetejét fogom meg. Persze a "visszaúthoz" elengedés után még mindig szükséges az előző módszer.
    ((Nem dolgoztam még két külön View-val az érintéssel kapcsolatban, de nagy a gyanúm, hogy nem kell törődni, csak az elsődleges érintéssel, mert mindkettő azt kapja meg. Ezt ki kellene próbálnom.))
    Ez persze csak az én ötletem, lehet, hogy más tud ennél jobbat is. Külön-külön már minden részét elkészítettem a folyamatnak, csak nem ilyen összefüggésben - ennek alapján szerintem azért el lehet vele játszani, mire összeáll, de megvalósítható. ((Ha nem sürgős, a konkrét megvalósításban is szívesen segítek, a grafika és az időzítés most nálam is pont napirenden van.))

    Igazából csak annyi hiányzik már, hogy a két pointert eltudjam különíteni. :)

  • thon73
    tag

    Én lényegesen leegyszerűsíteném ezt a problémát. Készítenék egy speciális View-t, mely egy ilyen joystick-et mutat be. Ebből aztán kettő is elhelyezhető egy layoutban.
    A joystick mindig középen áll. Ha megérintem valahol máshol a View-t (vagy a View belül egy kört is kijelölhetek erre), akkor a joystick/kör oda ugrik (és persze ezt az értéket kérdezhetem le). Ha elengedem, akkor visszaugrik középre.
    Ez persze nem túl szép, mert a joysticknem ugrál, hanem szépen mozog. Ennek a szimulálására viszont el kell indítani a háttérszálon egy "ütem-adót", ami időnként jelzi a View-nak, hogy mozdítania kell egy kicsit a joystickon. Így úszhat a kör az érintés felé, vagy elengedésnél vissza középre. Az ütemadó nélkül nincs olyan esemény, ami a kör mozgását kiváltaná.
    A másik lehetőség, hogy a kör csak akkor mozdul, ha az érintés a középpontjához megfelelően közel következett be. Ilyenkor nem kell ütem-adó, hiszen az "ugrás" megfelelően kicsi. Ez azt is szimulálja, hogy a joystick nem ugrik magától a kezembe, ha nem a tetejét fogom meg. Persze a "visszaúthoz" elengedés után még mindig szükséges az előző módszer.
    ((Nem dolgoztam még két külön View-val az érintéssel kapcsolatban, de nagy a gyanúm, hogy nem kell törődni, csak az elsődleges érintéssel, mert mindkettő azt kapja meg. Ezt ki kellene próbálnom.))
    Ez persze csak az én ötletem, lehet, hogy más tud ennél jobbat is. Külön-külön már minden részét elkészítettem a folyamatnak, csak nem ilyen összefüggésben - ennek alapján szerintem azért el lehet vele játszani, mire összeáll, de megvalósítható. ((Ha nem sürgős, a konkrét megvalósításban is szívesen segítek, a grafika és az időzítés most nálam is pont napirenden van.))

  • ?? Ez azt jelenti, hogy a körök nem mozdíthatóak teljesen szabadon? Vagyis pl. nem keresztezhetik egymást? Mindkettőnek van egy saját területe? Mert akkor jobb lenne egy külön View-t alkotni egy körrel a közepén, amiben a kör - mint egy thumbstick mozgatható. Ha hozzáérsz valahol, akkor arra elmozdul a kör. Ha elengeded, akkor visszaúszik középre. Ez lenne a terv?

    Pontosan! :)

  • thon73
    tag

    Annyit szeretnék elérni, hogy van kér kör a képernyőn, és azokat mozgassam az ujjaimmal. Mint a joysticken a thumbstickek. Szóval egyszerre is tudja kezelni, meg ha csak az egyiket mozgatom, akkor is. :)

    ?? Ez azt jelenti, hogy a körök nem mozdíthatóak teljesen szabadon? Vagyis pl. nem keresztezhetik egymást? Mindkettőnek van egy saját területe? Mert akkor jobb lenne egy külön View-t alkotni egy körrel a közepén, amiben a kör - mint egy thumbstick mozgatható. Ha hozzáérsz valahol, akkor arra elmozdul a kör. Ha elengeded, akkor visszaúszik középre. Ez lenne a terv?

  • Ez csak egy bemutató-példa. Mi lenne a cél? Ha két fix alakzatot akarsz mozgatni, akkor azok koordinátáit kell külön tárolni, és egy-egy érintésnél legfeljebb a megfelelő ID-jű érintéshez rendelni.
    Egy touchEvent az tényleg egyetlen érintés(sorozatot) ír le. Az ID arra szolgál, hogy EZEN BELÜL egy-egy ujjat kövessen akkor is, ha a többit felemeled (az index uis. csak felsorolja az aktuálisan hozzáérő pontokat, de a sorszám itt változhat.) Az már a Te programod feladata, hogy az alakzatok (és mozgásuk) valamint az érintések közötti logikát megalkossa. A bemutató csak minden mozdulatnál új alakzatokat rajzol az érintési pontokra, nem "gondoskodik" az alakzatokról, ezért is tűnnek el.

    Annyit szeretnék elérni, hogy van kér kör a képernyőn, és azokat mozgassam az ujjaimmal. Mint a joysticken a thumbstickek. Szóval egyszerre is tudja kezelni, meg ha csak az egyiket mozgatom, akkor is. :)

  • thon73
    tag

    Bocs, csak úgy értettem, hogy volt-e már valakinek ehhez hasonló tapasztalata. Neki is láttam egy egyszerűsített tesztkódot írni (az enyém meglehetősen hosszú).
    Ez a teszt fragment, egyetlen metódus:

    public class TestFragment extends Fragment
    {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
    TextView tv = new TextView(getActivity());
    tv.setText("Hello világ!");
    return tv;
    }
    }

    És a lényeg: az activity:

    public class MainActivity extends FragmentActivity
    {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    FrameLayout fl = new FrameLayout(this );
    fl.setId(1234);
    setContentView(fl);
    }

    @Override
    public void onResumeFragments()
    {
    super.onResumeFragments();

    FragmentManager fragmentManager = getSupportFragmentManager();

    TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
    if (test == null)
    {
    test = new TestFragment();
    }

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(1234, test, "TEST");
    fragmentTransaction.commit();
    }


    @Override
    public void onPause()
    {
    super.onPause();

    FragmentManager fragmentManager = getSupportFragmentManager();

    TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
    if (test!=null)
    {
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    // fragmentTransaction.detach(test);
    fragmentTransaction.remove(test);
    fragmentTransaction.commit();
    }
    }

    }

    ((Igazából ezeken a kódokon kívül az eclipse saját indítókódján semmit sem kell változtatni, mert a View-k dinamikusan jönnek létre. A rengeteg Log-ot kitöröltem, de akár minden metódus figyelhető a LogCat-ben.))

    A LÉNYEG:

    Sztem. az indítás során az onResumeFragments-ben hozzáadjuk a "TEST" fragmentet,
    leállításnál az onPause-ben eldobjuk. (Ha akarjuk, akkor detach is lehet.)

    A REMOVE UTÁN SZERINTEM A FRAGMENTNEK EL KELLENE PUSZTULNIA A DESTROY FOLYAMÁN!

    Ehhez képest újraindítás után hibaüzenet:
    java.lang.RuntimeException: Unable to resume activity {.fragmenttest.MainActivity}: java.lang.IllegalStateException: Fragment already added: TestFragment{40525cf0 #0 id=0x4d2 TEST}

    Vagyis az eldobott Fragmentünk "visszajött".

    Ugyanez történik ID és Tag alapú keresésnél is: az eldobott Fragment megjelenik
    Ha két (landscape és portrait) layout között váltogatok, akkor még hibaüzenet sem jön, csak a Fragmentek sokasodnak.
    ((Világos, ha a remove átkerül a legelejére, akkor nem lesz hiba, de a Fragment megmarad))

    SZERINTEM:
    A Fragment-ek NEM objektumként működnek, hanem sokkal jobban hasonlítanak az Activity-ra. Vagyis: létrehozás után (ez történik objektumok módjára), mindvégig megmaradnak, csak ide-oda kapcsolgathatjuk őket.
    Az onRetain...-nál annyi különbség lehet, hogy ott érinetetlenül maradnak meg, itt meg a View újra készül.

    Ez azért gond, mert ha egyszer egy Fragmentet valamelyik View-ba bekapcsoltunk, akkor ragaszkodik a saját View-jához, más View ID esetén hibát dob.

    Képzeljünk el egy szituációt: bal oldalon a lista, jobbra az egyes elemek, külön fragmentben. Ha ezt EGY activityvel oldjuk meg, akkor NÉGY fragmentet kell kezelnünk (2 landscape, 2 külön portrait módban) VAGY ha ugyanazt az Id-t adjuk meg a két külön layout-ban lévő fragmentet fogadó View-nak, akkor csak KÉT fragmentet kell kezelnünk.
    Tudom, hogy a KÉT ACTIVITY-vel való kezelést preferálják, de 1. ettől nem tudom meg, miért nem tűnnek el a fragmentek. ((2. Az activity-k közötti kommunikáció miatt ez a megoldás most nem az igazi nekem (de ez a teszt szempontjából lényegtelen))

    Bocs, ha nem teljesen érthető ez, igyekeztem nagyon rövidíteni a kódot. De már csak azért is hajt a kíváncsiság, hogy ez miként műxik.

    Nem tudok elszakadni a felszaporodó fragmentek problémájától...
    Sehol nem írják ezt a megoldást, pedig nekem minden bajomat megoldotta. Sőt! Portrait-ból Landscape-be való visszafordításnál a másodlagos Fragmentben lévő adatok is megmaradtak! (Lévén ugyanaz a Fragment jelent meg máshol)

    layout/main.xml

    <FrameLayout
    android:id="@+id/portrait"
    ... >
    <FrameLayout
    android:id="@+id/list_frame"
    ... />
    <FrameLayout
    android:id="@+id/edit_frame"
    ... />
    </FrameLayout>

    layout-land/main.xml

    <LinearLayout
    android:id="@+id/landscape"
    ... >
    <FrameLayout
    android:id="@+id/list_frame"
    ... />
    <FrameLayout
    android:id="@+id/edit_frame"
    ... />
    </LinearLayout>

    Vagyis: ugyanazok az id-k mind landscape,mind portrait módban. Természetesen portrait módban a két frame "átfedi" egymást, tehát a program logikájának kell megoldani, hogy hol az EDIT, hol a LIST fragment legyen felcsatolva a saját (átfedő) Frame-jébe.
    Az egész program (ill. ez a része) csak KÉT Fragment Példányt tartalmaz. És egy Activity van (ez volt a cél)

    Szól ez ellen a megvalósítás ellen vmilyen. érv? Nekem működőképesnek tűnik. Mivel a két layout egyszerre nem valósul meg, az id-k sem akadnak össze. Mindkét frame mindig a "saját" frame-jébe lesz bekapcsolva, mindig a saját tag-jével jelölve. Nincs változás, nincs hibaüzenet. Mivel nem a frame-ek kapcsolnak ki/be, az animációk ugyanúgy látszanak.
    Mégsem olvastam ilyen megoldást sehol. Van ezzel vmi baj szerintetek?
    Tényleg senkinek nem volt még nehézsége a fragmentek megvalósításával? Tényleg senkinél nem szaporodtak még fel az elforgatások során? :F

  • thon73
    tag

    Az általad mutatott példában, mikor van a ciklus, ott hogyan tudom elkülöníteni a két pointerem értékét?

    case MotionEvent.ACTION_MOVE:
    pointerCount = event.getPointerCount();
    for(cnt = 0; cnt<pointerCount && cnt<MAX_POINTER;cnt++)
    {

    posx[cnt] = event.getX(cnt);
    posy[cnt] = event.getY(cnt);
    id[cnt] = event.getPointerId(cnt);

    mPosX = posx[cnt];
    mPosY = posy[cnt];
    }
    this.invalidate();
    break;

    Itt szeretnék mPosX2, és mPosY2-nek is értéket adni, de nem tudom, azt a pointert, hogyan kezeljem le.

    Ez csak egy bemutató-példa. Mi lenne a cél? Ha két fix alakzatot akarsz mozgatni, akkor azok koordinátáit kell külön tárolni, és egy-egy érintésnél legfeljebb a megfelelő ID-jű érintéshez rendelni.
    Egy touchEvent az tényleg egyetlen érintés(sorozatot) ír le. Az ID arra szolgál, hogy EZEN BELÜL egy-egy ujjat kövessen akkor is, ha a többit felemeled (az index uis. csak felsorolja az aktuálisan hozzáérő pontokat, de a sorszám itt változhat.) Az már a Te programod feladata, hogy az alakzatok (és mozgásuk) valamint az érintések közötti logikát megalkossa. A bemutató csak minden mozdulatnál új alakzatokat rajzol az érintési pontokra, nem "gondoskodik" az alakzatokról, ezért is tűnnek el.

  • kukinyo
    addikt

    Sziasztok
    Nem tudom hogy kérdésem jó helyen teszem e fel, remélem igen :)
    Előszeretettel használom blade-en a CM7.2 android verzióját, amiben ugye nincs navibar funkció.
    Ezt igyekszem úgy pótolni hogy a framework-res.apk-t kibontottam és a values\bools.xml-ben bekapcsoltam a statusbar soft button funkcióját.
    Ez nagyon is megfelelne ha nem lennének annyira kicsik a gombok.
    Megtaláltam azt hogy a statusbar magasságát hol lehet állítani, arra is rájöttem hogy a statusbar ikonjait hol tudom méretezni, viszont a soft button mérete ezekkel a beállításokkal nem változik.
    Hol tudnám megnövelni a gombok méretét?

  • Az általad mutatott példában, mikor van a ciklus, ott hogyan tudom elkülöníteni a két pointerem értékét?

    case MotionEvent.ACTION_MOVE:
    pointerCount = event.getPointerCount();
    for(cnt = 0; cnt<pointerCount && cnt<MAX_POINTER;cnt++)
    {

    posx[cnt] = event.getX(cnt);
    posy[cnt] = event.getY(cnt);
    id[cnt] = event.getPointerId(cnt);

    mPosX = posx[cnt];
    mPosY = posy[cnt];
    }
    this.invalidate();
    break;

    Itt szeretnék mPosX2, és mPosY2-nek is értéket adni, de nem tudom, azt a pointert, hogyan kezeljem le.

  • Két fontos dologra érdemes figyelni:
    1. az onDraw minden invalidate után üres lappal indul. Ha meg akarod tartani az alakzatokat, akkor tárolni kell a koordinátáikat, és mindenannyiszor újrarajzolni őket. A gond az alakzatok "újra megfogásakor" jelentkezik: uis. honnét tudod, hogy egy már letett alakzatot kell mozgatnod, vagy egy újat? Legjobb lenne talán ellenőrizni, hogy az érintés vmelyik alakzat közelében van-e, és akkor azt hozzárendelni. De mindenképpen tárolni kell az adatokat.
    2. nem az index számít, hanem az ID. Ez utóbbi ugyanis nem változik egy multitouch érintés során. Csak éppen nem sorban van, hanem végig kell nézni az indexeket és úgy kikeresni.
    ((És akkor még ott van a "historical" pontok sokasága, amivel nem foglalkoztunk.))

    Köszönöm! :)

  • Konair
    csendes tag

    Eclipseben tegyél oda egy breakpointot és nézd meg debug mode-ban. Meg fog ott állni a futás és meg tudod nézni, hogy tényleg null-e a context.

    Vagy a task konstruktorának adnám át a contextet és menteném a taskon belül is vagy az executeon keresztül a doinbackgroundnak.

    Sianis

    Megnéztem, tényleg null volt.
    Átadtam a konstruktornak, és így már nem null.

    Most lekéri a Location adatokat, de ezekkel tér vissza:
    Time: 1970-01-01 01:00:00
    Provider: null
    Latitude: 0.0
    Longitude: 0.0
    Accuracy: 0.0

  • thon73
    tag

    Megoldva! :)

    Azt hogy kellene, hogy a különböző pointerekhez, hogyan lehet különböző elemeket rajzolni, amit mozgatnak?

    Két fontos dologra érdemes figyelni:
    1. az onDraw minden invalidate után üres lappal indul. Ha meg akarod tartani az alakzatokat, akkor tárolni kell a koordinátáikat, és mindenannyiszor újrarajzolni őket. A gond az alakzatok "újra megfogásakor" jelentkezik: uis. honnét tudod, hogy egy már letett alakzatot kell mozgatnod, vagy egy újat? Legjobb lenne talán ellenőrizni, hogy az érintés vmelyik alakzat közelében van-e, és akkor azt hozzárendelni. De mindenképpen tárolni kell az adatokat.
    2. nem az index számít, hanem az ID. Ez utóbbi ugyanis nem változik egy multitouch érintés során. Csak éppen nem sorban van, hanem végig kell nézni az indexeket és úgy kikeresni.
    ((És akkor még ott van a "historical" pontok sokasága, amivel nem foglalkoztunk.))

  • thon73
    tag

    Sajnos, most nem tudok nagyon beleásni a témába, de annyit had tegyek hozzá, hogy nem hiszem, hogy a supportban más lenne, mint az új rendszerekben. A support tudtommal ugyanazt a kódot tartalmazza, mint ami a 4.0+ rendszerek megkaptak. Gyakorlatilag egy backport, annyi különbséggel szerintem, hogy SDK számtól függően vagy a support osztályokra, vagy a rendszer osztályaira hivatkozik.

    MOD: Valami kódot nem akarsz esetleg feltölteni? Nem kell bele semmi extra logika, csak lehet, hogy rátekintve jobban kibukik a baki.

    Sianis

    Bocs, csak úgy értettem, hogy volt-e már valakinek ehhez hasonló tapasztalata. Neki is láttam egy egyszerűsített tesztkódot írni (az enyém meglehetősen hosszú).
    Ez a teszt fragment, egyetlen metódus:

    public class TestFragment extends Fragment
    {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
    TextView tv = new TextView(getActivity());
    tv.setText("Hello világ!");
    return tv;
    }
    }

    És a lényeg: az activity:

    public class MainActivity extends FragmentActivity
    {

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    FrameLayout fl = new FrameLayout(this );
    fl.setId(1234);
    setContentView(fl);
    }

    @Override
    public void onResumeFragments()
    {
    super.onResumeFragments();

    FragmentManager fragmentManager = getSupportFragmentManager();

    TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
    if (test == null)
    {
    test = new TestFragment();
    }

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(1234, test, "TEST");
    fragmentTransaction.commit();
    }


    @Override
    public void onPause()
    {
    super.onPause();

    FragmentManager fragmentManager = getSupportFragmentManager();

    TestFragment test = (TestFragment)fragmentManager.findFragmentByTag("TEST");
    if (test!=null)
    {
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    // fragmentTransaction.detach(test);
    fragmentTransaction.remove(test);
    fragmentTransaction.commit();
    }
    }

    }

    ((Igazából ezeken a kódokon kívül az eclipse saját indítókódján semmit sem kell változtatni, mert a View-k dinamikusan jönnek létre. A rengeteg Log-ot kitöröltem, de akár minden metódus figyelhető a LogCat-ben.))

    A LÉNYEG:

    Sztem. az indítás során az onResumeFragments-ben hozzáadjuk a "TEST" fragmentet,
    leállításnál az onPause-ben eldobjuk. (Ha akarjuk, akkor detach is lehet.)

    A REMOVE UTÁN SZERINTEM A FRAGMENTNEK EL KELLENE PUSZTULNIA A DESTROY FOLYAMÁN!

    Ehhez képest újraindítás után hibaüzenet:
    java.lang.RuntimeException: Unable to resume activity {.fragmenttest.MainActivity}: java.lang.IllegalStateException: Fragment already added: TestFragment{40525cf0 #0 id=0x4d2 TEST}

    Vagyis az eldobott Fragmentünk "visszajött".

    Ugyanez történik ID és Tag alapú keresésnél is: az eldobott Fragment megjelenik
    Ha két (landscape és portrait) layout között váltogatok, akkor még hibaüzenet sem jön, csak a Fragmentek sokasodnak.
    ((Világos, ha a remove átkerül a legelejére, akkor nem lesz hiba, de a Fragment megmarad))

    SZERINTEM:
    A Fragment-ek NEM objektumként működnek, hanem sokkal jobban hasonlítanak az Activity-ra. Vagyis: létrehozás után (ez történik objektumok módjára), mindvégig megmaradnak, csak ide-oda kapcsolgathatjuk őket.
    Az onRetain...-nál annyi különbség lehet, hogy ott érinetetlenül maradnak meg, itt meg a View újra készül.

    Ez azért gond, mert ha egyszer egy Fragmentet valamelyik View-ba bekapcsoltunk, akkor ragaszkodik a saját View-jához, más View ID esetén hibát dob.

    Képzeljünk el egy szituációt: bal oldalon a lista, jobbra az egyes elemek, külön fragmentben. Ha ezt EGY activityvel oldjuk meg, akkor NÉGY fragmentet kell kezelnünk (2 landscape, 2 külön portrait módban) VAGY ha ugyanazt az Id-t adjuk meg a két külön layout-ban lévő fragmentet fogadó View-nak, akkor csak KÉT fragmentet kell kezelnünk.
    Tudom, hogy a KÉT ACTIVITY-vel való kezelést preferálják, de 1. ettől nem tudom meg, miért nem tűnnek el a fragmentek. ((2. Az activity-k közötti kommunikáció miatt ez a megoldás most nem az igazi nekem (de ez a teszt szempontjából lényegtelen))

    Bocs, ha nem teljesen érthető ez, igyekeztem nagyon rövidíteni a kódot. De már csak azért is hajt a kíváncsiság, hogy ez miként műxik.

  • Sianis
    addikt

    Sziasztok!

    Van egy BroadcastReceiver-em, és abban az onReceive elindít egy AsyncTask-ot. doInBackground-ban pedig lekérem a GPS koordinátákat.

    Ám itt kapok egy java.lang.NullPointerException-t a 46. sorban, ahol ez szerepel:
    locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);

    Ez a lekérés működött addig, míg be nem raktam AsyncTask-ba, így arra tippelek, hogy a context-et nem adom át helyesen.
    Hogyan kellene ezt jól átadni?
    Valaki tudna egy rendes leírást mutatni a contextről?

    Eclipseben tegyél oda egy breakpointot és nézd meg debug mode-ban. Meg fog ott állni a futás és meg tudod nézni, hogy tényleg null-e a context.

    Vagy a task konstruktorának adnám át a contextet és menteném a taskon belül is vagy az executeon keresztül a doinbackgroundnak.

    Sianis

  • Ez nagyon szuper, köszönöm! Annyi problémám lenne vele, hogy a rajzolt alakzat, csak érintés esetén jelenik meg a képernyőn. Hogyan lehetne megoldani, hogy folyamatosan ott legyenek az alakzataim? :)

    Megoldva! :)

    Azt hogy kellene, hogy a különböző pointerekhez, hogyan lehet különböző elemeket rajzolni, amit mozgatnak?

  • Pl. így? Az ID-t is kiírja.

    private final int MAX_POINTER=10;
    private float[] posx=new float[MAX_POINTER];
    private float[] posy=new float[MAX_POINTER];
    private int[] id=new int[MAX_POINTER];
    private int pointerCount = 0;

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:

    pointerCount = event.getPointerCount();
    for (int cnt = 0; cnt < pointerCount && cnt <MAX_POINTER; cnt++)
    {
    posx[cnt] = event.getX(cnt);
    posy[cnt] = event.getY(cnt);
    id[cnt] = event.getPointerId(cnt);
    }
    this.invalidate();

    break;
    }
    return true;
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    canvas.drawText(Integer.toString(cnt) + ", [" + Integer.toString(id[cnt]) + "]", posx[cnt], posy[cnt]-80f, text);
    canvas.drawCircle (posx[cnt], posy[cnt], 30f, paint);
    }
    }
    }
    }

    Nem vagyok benne biztos, hogy a getAction() action_POINTER_up kódot is visszaad. Ahhoz sztem. getActionMasked() lekérdezés kellene. De lehet, h. rosszul tudom. A fenti megoldás viszont akár tíz ujjal is működik. (Már ha a hardver tudja...)

    Ez nagyon szuper, köszönöm! Annyi problémám lenne vele, hogy a rajzolt alakzat, csak érintés esetén jelenik meg a képernyőn. Hogyan lehetne megoldani, hogy folyamatosan ott legyenek az alakzataim? :)

  • Konair
    csendes tag

    Sziasztok!

    Van egy BroadcastReceiver-em, és abban az onReceive elindít egy AsyncTask-ot. doInBackground-ban pedig lekérem a GPS koordinátákat.

    Ám itt kapok egy java.lang.NullPointerException-t a 46. sorban, ahol ez szerepel:
    locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);

    Ez a lekérés működött addig, míg be nem raktam AsyncTask-ba, így arra tippelek, hogy a context-et nem adom át helyesen.
    Hogyan kellene ezt jól átadni?
    Valaki tudna egy rendes leírást mutatni a contextről?

  • Sianis
    addikt

    Amíg a válaszokra vártam, tovább nyomoztam:
    Úgy tűnik, ha egyszer egy Fragment példányt létrehoztunk, akkor az örökkön-örökké létezni fog a FragmentManager-ben - pontosabban addíg, amíg a program VÉGLEG be nem fejeződik (tehát nem konfig vált. miatt.) Ez meglehetősen furcsa működés, mert akkor mire szolgál a setRetainInstance?
    Érdekes, jobban elolvasva a doksi is ezt mondja: a detach hasonló ahhoz, mintha a BackStack-en lenne a fragment, csak ilyenkor a FragmentManager tárolja.
    Support package-ot használok API8 minimum mellett API17-tel fordítva.
    Meg tudná ezt valaki erősíteni v. cáfolni? Lehet, h. ez egy hiba? Vagy a supporttal van valami gond?

    Sajnos, most nem tudok nagyon beleásni a témába, de annyit had tegyek hozzá, hogy nem hiszem, hogy a supportban más lenne, mint az új rendszerekben. A support tudtommal ugyanazt a kódot tartalmazza, mint ami a 4.0+ rendszerek megkaptak. Gyakorlatilag egy backport, annyi különbséggel szerintem, hogy SDK számtól függően vagy a support osztályokra, vagy a rendszer osztályaira hivatkozik.

    MOD: Valami kódot nem akarsz esetleg feltölteni? Nem kell bele semmi extra logika, csak lehet, hogy rátekintve jobban kibukik a baki.

    Sianis

  • thon73
    tag

    Az első kérdésemet egyszerűsítem: ha egy Fragment NINCS a BackStack-ben ÉS fragmentTransaction.remove-val (utána commit-tal) levettem a képről - akkor hogyan lehet eltüntetni végleg? Az onCreateOptionsMenu pl. megtalálja.

    A második kérdésem továbbra is fennáll.

    Amíg a válaszokra vártam, tovább nyomoztam:
    Úgy tűnik, ha egyszer egy Fragment példányt létrehoztunk, akkor az örökkön-örökké létezni fog a FragmentManager-ben - pontosabban addíg, amíg a program VÉGLEG be nem fejeződik (tehát nem konfig vált. miatt.) Ez meglehetősen furcsa működés, mert akkor mire szolgál a setRetainInstance?
    Érdekes, jobban elolvasva a doksi is ezt mondja: a detach hasonló ahhoz, mintha a BackStack-en lenne a fragment, csak ilyenkor a FragmentManager tárolja.
    Support package-ot használok API8 minimum mellett API17-tel fordítva.
    Meg tudná ezt valaki erősíteni v. cáfolni? Lehet, h. ez egy hiba? Vagy a supporttal van valami gond?

  • thon73
    tag

    Igen, a menü létrehozása tökéletesen megy. A menüt a fragmenten belül hoztam létre, és szeretném is, ha ott maradhatna. A gond akkor kezdődik, ha egy fragment osztály több példánnyal kapcsolódik be, mert akkor minden példány hozzáadja a saját menüjét. Ez idáig logikus is, de ha remove v. replece-szel elveszem a fragment-példányt (és persze a back-stack-ben sincs), a menüje akkor is megmarad. És - noha nincs már hivatkozás elvileg sehol erre a példányra - a menü az activity újraindítása után is megmarad! Minden indításnál új fragment-példányt adtam egy FrameLayout-ba (az előzőt elvileg eldobtam) és több száz bejegyzésem lett a menüben!
    Tudom, vissza lehet szerezni a Fragmentet, a gond csak az, hogy ha egyszer valahova becsatoltam, ugyanazt a példányt (külön időpontban sem!) nem lehet másik Layout-ba becsatolni. Ezért kellene két példány egy fragmentből (külön elrendezésben tehát külön időben) de EGY menüvel egyszerre.
    Egyetlen ötletem van: az activity onprepareoptionsmenu-jében ellenőrizni, hogy adott taggal van-e élő fragment, és eszerint betenni a menüt. De ha lehet, a fragmenten BELÜL szeretném a menükérdést megoldani. Csak nem megy…

    A BackStack kérdés egyszerűbb: az nekem is prímán működik. De ha nincs szükségem az utolsó elmentett transaction példányra, azt hogy tudom "visszajátszás" nélkül eldobni? Vagyis csak levenni a stackról, de nem végrehajtani.

    Köszönöm!

    Az első kérdésemet egyszerűsítem: ha egy Fragment NINCS a BackStack-ben ÉS fragmentTransaction.remove-val (utána commit-tal) levettem a képről - akkor hogyan lehet eltüntetni végleg? Az onCreateOptionsMenu pl. megtalálja.

    A második kérdésem továbbra is fennáll.

  • thon73
    tag

    Multi touch-al próbálkozok, és az lenne a kérdésem, hogyan tudnám egyszerre mozgatni a két kört? Mert csak az egyik elem követi az ujjam, a másik pedig a mozgatott objektumot követi, ha a másik ujjammal is megérintem a képernyőt. :D

    [link]

    Pl. így? Az ID-t is kiírja.

    private final int MAX_POINTER=10;
    private float[] posx=new float[MAX_POINTER];
    private float[] posy=new float[MAX_POINTER];
    private int[] id=new int[MAX_POINTER];
    private int pointerCount = 0;

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
    switch (event.getActionMasked())
    {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:

    pointerCount = event.getPointerCount();
    for (int cnt = 0; cnt < pointerCount && cnt <MAX_POINTER; cnt++)
    {
    posx[cnt] = event.getX(cnt);
    posy[cnt] = event.getY(cnt);
    id[cnt] = event.getPointerId(cnt);
    }
    this.invalidate();

    break;
    }
    return true;
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
    for (int cnt = 0; cnt < pointerCount; cnt++)
    {
    canvas.drawText(Integer.toString(cnt) + ", [" + Integer.toString(id[cnt]) + "]", posx[cnt], posy[cnt]-80f, text);
    canvas.drawCircle (posx[cnt], posy[cnt], 30f, paint);
    }
    }
    }
    }

    Nem vagyok benne biztos, hogy a getAction() action_POINTER_up kódot is visszaad. Ahhoz sztem. getActionMasked() lekérdezés kellene. De lehet, h. rosszul tudom. A fenti megoldás viszont akár tíz ujjal is működik. (Már ha a hardver tudja...)

  • Multi touch-al próbálkozok, és az lenne a kérdésem, hogyan tudnám egyszerre mozgatni a két kört? Mert csak az egyik elem követi az ujjam, a másik pedig a mozgatott objektumot követi, ha a másik ujjammal is megérintem a képernyőt. :D

    [link]

  • thon73
    tag

    Fragmentnél adtál meg setHasOptionsMenu(true)-t? Vagy honnan vezérled a menü létrehozását? Nekem így eddig nem volt vele gondom, minden fragment magának definiálja a menüjét és a backstackes dolgokkal is szépen együttműködik a cserélődés. Igaz én AndroidAnnotations-t használok.

    Sianis

    Igen, a menü létrehozása tökéletesen megy. A menüt a fragmenten belül hoztam létre, és szeretném is, ha ott maradhatna. A gond akkor kezdődik, ha egy fragment osztály több példánnyal kapcsolódik be, mert akkor minden példány hozzáadja a saját menüjét. Ez idáig logikus is, de ha remove v. replece-szel elveszem a fragment-példányt (és persze a back-stack-ben sincs), a menüje akkor is megmarad. És - noha nincs már hivatkozás elvileg sehol erre a példányra - a menü az activity újraindítása után is megmarad! Minden indításnál új fragment-példányt adtam egy FrameLayout-ba (az előzőt elvileg eldobtam) és több száz bejegyzésem lett a menüben!
    Tudom, vissza lehet szerezni a Fragmentet, a gond csak az, hogy ha egyszer valahova becsatoltam, ugyanazt a példányt (külön időpontban sem!) nem lehet másik Layout-ba becsatolni. Ezért kellene két példány egy fragmentből (külön elrendezésben tehát külön időben) de EGY menüvel egyszerre.
    Egyetlen ötletem van: az activity onprepareoptionsmenu-jében ellenőrizni, hogy adott taggal van-e élő fragment, és eszerint betenni a menüt. De ha lehet, a fragmenten BELÜL szeretném a menükérdést megoldani. Csak nem megy…

    A BackStack kérdés egyszerűbb: az nekem is prímán működik. De ha nincs szükségem az utolsó elmentett transaction példányra, azt hogy tudom "visszajátszás" nélkül eldobni? Vagyis csak levenni a stackról, de nem végrehajtani.

    Köszönöm!

  • kocska86
    csendes tag

    Sziasztok!

    Előre leszögezném, hogy kezdő vagyok az android programozás terén...
    A telómhoz szeretnék csinál egy usb háttértár programot. A programom már az alap funkcióját ellátja.Viszont, ha PC-re csatlakoztatom, és valamit írok, vagy valamit törlök az SD kártyáról, akkor az a telefonra való visszacsatolás után nem látszik.
    Ha látni akarom az SD kártya tartalmának a változását, akkor újra kell indítanom a telefon.
    A kérdés tehát az lenne...hogy milyen módon tudnám az SD kártya teljes tartalmát újra olvastatni?
    Próbálkoztam a MediaScannerConnectionClient-el, de sikertelenül.
    A kátrya tartalmát ugyan beolvassa, de változásokat nem nem jeleníti meg, vagy nem is észleli.
    Gondolom valami hasonló metódus kellene, mint ami bootoláskor lefut, de mivel nem tudom, hogy pontosan mi is az, ezért nem tudtam elindulni ezen a vonalon.
    Örülnék, ha valaki tudna útmutatást adni!

    Előre is köszönöm!

  • Sianis
    addikt

    Fragmentnél adtál meg setHasOptionsMenu(true)-t? Vagy honnan vezérled a menü létrehozását? Nekem így eddig nem volt vele gondom, minden fragment magának definiálja a menüjét és a backstackes dolgokkal is szépen együttműködik a cserélődés. Igaz én AndroidAnnotations-t használok.

    Sianis

  • thon73
    tag

    Elkezdtem haladni a korral, megismerkedtem a Fragment-kezeléssel.
    DE!
    Az normális, hogy az Android Developers honlapon lévő példakódok hibásak?? :(((
    Namármost, ahogy végiggondoltam, úgy viszont működik (és a hibás elgondolást is megtaláltam a példakódban).
    Van viszont erről (Fragment) valahol használható leírás, hogy mi a helyes felhasználás módja, vagy mindenki kitalálja magának oszt lesz ami lesz??
    Vagy mi van ilyenkor, amikor a "HIVATALOS" dokumentáció hülyeséggel példálózik?

    A mérgelődésen kívül két konkrét kérdésem lenne Fragment-ekkel kapcsolatban:

    1. A Fragment által létrehozott Options-Menu a Fragment eltávolítása után is megmarad. Ha új Fragment példányt csatolok be, akkor az előző (eltávolított) példány Options-menu-je is, és az új is látszik. Ezt (a régi menüt) mivel tudom kitörölni a Fragment eltávolításakor? (Az előző Fragment már "eltűnt", vagy legalábbis tag keresésével nem találja meg. De a menu maradt.)
    Az invalidateOptionsMenu nem működik, vagy nem tudom, hol kellene kiadni. A menu.clear() (pl. a prepare részben) viszont mindent kitöröl, és egyáltalán nem látszik a menü.

    2. Ha elmentettem egy transaction-t a backstack-re, és nem arrafelé megyek vissza (mert pl. elfordítottam a telo-t), akkor hogyan tudom azt onnan eltüntetni? ((A BackStack-on lévő elemek száma minden elfordításkor növekszik, hiába lesz közben "Destroy". Ez nem is lenne baj, csak a visszafordításkor az alap Fragment-ről szeretnék indulni, miközben a "második" Fragment (vagyis a tranzakció) el van mentve a BackStack-re.))

    API17-tel fordítottam, de API8 minimumra, tehát support package-t használtam. Elvileg ez nem lehetne baj. Előre is köszönöm, ha valakinek van ezzel tapasztalata.

  • thon73
    tag

    Elkezdtem haladni a korral, megismerkedtem a Fragment-kezeléssel.
    DE!
    Az normális, hogy az Android Developers honlapon lévő példakódok hibásak?? :(((
    Namármost, ahogy végiggondoltam, úgy viszont működik (és a hibás elgondolást is megtaláltam a példakódban).
    Van viszont erről (Fragment) valahol használható leírás, hogy mi a helyes felhasználás módja, vagy mindenki kitalálja magának oszt lesz ami lesz??
    Vagy mi van ilyenkor, amikor a "HIVATALOS" dokumentáció hülyeséggel példálózik?

  • Illetve azt megtudnátok mondani, hogy Surfaceview-ra hogyan lehet egy textViewt aplákálni? :)

  • Helyesbítenék: Debug módban egy ideig fut jól, de ha rendesen elindítom az appot, marad az FC.

    A console ezt írja:

    [2013-05-05 14:20:32 - Surface2] ------------------------------
    [2013-05-05 14:20:32 - Surface2] Android Launch!
    [2013-05-05 14:20:32 - Surface2] adb is running normally.
    [2013-05-05 14:20:32 - Surface2] Performing com.example.surface2.MainActivity activity launch
    [2013-05-05 14:20:32 - Surface2] Automatic Target Mode: Unable to detect device compatibility. Please select a target device.
    [2013-05-05 14:20:35 - Surface2] Application already deployed. No need to reinstall.
    [2013-05-05 14:20:35 - Surface2] Starting activity com.example.surface2.MainActivity on device skate
    [2013-05-05 14:20:36 - Surface2] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.surface2/.MainActivity }
    [2013-05-05 14:20:36 - Surface2] ActivityManager: Warning: Activity not started, its current task has been brought to the front

    A logCat ezt:

    05-05 14:23:52.830: W/ActivityManager(227): Activity destroy timeout for HistoryRecord{409006b8 com.example.surface2/.MainActivity}
    05-05 14:23:52.870: D/AndroidRuntime(8898): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
    05-05 14:23:52.870: I/AndroidRuntime(8898): Heap size: -Xmx48m
    05-05 14:23:52.870: D/AndroidRuntime(8898): CheckJNI is OFF
    05-05 14:23:53.130: D/AndroidRuntime(8898): Calling main entry com.android.commands.pm.Pm
    05-05 14:23:53.140: D/AndroidRuntime(8898): Shutting down VM
    05-05 14:23:53.150: D/dalvikvm(8898): GC_CONCURRENT freed 103K, 70% free 308K/1024K, external 0K/0K, paused 1ms+1ms
    05-05 14:23:53.150: I/AndroidRuntime(8898): NOTE: attach of thread 'Binder Thread #3' failed
    05-05 14:23:53.150: D/jdwp(8898): adbd disconnected
    05-05 14:23:53.150: D/jdwp(8898): Got wake-up signal, bailing out of select
    05-05 14:23:53.150: D/dalvikvm(8898): Debugger has detached; object registry had 1 entries
    05-05 14:23:53.360: D/AndroidRuntime(8908): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
    05-05 14:23:53.360: I/AndroidRuntime(8908): Heap size: -Xmx48m
    05-05 14:23:53.360: D/AndroidRuntime(8908): CheckJNI is OFF
    05-05 14:23:53.620: D/AndroidRuntime(8908): Calling main entry com.android.commands.am.Am
    05-05 14:23:53.630: I/ActivityManager(227): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.surface2/.MainActivity } from pid 8908
    05-05 14:23:53.670: D/AndroidRuntime(8908): Shutting down VM
    05-05 14:23:53.690: I/AndroidRuntime(8908): NOTE: attach of thread 'Binder Thread #3' failed
    05-05 14:23:53.690: D/dalvikvm(8908): GC_CONCURRENT freed 103K, 69% free 325K/1024K, external 0K/0K, paused 0ms+1ms
    05-05 14:23:53.700: D/jdwp(8908): adbd disconnected
    05-05 14:23:53.700: D/jdwp(8908): Got wake-up signal, bailing out of select
    05-05 14:23:53.700: D/dalvikvm(8908): Debugger has detached; object registry had 1 entries
    05-05 14:23:53.700: W/WindowManager(227): Rebuild removed 5 windows but added 3
    05-05 14:23:53.780: D/dalvikvm(7054): GC_EXPLICIT freed 21K, 50% free 2701K/5379K, external 0K/0K, paused 432ms
    05-05 14:23:58.320: I/Process(8882): Sending signal. PID: 8882 SIG: 9
    05-05 14:23:58.330: E/InputDispatcher(227): channel '40a14228 com.example.surface2/com.example.surface2.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8
    05-05 14:23:58.330: E/InputDispatcher(227): channel '40a14228 com.example.surface2/com.example.surface2.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    05-05 14:23:58.330: I/ActivityManager(227): Process com.example.surface2 (pid 8882) has died.
    05-05 14:23:58.350: I/WindowManager(227): WIN DEATH: Window{40a14228 com.example.surface2/com.example.surface2.MainActivity paused=false}
    05-05 14:23:58.350: I/WindowManager(227): WIN DEATH: Window{4099a168 SurfaceView paused=false}
    05-05 14:23:58.390: W/InputManagerService(227): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@405ab318

  • Eclipse-ben Debug módban futtasd a programot, és akkor látni fogod hogy mi a konkrét exception és hogy honnan jön. Ebből ha nem jössz rá, oszd meg a stack trace-t velünk is.

    Látszólag valami bennragadt egy cacheben, ez okozta az FC-t. Most működik.

    Köszönöm szépen a tanácsot! :)

  • Karma
    félisten

    Sziasztok srácok!
    Van egy látszólag jó példa kódom, aminek elvileg kellene is futni, de minden alkalommal, ha a telefonon kipróbálom FC-t dob. Nem igazán van még tapasztalatom androiddal, ezért kérdezlek titeket, hogy mi lehet a gond?

    [link]

    Eclipse-ben Debug módban futtasd a programot, és akkor látni fogod hogy mi a konkrét exception és hogy honnan jön. Ebből ha nem jössz rá, oszd meg a stack trace-t velünk is.

  • Sziasztok srácok!
    Van egy látszólag jó példa kódom, aminek elvileg kellene is futni, de minden alkalommal, ha a telefonon kipróbálom FC-t dob. Nem igazán van még tapasztalatom androiddal, ezért kérdezlek titeket, hogy mi lehet a gond?

    [link]

  • pittbaba
    aktív tag

    Nem vagyok nagy guruja a témának, de a Google kitalálta az ilyen felhasználáshoz az ADK-t, és vannak fain kulcsrakész lapok az ilyen hobbifejlesztéshez.

    Köszönöm! Nagy segítség ez! :R

    Azt nem tudom, elvileg a telefonban lennie kell driver-nek ami felismeri a rá dugott USB-s eszközt? Van ilyen szerintetek?

  • BigBlackDog
    veterán

    Sziasztok!
    Kis segítséget szeretnék kérni. Google Play Szolgáltatásokat szeretném telepíteni, mivel az egyik alkalmazáshoz kellene (SupportMapFragment-ből származtatott saját osztályhoz). Playből sikeresen le is töltődik, de telepítésnél kapok egy hibaüzenetet; "Összeegyeztethetetlen más, ugyanazon megosztott felhasználói azonosítót használó alkamazással/alkalmazásokkal". Próbáltam más eszközről áthúzni az apk-t, majd berakni a system/app mappába (jogosulságokat beállítottam), de semmi nem történt. adb installal telepítve [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE] hibát kapok.
    Egy Sony Ericsson WT19i készüléken próbálkozok, amin RealICS r6 van telepítve, ha esetleg lényeges lenne. Mit kéne csinálnom, hogy tudjam telepíteni, használni? Előre is köszönöm. :R

  • Karma
    félisten

    Sziasztok!

    Szeretnék egy ajtónyitót csinálni az egyik kihasznált Androidos telómból. A programozás résznél egyelőre nem tartok, de ahogy néztem, eléggé könnyen megoldható, viszont az elektronikai résszel bajban vagyok. Találtam több netről rendelhető usb-s relay boardokat, de attól félek, arra rádugom a telefonomat, és nem fog töltődni USB-n keresztül, ami kellemetlen. Az usb kábel szétbarmolásával meg lehetne oldani a tápellátást, de inkább titeket kérdeznélek meg előbb, van e valamilyen bevált kütyü erre, ami esetleg tölti is a telefont USB-n keresztül miközben rajta lóg?

    Nem vagyok nagy guruja a témának, de a Google kitalálta az ilyen felhasználáshoz az ADK-t, és vannak fain kulcsrakész lapok az ilyen hobbifejlesztéshez.

  • pittbaba
    aktív tag

    Sziasztok!

    Szeretnék egy ajtónyitót csinálni az egyik kihasznált Androidos telómból. A programozás résznél egyelőre nem tartok, de ahogy néztem, eléggé könnyen megoldható, viszont az elektronikai résszel bajban vagyok. Találtam több netről rendelhető usb-s relay boardokat, de attól félek, arra rádugom a telefonomat, és nem fog töltődni USB-n keresztül, ami kellemetlen. Az usb kábel szétbarmolásával meg lehetne oldani a tápellátást, de inkább titeket kérdeznélek meg előbb, van e valamilyen bevált kütyü erre, ami esetleg tölti is a telefont USB-n keresztül miközben rajta lóg?

  • pigster
    senior tag

    Ha a készüléket elforgatom, akkor az Aktivity meghívásakor átadott Intent, meg az átadott extra is megy a levesbe, vagy pedig az Intentek "túlélik" az elforgatást, és azután is használhatók?

    Illetve erre tud valaki esetleg megoldást?

  • fatal`
    titán

    Én arra tippelnék, hogy unspecified fallback fog történni. Nem tudja értelmezni az értéket, ezért az alapértelmezettet fogja használni. Egyéb XML paramétereknél is ez szokott lenni, hogy ami az új API-ban jött be, de a régi nem érti, akkor választ egy alapértelmezettet. Talán a match_parent - fill_parent páros ilyen. A match_parent-es layoutok is működnek API 7-en.

    Sianis

    Köszi. :)

  • Sianis
    addikt

    Ugyanide tartozó kérdés, mert volt egy kis kavarodás a manifestemben, ha én android:screenOrientation="sensorPortrait" -ot használok, akkor mi történik egy Froyo eszközön? Ez a paraméter API Level9-nél lett bevezetve.

    Én arra tippelnék, hogy unspecified fallback fog történni. Nem tudja értelmezni az értéket, ezért az alapértelmezettet fogja használni. Egyéb XML paramétereknél is ez szokott lenni, hogy ami az új API-ban jött be, de a régi nem érti, akkor választ egy alapértelmezettet. Talán a match_parent - fill_parent páros ilyen. A match_parent-es layoutok is működnek API 7-en.

    Sianis

  • fatal`
    titán

    Ugyanide tartozó kérdés, mert volt egy kis kavarodás a manifestemben, ha én android:screenOrientation="sensorPortrait" -ot használok, akkor mi történik egy Froyo eszközön? Ez a paraméter API Level9-nél lett bevezetve.

  • fatal`
    titán

    Láma viszontkérdés: melyik eszköz nem tud portrait állást? :Y TV?

    Médiaboxok, tv-re kötött telefon / tablet (HDMI).

  • Karma
    félisten

    Valaki nem tudja, hogy hogy lehet lekérni, hogy az adott eszköz, amin fut a program milyen képernyő-tájolásokat támogat? (álló-fekvő)

    Konkrétan az a gondom, hogy a programom csak állót támogat, fekvőn indítva széthúzza a képet, ezt szeretném elkerülni (fekete csíkot fogok rakni), de csak akkor, ha nincs álló mód eszközön.

    Próbáltam googleval keresgélni, de nem találtam csak olyan bejegyzéseket, ami a jelenlegi állapotot kéri le.

    Most állóra van korlátozva a program, arra gondoltam, hogyha a képméret még mindig szélesebb, mint magasabb, akkor valójában fekvő. Viszont nem tudom, hogy ez nem okozna-e problémát egy tableten, ráadásul ezt tesztelni sem tudom, eszköz hiányában.

    Láma viszontkérdés: melyik eszköz nem tud portrait állást? :Y TV?

  • fatal`
    titán

    Valaki nem tudja, hogy hogy lehet lekérni, hogy az adott eszköz, amin fut a program milyen képernyő-tájolásokat támogat? (álló-fekvő)

    Konkrétan az a gondom, hogy a programom csak állót támogat, fekvőn indítva széthúzza a képet, ezt szeretném elkerülni (fekete csíkot fogok rakni), de csak akkor, ha nincs álló mód eszközön.

    Próbáltam googleval keresgélni, de nem találtam csak olyan bejegyzéseket, ami a jelenlegi állapotot kéri le.

    Most állóra van korlátozva a program, arra gondoltam, hogyha a képméret még mindig szélesebb, mint magasabb, akkor valójában fekvő. Viszont nem tudom, hogy ez nem okozna-e problémát egy tableten, ráadásul ezt tesztelni sem tudom, eszköz hiányában.

  • fatal`
    titán

    Ezt a leírást most találtam, kevés fájdalommal lehet egy gépen Hyper-V és HAXM is, noha nem is egy időben :) Főleg hasznos, mert VMware-t is szeretnék néha használni.

    Igen, ezt már próbáltam. Restart kell neki ez a baj, de annyira nem nagy gond. :)

    Mondjuk közel sem biztos, hogy fogok WP-re fejleszteni, egyelőre csak feltelepítettem az SDK-t. :)

  • Karma
    félisten

    Igen, észrevettem. :( Gondoltam megnézegetem a WP8 SDK-t, hogy milyen, de összeakad a kettő. Remélem majd javítják. Bár nem tudom, hogy ez bugos-e, vagy a hyper-v.

    (#609) WonderCSabo: Azt hiszem, csak az alap droidhoz van x86 image. :(

    Ezt a leírást most találtam, kevés fájdalommal lehet egy gépen Hyper-V és HAXM is, noha nem is egy időben :) Főleg hasznos, mert VMware-t is szeretnék néha használni.

  • fatal`
    titán

    Én épp most próbálom virtualbox-al. Múltkor említették nekem hogy azzal sokkal jobb.

    Ehhez nem kell Vbox, a gyári emulátor fut vt-vel és gyors. A VirtualBoxos verzióból 2.2 volt a legújabb, amikor néztem és elég körülményes használni, akkor már inkább a bluestacks. :)

    Ja és az a 2.2-es verzió szintén nem emulált opengl-es 2.0-t, így én nem mentem vele semmire. Normál appok fejlesztéséhez persze jó lehet (és közben valószínűleg van már újabb verzió is).

  • SektorFlop
    aktív tag

    Igen, észrevettem. :( Gondoltam megnézegetem a WP8 SDK-t, hogy milyen, de összeakad a kettő. Remélem majd javítják. Bár nem tudom, hogy ez bugos-e, vagy a hyper-v.

    (#609) WonderCSabo: Azt hiszem, csak az alap droidhoz van x86 image. :(

    Én épp most próbálom virtualbox-al. Múltkor említették nekem hogy azzal sokkal jobb.

  • fatal`
    titán

    Sajnos ha az ember WP8 SDK-val is dolgozik, nem használhatja, mert összeakad a Hyper-V-vel :(

    Igen, észrevettem. :( Gondoltam megnézegetem a WP8 SDK-t, hogy milyen, de összeakad a kettő. Remélem majd javítják. Bár nem tudom, hogy ez bugos-e, vagy a hyper-v.

    (#609) WonderCSabo: Azt hiszem, csak az alap droidhoz van x86 image. :(

  • WonderCSabo
    félisten

    A legtöbben biztos láttátok / próbáltátok már, de azért leírom, hátha van valaki, aki nem vette észre:

    Érdemes letölteni az SDK Managerben az Intel x86 Emulator Accelerator (HAXM) extrát és az emulátornál x86 imaget használni, mert így értelmes tempója lesz az emulátornak (gpu emulációval játékfejlesztésre is alkalmas végre, bár elvagyok a BlueStacks-szel). Intel VT-x képes cpu (és gondolom chipset) és biosban bekapcsolt VT kell hozzá.

    Most már csak az eclipseből fordított apk átviteli tempójára kéne valamit kitaláljanak, mert az még mindig baromi lassú.

    Nem hiszem el, Google APIs-al nem megy, csak alap Android-al. :(

  • Karma
    félisten

    A legtöbben biztos láttátok / próbáltátok már, de azért leírom, hátha van valaki, aki nem vette észre:

    Érdemes letölteni az SDK Managerben az Intel x86 Emulator Accelerator (HAXM) extrát és az emulátornál x86 imaget használni, mert így értelmes tempója lesz az emulátornak (gpu emulációval játékfejlesztésre is alkalmas végre, bár elvagyok a BlueStacks-szel). Intel VT-x képes cpu (és gondolom chipset) és biosban bekapcsolt VT kell hozzá.

    Most már csak az eclipseből fordított apk átviteli tempójára kéne valamit kitaláljanak, mert az még mindig baromi lassú.

    Sajnos ha az ember WP8 SDK-val is dolgozik, nem használhatja, mert összeakad a Hyper-V-vel :(

  • WonderCSabo
    félisten

    A legtöbben biztos láttátok / próbáltátok már, de azért leírom, hátha van valaki, aki nem vette észre:

    Érdemes letölteni az SDK Managerben az Intel x86 Emulator Accelerator (HAXM) extrát és az emulátornál x86 imaget használni, mert így értelmes tempója lesz az emulátornak (gpu emulációval játékfejlesztésre is alkalmas végre, bár elvagyok a BlueStacks-szel). Intel VT-x képes cpu (és gondolom chipset) és biosban bekapcsolt VT kell hozzá.

    Most már csak az eclipseből fordított apk átviteli tempójára kéne valamit kitaláljanak, mert az még mindig baromi lassú.

    Hmm, ezt kipróbálom, nem vagyok benne biztos, hogy ezt használom-e.

  • fatal`
    titán

    A legtöbben biztos láttátok / próbáltátok már, de azért leírom, hátha van valaki, aki nem vette észre:

    Érdemes letölteni az SDK Managerben az Intel x86 Emulator Accelerator (HAXM) extrát és az emulátornál x86 imaget használni, mert így értelmes tempója lesz az emulátornak (gpu emulációval játékfejlesztésre is alkalmas végre, bár elvagyok a BlueStacks-szel). Intel VT-x képes cpu (és gondolom chipset) és biosban bekapcsolt VT kell hozzá.

    Most már csak az eclipseből fordított apk átviteli tempójára kéne valamit kitaláljanak, mert az még mindig baromi lassú.

  • WonderCSabo
    félisten

    Nem kell az ActionBarSherlock miatt plusz libet belehúzni. Illetve még ott van a Holo Everywhere. Valamint van egy olyan titkos vágyam, hogy megnézem, csak 4.0 felé lőtt appnak van-e esélye elterjedni.

    Sianis

    Köszi a választ, így már világos mire gondoltál. Az ActionBarSherlock nagyon jó lib, a Holo Everywhere-t nem ismerem, feltételezem azt csinálja amit a neve mond. :)

  • Sianis
    addikt

    4.0 feletti eszközökkel lehet egyelőre használni, hogy a mérete kellően kicsi lehessen.

    Ezt kifejtenéd picit bővebben? Miét lesz kicsi a mérete 4.0+ esetén?

    Nem kell az ActionBarSherlock miatt plusz libet belehúzni. Illetve még ott van a Holo Everywhere. Valamint van egy olyan titkos vágyam, hogy megnézem, csak 4.0 felé lőtt appnak van-e esélye elterjedni.

    Sianis

  • WonderCSabo
    félisten

    Kis reklám:

    Készülget egy app az xkcd-hez. 4.0 feletti eszközökkel lehet egyelőre használni, hogy a mérete kellően kicsi lehessen. A linken lehet jelentkezni, TestFlight-on keresztül megy terjesztés (legalább lesz tapasztalat az androidos implementációról is). Jöhetnek a visszajelzések bátran ide is. Csak tessék, csak tessék! És köszönöm előre is!

    [link]

    Sianis

    4.0 feletti eszközökkel lehet egyelőre használni, hogy a mérete kellően kicsi lehessen.

    Ezt kifejtenéd picit bővebben? Miét lesz kicsi a mérete 4.0+ esetén?

  • pigster
    senior tag

    Azt hogyan lehet megcsinálni, hogy sqlite használatával a rendezés magyar ékezethelyes legyen? Tehát az "Á"-val kezdődő dolgok ne a lista végér kerüljenek, hanem az "A" után?

    Cursor android.database.sqlite.SQLiteDatabase.query(
    String table,
    String[] columns,
    String selection,
    String[] selectionArgs,
    String groupBy,
    String having,
    String orderBy)

    Így csinálnám, működik is szépen, de hol tudom beállítani, hogy magyar abc alapján rendezzen?

Új hozzászólás Aktív témák