Hirdetés

2024. április 28., vasárnap

Gyorskeresés

Hozzászólások

(#1451) WonderCSabo válasza thon73 (#1450) üzenetére


WonderCSabo
félisten

Ha egy Fragment állapotát vissza kell állítani, akkor a következő a szokásos:

public class MyFragment extends ListFragment {

...

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (savedInstanceState != null) {
// visszaállítod az állapotot
}
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// kimented az állapotot
}
}

Ha az allápotot manuálisan kell kimenteni/visszaállítani, azt is megteheted:

Fragment.SavedState state = getFragmentManager.saveFragmentInstanceState(yourFragment);
// ez csak akkor műküdik, ha a FragmentManagerhez éppen csatolva van a Fragment
...

MyFragment fragment = MyFragment.newInstance();
fragment.setInitialSavedState(state);

[ Szerkesztve ]

(#1452) thon73 válasza WonderCSabo (#1451) üzenetére


thon73
tag

Köszi! No, ez eszembe se jutott. Csak, hogy jól értem-e:
Mivel a paraméterek között van kötelező, meg opcionális, az lenne tehát a legjobb, ha készítek egy Builder-t az első létrehozáshoz. Az összes szükséges paramétert ebben megadom a Fragment első létrehozásánál; majd az előbbi módszerrel mentem és visszatöltöm az összes - immáron belső - paramétert az újraindításnál.
Ez egyúttal azt is jelenti, hogy nem kell leszármazottakat készítenem, egyetlen osztály - többféle paraméterezéssel - megcsinálja az összes tábla listázását.
((Hm. Én csak egy könnyen bővíthető programot szerettem volna, de ez a módszer hatalmas előrelépés egy szabadon (programkód változtatás nélkül) megadható adatbázisszerkezetet használó kezelő irányában :R ))

(#1453) WonderCSabo válasza thon73 (#1452) üzenetére


WonderCSabo
félisten

Igen, ebben az esetben ez egy járható út. A Builderben az opcinoális paramétereket is beállíthatod, hiszen részben ez is az előnye a konstruktorral szemben. [link] Egyébként nagyon sokan helytelenül hívják ezt Buildernek, ez valójában a Fleunt interface és a Builder egyfajta keveréke.

(#1454) thon73 válasza WonderCSabo (#1453) üzenetére


thon73
tag

Kipróbáltam a lehetőségeket. Végső soron a setArguments() nagyon hasonló lehetőséget ad egy Builder/Fleunt interfészhez. A hátránya, hogy a paramétereket Bundle-ban kell átadnom; előnye, hogy nem kell a mentéssel/visszatöltéssel foglalkozni, a paraméterek újraindítás után is hozzáférhetőek. A Builder/Fleunt talán könnyebben beállítható a hívó oldalon.

Lenne egy másik kérdésem is: még mindig a template alapján elkészített leszármazottak problematikájával vagyok elfoglalva - ezúttal a layout oldalán. A Fragmentek egy-egy adatbázis táblából származó elemet jelenítenek meg. A layoutban sok a közös, pl. Add, Update, Delete stb. gombok; de az űrlap szerű rész minden táblánál egyedi.
Úgy gondoltam, hogy létrehozok egy "alap" layoutot egy ViewStub-bal, amit az egyes Fragmentek programból lecserélnek a nekik megfelelő űrlap-layoutra.
Ahogy olvasgattam, egy ilyen megoldástól több helyen óvtak, merthogy nagyon rontja a performance-ot. (Én nem tudom elképzelni.) Van más lehetőség programból al-layout létrehozására? ((Mind az alap, mind az űrlap layout elég összetett.))

(#1455) WonderCSabo válasza thon73 (#1454) üzenetére


WonderCSabo
félisten

Mi ezzel a probléma? Csinálsz mondjuk egy custom view-t, ami mondjuk LinearLayoutból származik. Egy layout fájl tetejére berakoda custom view-t. Mindegyik Fragment ezt a layout filet inflateli, és a custom view alá berakja a saját űrlapját. Ezt még megdobhatod azzal, hogy csinálsz egy ősfragmentet, ami megcsinálja az előzőeket, és az eventekre is ráakaszkodik. A gyerek Fragmentek pedig berakják alá a saját űrlapot, az eventes függvényeik (add, update) pedig meghívódnak mivel az már az ősben kezelven van.

[ Szerkesztve ]

(#1456) thon73 válasza WonderCSabo (#1455) üzenetére


thon73
tag

Igen, így képzeltem el, de egyetlen részt nem értek: "és a custom view alá berakja a saját űrlapját." Ezt hogy csinálom meg? ((Xml-ben meg is van, de nem akartam, hogy minden layout-nak hivatkoznia kelljen a közös layout-ra (meg akkor az ősfragment működése is komplikálódik.) )) Programkódból ez hogyan oldható meg? addView-vel?

(#1457) Karma válasza thon73 (#1456) üzenetére


Karma
félisten

Például azzal. De nem ez az egyetlen lehetőség, mondjuk rakhatsz a layoutba egy ViewStubot, amibe azt fújsz fel amit akarsz - fragmentspecifikusan.

“All nothings are not equal.”

(#1458) WonderCSabo válasza Karma (#1457) üzenetére


WonderCSabo
félisten

Igen, ez a ViewStub is jó ötlet, így még meg is szabható a pozíció és a méret az őslayoutban.
Ezt az osztályt még sosem használtam, de tetszik.

(#1459) thon73 válasza Karma (#1457) üzenetére


thon73
tag

Köszönöm, ViewStub-bal összeállt az egész.
Még nem használtam ViewStub-ot, és ahol olvastam róla (persze most sehol nem találom), többen panaszkodtak ilyen megoldásnál a teljesítményre. Mindenesetre én semmi hibát nem látok, megy, mint a kisangyal... :C

(#1460) thon73


thon73
tag

Kicsit szégyenlem, hogy mindig én kérdezek; valószínű egy picit nagyobb fába vágtam a szekercét, mint gondoltam... :F
Van két adatbázis-táblám. Db1 egyik mezője (egy long id érték) hivatkozik Db2 egy elemére. Amikor Db1 űrlapját jelenítem meg, akkor természetesen nem a long érték, hanem a Db2-ben hivatkozott elem szöveges részei kerülnek kiírásra. Ez szerencsére eddig elég jól működik.

A kérdésem a következő: létre tudnék-e hozni olyan custom TextView-t vagy akár speciális osztályt, amelyik KÖVETI a hivatkozás megváltozását. Vagyis, ha a long id megváltozik, akkor frissíti a hozzá tartozó szöveges értékeket is (kikeresi az új értéket az adatbázisból). ÉS mindezt valahogy úgy, hogy a Fragment (amiben az űrlap elhelyezkedik) újraindításait is átvészelje.

Bocsánat, ha homályos egy kicsit a kérdésem. Bevallom, nekem is. Ezt a funkciót most a Fragment-en belül elhelyezkedő kódrészek valósítják meg, csak szeretném ezt a kódot egy kicsit elhatárolni a Fragmenttől. Pl. ha több hasonló hivatkozó értékem van, akkor is tudjam használni. Van valakinek valami ügyes ötlete? Előre is köszönöm!

(#1461) rgeorge válasza thon73 (#1460) üzenetére


rgeorge
addikt

Ezt nem adatbázison belül egy lekérdezéssel csinálod meg (join)?

Picard: "What we leave behind is not as important as how we've lived. After all, Number One, we're only mortal." Riker: "Speak for yourself, sir. I plan to live forever."

(#1462) WonderCSabo válasza thon73 (#1460) üzenetére


WonderCSabo
félisten

Nem, hiszem, hogy jó ötlet a VIew-t így az adatbázishoz kötni. A hivatkozást magát a programkódból változtatod meg, miért nem frissíted kódból egyszerűen a View-idat? Vagy egyszerűen hívsz rajtuk egy update-et, ami majd megint queryzik az adatbázisból a db modulodon kereszütl.

[ Szerkesztve ]

(#1463) thon73 válasza WonderCSabo (#1462) üzenetére


thon73
tag

A teljes táblát egy ListView jeleníti meg, ott a join-nal összekötött táblákat egyszerűen lekérdezem, és a mezőket a megf. TextView-kba teszem. Ez gond nélkül megy.

Az egyes elemeket azonban egy űrlap jeleníti meg, ahol az egyes elemek önmagukban is megváltoztathatóak. Pl. egy könyv írójának itt az írók közül kiválaszthatok valaki mást, mielőtt magát az adatbázis-sort módosítom. A kódot egyébként megírtam, és működik is, de a linkelt adatbázisok űrlapjának kódja emiatt többször hosszabb, mint az egyetlen adatbázisra hivatkozók. A végleges megvalósításban ráadásul több ilyen "linkelt" elemet is kellene kezelnem, ezért gondoltam, hogy ezt a kódot valahogy leválasztom, akár View-ba, akár speciális új változótípus-szerű osztályba.

A félelmem pont az amire WonderCSabo rámutatott; hogy ezt túlságosan belekötöm a Fragmentbe, akkor vagy az nem tud békésen eltűnni újraindítás után, vagy a lekérdezést nem tudom megfelelően elvégezni. Pláne, ha több TextView-t kell egy id-hez kötni.

Hosszas keresés után most találtam egy megoldást (vagy legalábbis annak tűnik): ITT Megpróbálom így átkonvertálni. Meg valószínűleg lassan elolvasok egy komolyabb könyvet a software design patterns témában...

(#1464) RexpecT


RexpecT
addikt

Találtam egy jó kis tutorialt az ActionbarSherlock CAB részéhez: [link].

Szeretnék egy összes elemet kijelölő gombot implementálni. Gyakorlatilag a kód megegyezik a fentivel.
Így írtam meg, de valamiért mégsem működik:

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

switch (item.getItemId()) {
case R.id.actionbarDelete:
// retrieve selected items and delete them out
SparseBooleanArray selected = arrayAdapter
.getSelectedIds();
for (int i = (selected.size() - 1); i >= 0; i--) {
if (selected.valueAt(i)) {
ListItem selectedItem = arrayAdapter.getItem(selected.keyAt(i));
arrayAdapter.remove(selectedItem);
}
}
mode.finish(); // Action picked, so close the CAB
return true;
case R.id.actionbarSelectAll:

int all = arrayAdapter.getCount();
Toast.makeText(getActivity(), "" + all, Toast.LENGTH_LONG).show();
for (int i = 0; i < all; i++) {
arrayAdapter.toggleSelection(i);
arrayAdapter.notifyDataSetChanged();
}
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}

}

Valakinek valami ötlete? :R

[ Szerkesztve ]

(#1465) WonderCSabo válasza RexpecT (#1464) üzenetére


WonderCSabo
félisten

A CAB elindul ugye? Az eventeket megkapod? Pontosan mi nem működik?

(#1466) RexpecT válasza WonderCSabo (#1465) üzenetére


RexpecT
addikt

Igen elindul, de gombnyomásra csak a Toast üzenet jelenik meg a listában lévő elemek számával, de az összes elem kijelölése mégsem történik meg.

(#1467) WonderCSabo válasza RexpecT (#1466) üzenetére


WonderCSabo
félisten

Akkor minden bizonnyal az arrayadaptered a ludas. Nézd meg, hogy a toggleSelection és a getSelectedIds metódusokat helyesen működnek-e, illetve hogy a getView-ban megfelelően frissíted-e a becsekkolt állapotot.

(#1468) RexpecT válasza WonderCSabo (#1467) üzenetére


RexpecT
addikt

Köszönöm, megnézem majd holnap. :R

(#1469) thon73


thon73
tag

Meg tudnátok mondani, hogy ha új, saját témát (konkrétan színvilágot) szeretnék a programomnak, akkor honnan érdemes elindulni? A hogyan az megy, csak nem tudom, hol találok olyan összefoglalót, hogy mi mindenre kell figyelemmel lenni, milyen attributumokat kell feltétlen definiálni stb.

(#1470) WonderCSabo válasza thon73 (#1469) üzenetére


WonderCSabo
félisten

Innen. Továbbá ez megcsinálja helyetted a photoshopolást, ha holo elemeket akarsz átszínezni. Illetve az ehhez hasonló eszközök.

[ Szerkesztve ]

(#1471) thon73 válasza WonderCSabo (#1470) üzenetére


thon73
tag

Az elejét olvastam, de megriasztott a két utolsó gigantikus méretű file... Ezek szerint ne kézzel álljak neki, hanem fogjak egy ilyen programot (mint pl. a holos cucc), ami legyártja a nekem tetsző színben az egészet. No, nekiállok játszani, ((eddig a külsőségekkel még nem nagyon foglalkoztam.))
Köszönöm!

(#1472) WonderCSabo válasza thon73 (#1471) üzenetére


WonderCSabo
félisten

Ha custom designt akarsz, ami az alkalmazásban egységesesen megjelenik, akkor bizony a két nagy fájlt viszonylag jól kell ismerni. Ha csak átszínezni, akkor a generátor megteszi helyetted.

(#1473) thon73 válasza WonderCSabo (#1472) üzenetére


thon73
tag

Köszi, sikerült színes részeredményeket elérni, és ezzel rövidtávon meg is elégszem. De alapos külső segítséget (na jó, kritikát) kaptam a család tízéves stylistjától is :-)

Még egy kérdés, amivel nem jutok dűlőre: Van egy custom view, ami egy TextView-ból származik. Annak a formázását hogyan tudom a témához hozzáadni? Konkrétan ugyanolyan külsőt szeretnék, mint az EditText, csak más színekkel. Egy ilyesmit (a viewben) készítettem, de nem sikerül a témába szerelni.

[ Szerkesztve ]

(#1474) WonderCSabo válasza thon73 (#1473) üzenetére


WonderCSabo
félisten

Hmm, ezt még nem próbáltam ki. Itt a styles.xml. Az EditText stílusát a Widget.TextView style adja meg. Csinálsz egy style-t, ami defeniálja ezek közül azt, amit kell, és beadod a custom view-dnak az android:style propertyn keresztül.

(#1475) thon73 válasza WonderCSabo (#1474) üzenetére


thon73
tag

Igaz, style nélkül, de ezt csináltam meg. A gond csak annyi, hogy rengeteg ilyen customview van, ezért akartam betenni alapértelmezettenk ezt a style-t, vagy az attributumokat. Még keresek tovább; ezt biztos vhogy. meg lehet csinálni...

Kieg: a rengeteg, az rengeteg ugyanolyan. Összesen csak két custom view típust csináltam, csak sok példányuk van szana-szét.

[ Szerkesztve ]

(#1476) WonderCSabo válasza thon73 (#1475) üzenetére


WonderCSabo
félisten

Meg tudod csinálni programatikusan is, a custom View kosntruktorában:

class CustomEditText extends EditText {

public CustomEditText(Context context, AttributeSet attrs) {
super(new ContextThemeWrapper(context, R.style.your_style), attrs);
}

}

Így minden CustomEditText példány a te stílusoddal fog rendelkezni alapból.

[ Szerkesztve ]

(#1477) thon73 válasza WonderCSabo (#1476) üzenetére


thon73
tag

Kiváló és egyszerű. Köszi! Ez jó lesz

(#1478) thon73


thon73
tag

Hát, úgy látszik, mindig csak én akadok el... Vérszemet kaptam a stílusokon, és - gondoltam - a fragmentekbe is beteszek egy kis animációt.
Egymás mellett van két fragment: egy listFrag (list_frame frame layoutban) és egy editFrag (edit_frame-ban). Ez a layout, ami programból kapja meg a fragmenteket:

<LinearLayout
android:id="@+id/landscape"
android:orientation="horizontal" ...>
<FrameLayout
android:id="@+id/list_frame"
android:layout_weight="2" .../>
<FrameLayout
android:id="@+id/edit_frame"
android:layout_weight="3" .../>

editFrag itt animálva belép (csak lényegi rész!):

fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left , android.R.anim.slide_out_right, android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentTransaction.add(R.id.edit_frame, editFrag, "EDIT");
fragmentTransaction.addToBackStack("LIBDB");

és itt animálva eltűnik:

fragmentManager.popBackStackImmediate();

A gond az, hogy edit_FRAME akkor is "tartja a helyét", ha editFRAG eltűnik, emiatt a listFRAG (és Frame) nem szélesedik ki a teljes képszélességre.
Ezért hozzátettem még egy sort:

findViewById(R.id.edit_frame).setVisibility(View.GONE);

Volilá! A ListFrag most a teljes képszélességet elfoglalja! (Persze, editFrag létrehozásakor a Frame-t is visszakapcsolom.)
Csakhogy, ezzel eltűnt az animáció, mert a setVisibility előbb végrehajtásra került.

Meg lehet szerintetek ezt valahogy együtt oldani? Tehát: editFrag animálva elosonjon, és a listFrag EZT KÖVETŐEN (vagy ezzel együtt) kitöltse a teljes helyet??
Előre is köszönöm!

(#1479) ted_mosby


ted_mosby
senior tag

Van egy szerintem egész jó ötletem egy applikációra. Csak az a baj hogy még soha nem programoztam androidot.
Ez egy "buta" app lenne. Időbeállításhoz csatlakoztatnám a különböző profilokat.
Tudtok segíteni hogy hogyan is kezdjek bele :F

Sony Xperia Z1 Compact Felhasználó | "Az előre nem látott lehetőséget azonnal használd ki, s az előre nem látott nehézségekre rögtön tettel felelj." ~ Carl Von Clausevitz

(#1480) ted_mosby válasza ted_mosby (#1479) üzenetére


ted_mosby
senior tag

Valaki nem tud segíteni? :F Vgy nagyon kihalt ez a topic, pedig szerintem lenne jövője.

Sony Xperia Z1 Compact Felhasználó | "Az előre nem látott lehetőséget azonnal használd ki, s az előre nem látott nehézségekre rögtön tettel felelj." ~ Carl Von Clausevitz

(#1481) WonderCSabo válasza ted_mosby (#1479) üzenetére


WonderCSabo
félisten

Először is kezd el megcsinálgatni az android tutorialokat. Nagyon jó a hivatalos és a Vogella is.

(#1482) thon73 válasza thon73 (#1478) üzenetére


thon73
tag

Ezt (az animációs kérdést) még nem tudtam megoldani, addig is kihagytam az animációt.

Lenne viszont egy egyszerűbb kérdésem: nagy mennyiségű (6-8 db) DialogFragment-et használok/nék. Mi erre a jó megközelítés, hogyan érdemes ennyit beépíteni a programba (egyetlen activity, két fragmenttel)? Van erre egy jó tutorial?
((Pontosítom: A DialogFragment-ek - önmagukban - prímán működnek, a kérdés nem A dialogus létrehozására, hanem SOK dialogus ésszerű kezelésére vonatkozik.))
Köszönöm!

[ Szerkesztve ]

(#1483) WonderCSabo válasza thon73 (#1482) üzenetére


WonderCSabo
félisten

Mit is szeretné pontosan a dialógusokkal?

(#1484) thon73 válasza WonderCSabo (#1483) üzenetére


thon73
tag

Megerősíteni egy-egy akciót. Van egymás mellett egy list, és a lista egyik elemét mutató űrlap. Az űrlap törlésekor rákérdez, cancel-nél rákérdez, ha a listából másik elemet választok, de az űrlap már szerkesztés alatt van, rákérdez. Ha nem töröéhető az űrlap (foreign key constraint miatt), akkor figyelmeztet. Aztán van egy file választó rész, ott még több figyelmeztetés van.
Amit nem értek: minden eseménynél a dialógus megfelelő gombja szerint megyek ugye tovább. De vannak nagyon hasonló dialógusok (are you sure pl.), ott mindegyik akciónak külön dialógust (file-t) készítek? Egyáltalán érdemes minden fragmentet külön fileba tenni, vagy egy nagy file készítse el a sok fragmetet? Szóval nem látom, milyen szerkezet a legelőnyösebb; viszont minden tutorial csak egyetlen dialogusról ír.

(#1485) Karma válasza thon73 (#1484) üzenetére


Karma
félisten

Alapvetően dialógustípusonként készíts egy osztályt, ne konkrét példányonként, és ezek mind külön fájlba menjenek, hiszen semmi közük egymáshoz. Készítsd fel az osztályt úgy, hogy a szövegek, a gombok feliratai kívülről meg argumentsből is állítható legyen, így mindig be tudod paraméterezni a használat helyén.

Vagy mielőtt feltalálod újra a kereket, nézz rá az AlertDialog osztályra és ha elég, használd azt!

[ Szerkesztve ]

“All nothings are not equal.”

(#1486) thon73 válasza Karma (#1485) üzenetére


thon73
tag

Köszi, ez a "középutas" ötlet kiváló.

Eredetileg AlertDialog-ot használtam (és igen, elég), csak:
- elfordítás nem megoldott, amit úgy oldottam meg, hogy DestroyView (ha jól emlékszem) magasságában bezártam a dialogust. (na jó, ez apró hiba, minek állandóan forgatni a gépet!
- tetszett az ötlet, hogy a terjedelmes kódból kikerülnek a dialogusok, bár (mivel a dialogushívás az activity törzsön keresztül történik) ki-be kell ugrálni az egyes programrészek között.

Ettől függetlenül, egy sima confirmation dialog esetén lehet, hogy tényleg célszerűbb az AlertDialog.

(#1487) Karma válasza thon73 (#1486) üzenetére


Karma
félisten

Önmagában nem kezeli a forgást, de ha DialogFragmenten keresztül használod, mindjárt jobb lesz a helyzet.

“All nothings are not equal.”

(#1488) pittbaba


pittbaba
aktív tag

Sziasztok!

Ezer helyen kerestem de nem találtam, hogy lehetne alkalmazásból blokkolni és háttérbe helyezni a bejövő hívásokat.
Mindenhol azt írják nem lehet, mert nincs jogosultságom, csak system appoknak engedélyezett ez. Meg is békélnék ezzel, de akkor hogy működik a sok-sok blocker app?
Remélem tudtok segíteni, mert megőrülök, hogy az egész interneten nincs erre megoldás! :)

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1489) fatal` válasza pittbaba (#1488) üzenetére


fatal`
titán

"de akkor hogy működik a sok-sok blocker app?"

Root joggal :D

(#1490) pittbaba válasza fatal` (#1489) üzenetére


pittbaba
aktív tag

Van is root jogom, de attól még nem tudom hogy kell megoldani. Egyébként most töltöttem le egy appot és nem is kért root jogot sem, mégis szépen működik.
Calls Backlist
[link]

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1491) WonderCSabo válasza pittbaba (#1490) üzenetére


WonderCSabo
félisten

Van itt egy megoldás, a private API-ra hív rá reflectionnel. Egy próbát megér.

(#1492) pittbaba válasza WonderCSabo (#1491) üzenetére


pittbaba
aktív tag

Köszönöm-köszönöm! :R

Bár végül máshol leltem meg a pontos szájbarágósabb megoldást, a te száladon el tudtam indulni, ezer millió köszönet!

[Itt van egy jó link a bejövő hívás blokkolás android alatt kérdéshez]

Tökéletesen működik, pont ahogy szerettem volna!

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1493) SektorFlop válasza thon73 (#1482) üzenetére


SektorFlop
aktív tag

hétvégén rászánok egy kis időt és megnézem neked az animciót, hátha tudok segíteni

"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."

(#1494) blade4


blade4
aktív tag

Sziasztok!

Nem tudom jó helyre írom-e a kérdésem.

Azt szeretném megtudni hogy a beállítások menü háttér szinét hogyan lehet megváltoztatni, fehéret szeretnék de nem találok leírást sehol, hogyan kell megcsinálni ha lehet?

(#1495) WonderCSabo válasza blade4 (#1494) üzenetére


WonderCSabo
félisten

Szia!

Ez a kérdés nem ide tartozik, ide az androidos programok készítésével kapcsolatos kérdések jönnek.

(#1496) blade4 válasza WonderCSabo (#1495) üzenetére


blade4
aktív tag

Ok!

Köszi! :R

(#1497) thon73 válasza SektorFlop (#1493) üzenetére


thon73
tag

Köszi SektorFlop! Én már feladtam, pedig klassz lenne :O

Feladat a következő: van egy listfragment balról, bármelyik elemét tappintva annak részletei megjelennek egy - nevezzük így - editfragmentben jobbról. Az editfragment mintegy "kiúszik" az elemből, majd "visszaúszik" a listába. A nehézséget az jelenti, hogy az editfragment eltűnése UTÁN a listfragment a teljes képszélességet foglalja el.
Ameddig eljutottam: A két fragment egy linearlayoutban volt. Az editfragment lassabban tűnt el, mint a helyéül szolgáló frame, így az animáció nem látszott.
Az a gyanúm, hogy átfedő fragmentekkel kellene dolgoznom (framelayout) és a programból beállítani a szélességeket. Igaz, hogy a listfragment így is azonnal elfoglalná a teljes szélességet, de legalább látszana az átfedő editfragment animációja. Ehhez a történethez viszont elég sok elvarázsolt számítás kellene - különösen, ha hozzávesszük, hogy más az elrendezés fekvő és álló módban.
((Extraként még jobb lenne, ha az activity-k is így animálnának, csak teljes képernyőben. De ez már egyszerűbb ügy lesz.))
Minden jó ötletet köszönök!

(#1498) pittbaba


pittbaba
aktív tag

Sziasztok!

Segítsetek nekem, mert nem értem mi zajlik..
Szeretném ha az appom újraindítaná a telefont minden nap adott óra perckor.
A reboot működik, meg van oldva, nem ez a kérdés, hanem az időzítés.
Azt olvastam, hogy erre AlarmManager a megoldás, meg is csináltam neki a reciever osztályt az egyik példa alapján ami konkrétan a google dokumentációban van.

Az időzítést beállítom (on boot reciever-ben), időben elkapja az Alarm reciever, újraindítja a telefonomat. Innentől kezdve a telefon a megadott 5 perc helyett (tesztelés miatt ennyi most az intervallum nem egy nap), kb 1 percenként rebootol, nem várja meg a kezdőidőponttól eltelő öt percet. Miért?

Itt a kód:

public class RebootReceiver extends BroadcastReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
@Override
public void onReceive(Context context, Intent intent)
{
//PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
//PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
//wl.acquire();

// Put here YOUR code.
Toast.makeText(context, "REBOOTING 14", Toast.LENGTH_LONG).show(); // For example

CancelAlarm(context);
Log.e("TAG","AUTO REBOOT NOW!");

try {
Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });
proc.waitFor();
} catch (Exception ex) {
Log.e("TAG", "Could not reboot", ex);
}


}

public void SetTimer(Context context)
{



alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, RebootReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 8);
CancelAlarm(context);
//alarmMgr.cancel(alarmIntent);
//AUTO REBOOT
//AlarmManager.INTERVAL_DAY
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),1000*60*5, alarmIntent);
Log.e("TAG","AUTO REBOOT BEÁLLÍTVA!");
}

public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, RebootReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}

Itt van beállítva az időzítés a bootrecieverben:

public class BootReciever extends BroadcastReceiver
{
RebootReceiver Reboot = new RebootReceiver();
@Override
public void onReceive(Context context, Intent intent) {
Log.i("TAG","BOOT Received");
String action = intent.getAction();

if(action.equalsIgnoreCase("android.intent.action.BOOT_COMPLETED"))
{

//Reboot időzítése
Reboot.SetTimer(context);
Intent myIntent=new Intent(context,com.example.thedoor.MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(myIntent);
}
}
}

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1499) pittbaba válasza pittbaba (#1498) üzenetére


pittbaba
aktív tag

Itt a megoldás:
[link]

Valamiért ha a nap elmúlt idejére időzítünk (pl: 11:00-ra időzítem a következő eseményt, de már 13:00 óra van, azt gondolná az ember, másnap 11:00-kor fog aktivizálódni, hát nem.. ), akkor azonnal aktivizálódik, és lefut az onreceive, ezért időzítés előtt vizsgálni kell, elmúlt e már az időzített időpont, és ha igen, akkor hozzá kell adni egy napot a kezdő időponthoz:

if(alarm.getTimeInMillis() <= now.getTimeInMillis())
_alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
else
_alarm = alarm.getTimeInMillis();

PH Konfigom: Gigabyte GA-H97M-D3H, i7 4790K,GTX 960, Seasonic SS-620GM

(#1500) Karma válasza pittbaba (#1499) üzenetére


Karma
félisten

Nem véletlen, hogy az AlarmManagernek egzakt időpontokat kell megadni, nem pedig ilyen humánus időleírásokat, mint "11 órakor" :)

“All nothings are not equal.”

Copyright © 2000-2024 PROHARDVER Informatikai Kft.