Hirdetés
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
Máris megszületett a Huawei Enjoy 70 utódja
ma Az Enjoy 70s processzorfrissítéssel próbál szerencsét, több változás nincsen rajta.
-
Már tudjuk, hogy mikor jön a PC Gaming Show 2024
gp Alig több mint egy hét múlva jön az esemény, amelyen több tucat játék bemutatójára számíthatunk.
Új hozzászólás Aktív témák
-
Karma
félisten
BROTIP: A bundle-t nem kell telepíteni, csak kitömöríteni.
dmc: Ilyen JNI hibák platformütközéskor szoktak előfordulni leginkább. A biztonság kedvéért vegyük át: 32-bites JDK mellé 32-bites ADT kell, 64-es JDK-hoz meg 64-es ADT. Keverve nem megy.
Egyébként nem szokott általában ez ilyen bonyolult lenni, csak valahol elsiklott valami... Pl. húsz perce raktam az egyik gépemre én is ADT-t, elsőre ment. Az SVN-t több szopás belőni
[ Szerkesztve ]
“All nothings are not equal.”
-
fatal`
titán
"hogy az Android Developers oldal mind a mai napig JDK 6!-ot javasol"
Ennek az az egyszerű oka van, hogy az android java 6-ot használ. Ettől függetlenül simán megy 7-es JDK-val, én is avval használom.
Amúgy 32 bit eclipse + 32bit jdk, 64-es winen is hibátlan.
"Egyébként az android alatt elég sok ilyen félkész/hibás/kerülőutas megoldással fogsz találkozni, ne akadj fenn rajta rögtön az elején..."
A hibák nagyrésze a java kókányolása, pl. windows alatt eleve cseszi megcsinálni a PATH változót, azt is kézzel kell, Linuxon ez pl. automatikus.Az SDK-ban meg sok félkész dolog nincs.
[ Szerkesztve ]
-
fatal`
titán
Az android sdk-nak kevés köze van az sqlitehoz, azt nem a google fejleszti.
Félkész != néhol bugos.
Nézd meg mennyi bug van egy sima appban, aztán hasonlítsd össze a méretét egy SDK-val. Az összes fejlesztői környezetben találni bugot, a .netben is van szép számmal.
De sokszor előfordul, hogy egy bugnak titulált helyzet nem bug, hanem másképp kell megoldani, mert nem úgy működik, mint, ahogy a fejlesztő gondolja.
A foreign key pl. ezer éves, olvasd el az utolsó commentet.
[ Szerkesztve ]
-
thon73
tag
No, megvan. Jó hírek minden Win7 használónak, rossz hírek dmc-nek...
A gép Toshiba Portege R830 (ez gondolom, nem lényeges).
Rendszer: Windows 7 Professional Service Pack 1
Összes korábbi JAVA törölve a programok vezérlőpulton, a gépen nincs JAVA könyvtár, nincs JAVA a PATH-ban sem.
Indításkor a megszokott, "nem találom a JAVA-t" üzenet fogad.Oracle honlapról: jdk-7u45-windows-x64.exe letöltve, telepítve a felajánlott c:\program files\java könyvtárba, gép újraindítva. Path NEM tartalmaz Java elemeket!
Android Developres honlapról a felajánlott file letöltése: adt-bundle-windows-x86_64-20131030.zip, egyszerűen TC-vel kicsomagolva. Az alkönyvtárból indítom az Eclipse-t, az indítja az SDK Manager-t (szintén műxik)
És minden működik, a próba project fut a virtuális gépen.
Bocsánat Google, az előző kiadás óta javították a 64 bitet...
((Megjegyzés: Az előző verziót is fent hagytam (API 17). A korábbi (6/33) Java 32 bites részének eltávolításakor összeomlott, az SDK Manager már nem ment (fekete ablak), az új Java verzióval pedig egyáltalán nem ment. ))
Esetleg még a USER menüben lévő .android könyvtár törlése segíthet a hibás beállítások törlésében.
-
SektorFlop
aktív tag
Csak küszködök, így belemegyek részletesen.
Van egy Fragment1, és Fragment2, PagerTabStrip formájában jelenik meg egy Activityn. Plusz egy sqlite db-m, és egy ArrayList-em amibe beletunkolom az adatbázisról a dolgokat objektum formájában.
Fragment2: ListView szépen létrejön minden a helyén. ✓
Átlapozok Fragment1-re, kitöltöm amit kell és gombnyomásra bővítem az adatbázis tartalmát. ✓
Az ArrayList kiegészül az újonnan felvitt adatokkal. ✓Innentől káosz minden:
Visszalapozok Fragment2-re ügyebár nem látszik a listán az új sor, és sehogy se sikerül összehoznom hogy frissüljön ListView."Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
rgeorge
addikt
Én inkább átalakítottam a feladatot, mert eredetileg azért kerestem az SD kártyát, mert az adott céleszközben az a legnagyobb kapacitású tároló, és arra kell menteni. A legnagyobb kapacitású tárolót viszont már könnyebb megtalálni ("/storage" alatti elemek közül kiválasztani a legnagyobb kapacitásút, amire az alkalmazás képes írni)).
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."
-
-
thon73
tag
Néhány próbálkozás után tapasztalati úton megválaszoltam magamnak: JOIN táblák esetén:
- A lejérdezés (qurey) minden formája (tehát értelemszerűen ContentProvider, Loader stb-be épített is) EGYEDI oszlopnevet kíván (tehát helyes a TELJES nevet megadni "table.column" formában). Logikus, hiszen különben nem tudja különválasztani az azonos nevűeket.
- Most jön a csavar: A Cursor NEM fogadja el a TELJES nevet, hanem az oszlopot CSAK a rövid, táblán belüli oszlopnévvel azonosítja. Ez nem akadályozza meg, hogy pl. két "_id" oszlop legyen. Ilyenkor persze név alapján nem lehet lekérdezni.((Hát egy újabb órát vakargattam a fejem, mire rájöttem, hogyan tudom kiszedni a két _id-t ))
-
rgeorge
addikt
-
SektorFlop
aktív tag
-
fatal`
titán
Azért van így, mert így írták meg, ez valószínűleg le van dokumentálva. Amúgy is szokás elnevezni az oszlopokat
"és ezt a problémát nem találtam még sehol a neten, biztos mindenki rögvest tudta.."
Mert nem jól kerestél, egyébként ez totál alap SQLAz AS nem kurzor oldalon működik, hanem az SQL szerver (jelen esetben maga a telefon, mivel sqlite) eleve az adott oszlopnévvel adja vissza a lekérdezés eredményét, így a valódi oszlopnévről a cursornak fogalma sincs.
[ Szerkesztve ]
-
SektorFlop
aktív tag
Én még tartozom egy kóddal ha jól emlékszem Még mindig nem oldódott meg a problémám, bár azóta nem is néztem még rá.
Szóval, a problémám ugyebár az volt, hogy egyik fragment-en töltögetek egy táblába dolgokat, a másikon pedig meg akarom azt jeleníteni. De a két fragment közötti váltogatáskor az ArrayList-em bővül az új objektummal, de a ListView nem épül újra.
Fragment1:
Kitöltjük az űrlapot és gombnyomásra hozzáadjuk az új objektumot, ezzel nincs is baj, bár lehetne még finomítani.if(v.getId() == R.id.btnAddAmount) {
String title = etTitle.getText().toString();
amount = Float.valueOf(etAmount.getText().toString());
int cat = spCategory.getSelectedItemPosition();
DatabaseHelper db = new DatabaseHelper(getActivity());
CostItem c = new CostItem(0, title, amount, cat, status, null, (int) salaryPercent, 1);
db.newCostRow(c);
CostModel.CostItems.clear();
cm.setCostItem();
}Fragment2:
onCreate-ben létrehozok egy ArrayList-et és onCreateView-ban létrehozom magát a listát.adapter = new CostArrayAdapter(
getActivity(), R.layout.cost_row, ids);
listview.setAdapter(adapter);ArrayList:
CostModel cm = new CostModel(getActivity());
cm.setCostItem();CostModel:
public static void LoadModel(int id, String title, float amount, int category_id, int status, String date, int percent, int salary_id) {
CostItems.add(new CostItem(id, title, amount, category_id, status, date, percent, salary_id));
}public void setCostItem() {
cost_id = db.getCostID();
for(int id : cost_id) {
CostModel.LoadModel(id,
db.getCostItem(id, CostTableStatic.rCOST_TITLE),
Integer.parseInt(db.getCostItem(id, CostTableStatic.rCOST_AMOUNT)),
Integer.parseInt(db.getCostItem(id, CostTableStatic.rCOST_CATEGORY_ID)),
Integer.parseInt(db.getCostItem(id, CostTableStatic.rCOST_STATUS)),
db.getCostItem(id, CostTableStatic.rCOST_DATE),
Integer.parseInt(db.getCostItem(id, CostTableStatic.rCOST_PERCENT)),
Integer.parseInt(db.getCostItem(id, CostTableStatic.rCOST_SALARY_ID)));
}
}Így ahogy másolgattam a kódot találtam benne fura dolgokat, amiken lehetne módosítani, pl. Fragment1-nél felesleges clear-ni a CostItem-et és újra létrehozni, elég lenne csak meghívni a LoadModel-t.
Remélem elég információt bemásoltam, a ListView újraépítése nincs benne mert csak gyenge próbálkozásaim voltak, nem tudom hogy mi lenne a megfelelő megoldás ebben az esetben.
"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
SektorFlop
aktív tag
Igen jól látod a db.newCostRow(c); betölti az új sort, ezután az ArrayListába is betölti. Az adatfeltöltés és minden velejáró dolog jól működik, kivéve a fragment2 lévő ListView újraépítése.
Tegnap próbálgattam az onFocusChange (fragment-ek lapozgatásánál lefut ez az esemény) eseményre meghívtam:
setAdapter() - nem történt semmi a listával
notifyDataSetChanged() - nem történt semmi a listávalGyanítom hogy valami apró dolgot rontok el, plusz ráadásul az is lehet hogy teljesen rossz oldalról közelitem meg a problémát.
"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
SektorFlop
aktív tag
Végre eljutottam odáig, hogy megnézzem a kódot amit küldtél. Valószínüleg ez megoldja a gondomat, de sajnos nem otthon vagyok így nem tudom saját kódomba kipróbálni.
Annyi hogy nekem a fragment2 nem listfragment. Hanem egy sima fragment és abban van egy listview.
[ Szerkesztve ]
"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
SektorFlop
aktív tag
Ma van egy kis időm, így megpróbáltam betenni a kódomba az általad küldött példát. De a OnInputReadyListener interface-el gondok vannak.
11-20 18:48:19.035: E/AndroidRuntime(1343): FATAL EXCEPTION: main
11-20 18:48:19.035: E/AndroidRuntime(1343): java.lang.ClassCastException: ---.MainActivity@a6f044c8 must implement OnInputReadyListener
11-20 18:48:19.035: E/AndroidRuntime(1343): at
---.fragment.FragmentMainPage1.onAttach(FragmentMainPage1.java:63)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:867)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.view.ViewPager.populate(ViewPager.java:1064)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.view.ViewPager.populate(ViewPager.java:911)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.View.measure(View.java:15172)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.View.measure(View.java:15172)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.View.measure(View.java:15172)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.LinearLayout.measureVertical(LinearLayout.java:833)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.View.measure(View.java:15172)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-20 18:48:19.035: E/AndroidRuntime(1343): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.View.measure(View.java:15172)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.Choreographer.doCallbacks(Choreographer.java:555)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.Choreographer.doFrame(Choreographer.java:525)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.os.Handler.handleCallback(Handler.java:615)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.os.Handler.dispatchMessage(Handler.java:92)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.os.Looper.loop(Looper.java:137)
11-20 18:48:19.035: E/AndroidRuntime(1343): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-20 18:48:19.035: E/AndroidRuntime(1343): at java.lang.reflect.Method.invokeNative(Native Method)
11-20 18:48:19.035: E/AndroidRuntime(1343): at java.lang.reflect.Method.invoke(Method.java:511)
11-20 18:48:19.035: E/AndroidRuntime(1343): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-20 18:48:19.035: E/AndroidRuntime(1343): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-20 18:48:19.035: E/AndroidRuntime(1343): at dalvik.system.NativeStart.main(Native Method)[ Szerkesztve ]
"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
WonderCSabo
félisten
El lehet fedni a statikus metódusokat, ergó csinálhatsz olyat A.newInstance() egy A példányt adjon vissza, B.newInstance() pedig egy B példányt, de ennek sok előnye nem lenne, azon kívül, hogy egységesen kezeled a neveket. Hogyha öröklődést, és ezekhez kapcsolódó fogalmakat, működéseket, szeretnél, akkor felejtsd el a statikus függvényeket. Az abstract factory valóban jó ötlet arra, hogy ha a legyártást akarod kiszervezni. Itt egy nagyon egyszerű példa van leírva, és Javában megvalósítva, ebből tutira érthető lesz. De akár a Factory method is használható erre a célra. Sőt, a Builder is, bár a példák között talán ez a legbonyolultabb.
Szerk.: Egyébként ez a kérdés inkább a java programozás topikba tartozik. Sőt még akár az általános Programozás topikba is lehetne, mivel a patternek bmilyen nyelven műkődhetnek, de mivel a Java implementáció is érdekes, a Java topik lenne a legjobb.
[ Szerkesztve ]
-
SektorFlop
aktív tag
Igen működik, mikor megtaláltam a hibát. megnéztem az onFocus-al is és úgy is frissíti a listát, nem azzal volt a baj, hogy az outFragment-em nem kapott értesülést róla. Az array adapteremet rontottam el egy csöppet.
És azt hiszem még nem köszöntem meg a segítséget, szóval nagyon szépen köszönöm . Megpróbálom valahogy viszonozni, a segítséget és a rám szánt időt.
"Amikor már azt hittem kint vagyok, ezek mindig visszarántottak..."
-
WonderCSabo
félisten
A newInstance nehezen lehet közös, hiszen ha jól értem abból egy Fragment példánnyal térsz vissza. Továbbá a newInstance egy példányt ad vissza, méghozzá az adott osztályból egy példányt, akkor hogy lehetne az ősben, vagy bárhol máshol, mint a saját osztálya? Illetve még egy dolog: az OO szemléletben egy fontos dolog, hogy a szülőnek nem nagyon szabad tudnia a gyerekeiről... Ha valami közös működést akarsz a Fragment legyártása során, akkor azt tedd meg az ősosztály konstruktorában, és hívjál rá a gyerekekben super hívással. Ha ennél bonyolultabb kell, akkor válaszd az egyik linkelt megoldást, a statikus fv-t meg feletjtsd el ebben az esetben.
[ Szerkesztve ]
-
WonderCSabo
félisten
Szia!
Az absztrakt osztály a tervezés eszköze. Nyilván az absztrakt metódus egy előírás a gyerekek számára, amelyet teljesíteniük kell. De itt nem is erről van szó. Itt arra gondoltam, ha úgy írod meg az ősosztály implementációját, hogy számít arra, hogy ezt a gyerek a majd így fogja csinálni. Vagy még rosszabb, az osztály hívatkozik a gyerekire - például a newInstance egy gyerek példányt ad vissza.
-
WonderCSabo
félisten
Na, én pont ebbe a hibába estem bele mielõtt kérdeztem.
A hszeidből sejtettem, hogy ezt szeretnéd, nem véletlenül írtam ezt a példát.
Illetve estem volna, ha az Eclipse engedi...
Már hogy ne engedné? Ez teljesen szabványos Java kód:
A.java
public class A {
public static A newInstance() {
return new B();
}
}B.java
public class B extends A {
} -
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 ]
-
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.
-
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 ]
-
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 ]
-
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.
-
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 ]
-
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 ]
-
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.”
-
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.”
-
Karma
félisten
1) Igen, újra meg kell hívnod. Célszerű ezt egy metódusba tenned a MainActivityn belül. Az elhagyott könyvtárat meg úgy tudod kezelni, hogy a FileSelectorActivityt indító Intentbe beraksz egy extra mezőt, vagy a data tagját is használhatod (ott URL-t tudsz tárolni). Ezt lekezeled onCreate-ben és szevasz. (Ha támogatsz képernyőelforgatást, akkor egy kicsit bonyolultabb, mert az aktuális állást ki kell mentened.)
2) Ha a fájl elérési útját tudod, mindent tudsz: létre tudsz hozni egy új File objektumot az elérési úttal (van ilyen konstruktor), és onnantól minden megy.
[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
Hát, ha csak annyiról lenne szó, mint amit az eredeti hozzászólásban felvázoltál, akkor nem lenne egy annyira bonyolult helyzet. Én ebből indultam ki.
A MainActivitynek abban csak három állapota van: üresjárat, file selectorra vár, dialógusra vár. Az állapotok között lehet egyet előre meg hátra lépni, illetve dialógusnál üresjáratban ugrani. A callbackek miatt még csak tárolnod se kell az aktuális állapotot, hiszen teljesen implicit a rendszer szempontjából (lásd: melyik Activity/Dialog van elől). Az állapotátmenetek meg simán leírhatóak a callbackekben, és még csak nem is spagetti, mivel a két bekérés két külön helyre fut be.
Viszont onnantól, hogy mint mondtad, négy beszélgetős "szál" is van, ezeket ki kéne szervezni külön osztályba. Például csinálhatnál egy olyat, ami kapna egy Contextet, implementálná a résztvevő interfészeket, és csak az adott szálat írná le. A végén meg visszajelez, hogy siker (és átadja az URL-t is), vagy hogy cancelezett mindent a felhasználó, és a MainActivity csak ezzel foglalkozna.
“All nothings are not equal.”
-
Karma
félisten
Az előbb hülyeséget írtam, az onActivityResultot nem tudod külön osztályba kiszervezni, hiszen az mindenképpen ott hívódik meg, akin a startActivityForResult metódust hívod...
Miközben írtam azért derengett, hogy ez az "egy folyamatot összefogó osztály" igazából lehetne egy külön Activity, amit a Main elindít. Talán ez lenne a legközelebb az Androidhoz is.
“All nothings are not equal.”
-
Karma
félisten
A FileSelectActivity különválasztása semmiképpen sem volt rossz lépés.
Csinálhatsz olyan Activityt is, amihez nem tartozik UI, ha ezt a témát adod meg neki a manifestben. Ezt indítsa el a Main, az eredményt resultként tudja visszaadni, és egyébként majd akkor finisheli le magát, amikor vagy kimégsézett a felhasználó, vagy mindent kiválasztott.
Szóval valami ilyesmi lehetne a vége:
MainActivity -1-> ImportActivity (translucent) -2-> FileSelectActivity
| ^ | ^ | ^ |
| | | | | \-----3----/
| \----6-----/ | |
| | \-------- 4-> ConfirmationDialogFragment
| | |
| \--------------5-----------------/
|
\--------1*---> ExportActivity (translucent) -2*-> FileSelectActivity...[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
Elvileg igen, gyakorlatban meg ki kell próbálni Nekem itthon nincs kéznél androidos eszköz.
És igen, menteni csak ID-vel lehet, vagy ha megírod kézzel az onSaveInstanceState/onActivityCreated metódusokban.
Ez szerintem egyáltalán nem egy egyszerű kérdés – több szintű állapot, aszinkronitás, kötött interfészek... Igazi Android programozási gyakorlat. Nagyon "jól" megoldható spagettivel is, ha az ember nem gondolkozik rajta, de akkor már miért ne bontaná szét? Mások véleményére azért kíváncsi lennék.
[ Szerkesztve ]
“All nothings are not equal.”
Új hozzászólás Aktív témák
- Macbook Pro 15 2018 16/512 Radeon Pro 560X
- Lenovo ThinkPad P53s i7-8565U 8x4.6Ghz/32Gb DDR4/512SSD/Nvidia P520/15,6" Workstation Laptop
- Tervezői Dell Precision 7520,15.6",FHD,i7-7820HQ,32GB DDR4,512GB SSD,4GB VGA,WIN11 Laptop Notebook
- XPS 9320 27% ÁFA 13.4" FHD+ IPS érintő i7-1360P 16GB 512GB NVMe ujjolv IR kam., gar
- ASUS Zenbook Flip Notebook! 13.3" Touch / i5-1035G4 / 8GB 3733MHz / 512GB SSD!
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Ozeki Kft.
Város: Debrecen