Hirdetés
- A piac legerősebb kameráját ígéri a Xiaomi 17 Ultra
- Telekom mobilszolgáltatások
- Billentyűzet
- Samsung Galaxy A71 - elég ennyi?
- Amazfit T-Rex 3 Pro – világítós dínó
- Ez lehet az Apple hajlítható telefonjának formája, mérete
- Karácsonykor nyerte meg a Honor az üzemidőcsatát
- Xiaomi 15T Pro - a téma nincs lezárva
- iPhone topik
- Azonnali mobilos kérdések órája
Új hozzászólás Aktív témák
-
pittbaba
aktív tag
válasz
pittbaba
#1498
üzenetére
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(); -
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);
}
}
} -
thon73
tag
válasz
SektorFlop
#1493
üzenetére
Köszi SektorFlop! Én már feladtam, pedig klassz lenne

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! -
blade4
aktív tag
válasz
WonderCSabo
#1495
üzenetére
Ok!
Köszi!

-
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?
-
pittbaba
aktív tag
válasz
WonderCSabo
#1491
üzenetére
Köszönöm-köszönöm!

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!
-
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!
-
Karma
félisten
Önmagában nem kezeli a forgást, de ha DialogFragmenten keresztül használod, mindjárt jobb lesz a helyzet.
-
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.
-
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!
-
thon73
tag
válasz
WonderCSabo
#1483
üzenetére
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. -
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! -
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
-
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! -
thon73
tag
válasz
WonderCSabo
#1476
üzenetére
Kiváló és egyszerű. Köszi! Ez jó lesz
-
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.
-
thon73
tag
válasz
WonderCSabo
#1474
üzenetére
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.
-
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.
-
thon73
tag
válasz
WonderCSabo
#1472
üzenetére
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.
-
thon73
tag
válasz
WonderCSabo
#1470
üzenetére
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! -
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.
-
RexpecT
addikt
válasz
WonderCSabo
#1467
üzenetére
Köszönöm, megnézem majd holnap.

-
RexpecT
addikt
válasz
WonderCSabo
#1465
üzenetére
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.
-
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?

-
thon73
tag
válasz
WonderCSabo
#1462
üzenetére
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...
-
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.
-
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...

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!
-
-
thon73
tag
válasz
WonderCSabo
#1455
üzenetére
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?
-
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.
-
thon73
tag
válasz
WonderCSabo
#1453
üzenetére
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.)) -
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.
-
thon73
tag
válasz
WonderCSabo
#1451
üzenetére
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
)) -
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); -
thon73
tag
válasz
WonderCSabo
#1442
üzenetére
Kedves WonderCSabo! (ill. kedves mindenki!)
Még egy utolsót szeretnék kérdezni, mielőtt végképp feladom a küzdelemet...
Az előző megoldások tökéletesek, ki is próbáltam őket, - csak éppen (List)Fragment-nél nem működnek. Ott ugyanis úgy kell elkészítenem a kódot, hogy ÜRES Konstruktorral újra elkészíthető legyen a Fragment.
Problémám a következő: Teljesen egyforma ListView-k (és ListFragmentek) jelenítik meg egy adatbázis különböző tábláit. Az eltérés néhány (6-7) paraméterben van: LoaderId, projection, from, to, content_uri stb.; maga a kód mindig azonos.Mi lenne a legjobb módszer arra, hogy egyetlen ListFragment osztály tartalmazza a kódot, és minden táblához ebből - más paraméterezéssel - egy külön ListFragmentet készítsen? Tényleges paraméterezés nem használható, az üres konstruktor miatt. Két ötletet kínlódtam ki: vagy abstract metódusokkal kényszerítem ki a "paraméterek" átadását a leszármazottakban, vagy az argument Bundle-be teszem bele egy-egy konkrét ListView-ban a paramétereket.
Nem létezik, hogy ne lenne erre valami pofonegyszerű megoldás, csak sehogy nem találom.

Előre is köszönet minden hasznos ötletért! -
RexpecT
addikt
válasz
WonderCSabo
#1448
üzenetére
Köszöntem
. -
RexpecT
addikt
Üdv!
Olyan kérdésem lenne, hogy Google Cloud Consoleban, mikor meg kell adni a alkalmazás csomagnevét( Maphez, vagy GCM-hez), és az általam készített alkalmazás több csomagba van szervezve, ilyen módon:
hu.xy.a
hu.xy.b.c.d
hu.xy.b.d
.. stbAkkor elég a csomag nevének a hu.xy -t megadnom(tehát a "közös részt")?

-
half333
őstag
Használja valaki a Cyanogenmod 10.2-t? Az lenne a problémám hogy a kapacitív alsó gombok világítása nagyon gyenge. Tudna vaki adni tanácsot,segítséget hogyan tudnám növelni a fény erejét?
-
thon73
tag
válasz
WonderCSabo
#1442
üzenetére
Akkor csak a tanulság kedvéért. Vigyázat mindenki csukja be a szemét, hibás kód következik!
public ABSTRACT class A extends ListFragment {
public STATIC ListFragment newInstance() {
return new ??getClass??();
}
}
public class B extends A {
}
public class C extends A {
}Az ötlet az volt, hogy B.newInstance() létrehoz egy B példányt, melyet ListFragment-ként visszaad, míg C.newInstance() létrehoz egy C példányt, melyet szintén ListFragmentként ad vissza.
Ha a tényleges példány csak az abstract, mint minta alapján jönne létre, akkor a kérdőjeles rész mindig a példány osztálya lenne. De persze ez nem működik, legalábbis a static metódusban nincs ilyen hivatkozás. Nem staticban egyébként a this így működik, mentségemre legyen mondva.Utólag látom, hogy az egész hibás ötlet volt. (Tegyük még hozzá: newInstance minden esetben egy hosszabb Bundle-t hoz létre, ezért merült fel az ötlet.)
(((Azt már tényleg csak ezer zárójelben teszem hozzá, hogy a leszármazott osztály nevét meg lehet szerezni, és lehet ilyet körülményesen mégis gyártani, de a javasolt megoldás sokkal átláthatóbb, és kényelmesebb.)))
Remélem senkit nem bosszantottam azzal, hogy csupán a tanulság kedvéért helytelen kódot szemeteltem a fórumba.
Én nagyon sokat tanultam a javaslataidból, hála és köszönet! 
-
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 {
} -
thon73
tag
válasz
WonderCSabo
#1440
üzenetére
Na, én pont ebbe a hibába estem bele mielõtt kérdeztem.

Illetve estem volna, ha az Eclipse engedi... -
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.
-
thon73
tag
válasz
WonderCSabo
#1438
üzenetére
Igen, én is így csináltam végül, köszönöm a segítséget. ((Sőt, a nagyon kevés különbözőséget mutató osztályokból készítettem egy Factory-t (ha jól értelmeztem a leírásokat); hiszen ott csak "belső" különbségek vannak, kivülről (pl. az activity felől) mindegyik csak egy típusos ListFragment.))
Hadd legyek mégis az ördög ügyvédje. Ha az osztály absztrakt, akkor csak a leszármazottakon keresztül valósulhat meg, nem? Akkor sem tudhat a gyerekeiről? Pontosabban csak absztrakt metódusokon keresztül írhatja elő, hogy mit csináljon meg a leszármazott? Teszem azt, szükségem lenne egy állandóra (pl. a LOADER_ID-re, amelyik minden leszármazottban egyedi). Vagy a leszármazott osztály nevére/példányára, mint az előbbi példában (amit egyébként tanácsodra elvetettem). Annak alapján, amit olvastam, a kérdés költői, mert úgy tűnik, nem tudhat. Csak épp nekem ez nem tűnik logikusnak. De elfogadom, hogy így van, és bocs, hogy tudatlanságból kötözködöm.

Az útmutatást pedig tényleg nagyon köszönöm, mert most nem csak működik a kód, de "szép" is.

-
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.
-
thon73
tag
válasz
WonderCSabo
#1435
üzenetére
Köszönöm a segítséget, és a sok olvasnivalót! Megint sokat tanultam, és legalább látom, hogy jó irányban kezdtem tapogatózni.

Helyesebb lett volna talán a teljes problémát leírni (és ez absz. android): Egy összetett adatbázisban több, egymásra hivatkozó tábla van. Class A,B,C... mindegyike egy egy táblához tartozó ListFragmentet jelent. ((És van egy hasonló, "űrlap" szerű csoport is táblánként.)) A ListFragment legtöbb része (Loader, Filter, kommunikáció az activityvel) azonos, de a táblára vonatkozó részek, egy-egy menüpont azért különbözik. Ezért gondoltam egy "közös" template szülő absztract osztályra.
Az Activity csak a Fragmentek kezelését végzi, az ő szempontjából elég annyi, hogy ez egy Fragment, a részletek (leszármazások) nem érdekesek.
Nos, ezért gondoltam arra, hogy a newInstance is közös lehetne - csak épp itt nem látom, hogy melyik al-osztályból kellene példányt készíteni.
Amit olvastam, annak alapján a newInstance mindig az al-osztályba kerül, így én is ezt a megoldást fogom követni. Elfér ott az a három sor...To SektorFlop:Örülök, ha működik! Az idő meg úgyis körbe-körbe visszajön - nekem is rengetegen/rengeteget segítettek! Üdv!
-
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.

-
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.
-
thon73
tag
Van két-három nagyon hasonló osztályom, legyenek Class A, Class B és Class C. Mindegyikben van egy-egy newInstance() metódus, a korábban javasolt Static Factory Method szerint. (Az útmutatásért ismét köszönet és hála
)Arra gondoltam, hogy az azonos részeket kiemelem egy közös "szülő-szintű" abstract osztályba, melynek neve Class Template. Így a három osztály csak egész kevés kódot fog tartalmazni (csak amennyi különböző bennük), és rendre Class A extends Template... stb. módon hivatkoznak a Template osztályra.
A kérdésem a következő: Létre lehet-e hozni a static newInstance() metódust is az abstract Template osztályban úgy, hogy az egyes leszármazott osztályok (Class A, B és C) örököljék, de az ezeken a leszármazott osztályokon meghívott newInstance() a saját osztály példányát adja vissza?
Vagyis:
abstract class Template {
static ???? newInstance() {
return ????;
}
}
class A extends Template {
}után az A.newInstance() az A osztály egy példányát adja vissza??
Eddig annyit gugliztam ki, hogy ez az Abstract Factory Pattern-be tartozik, de a konkrét kérdéssel kapcsolatban csupa ellentmondást találtam.
Nagyon hálás lennék, ha valaki ezt röviden el tudná magyarázni! Köszönöm!SektorFlop! Most működik?

-
SektorFlop
aktív tag
válasz
SektorFlop
#1432
üzenetére
Én buta, mindent szépen megcsináltam, csak valahogy elfelejtettem implementálni az interface-t az activity-hez... pedig úgy emlékeztem hogy azzal kezdtem, így azt nem is nagyon nézegettem...

-
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) -
lordjancso
senior tag
Csináltam egy ListView-t, aminek a tartalmát egy mysql adatbázis alapján töltöm fel.
Lekérem az elemeket json-ban, parse-olom, majd megjelenítem. Teljesen tiszta sor.
Emulátorban tökéletesen működik minden, viszont a teszt telefonomon (Samsung Galaxy S3, gyári 4.1.2-es android) nem mindig tudta betölteni a tartalmat. Ez a "nem mindig" azt jelenti, hogy 10-15 próbálkozásból csak egyetlen egy alkalommal tölti fel a ListView-t a json alapján.
A json parse-olás try-catch blokkban van. A hiba során az exception.getMessage() azt mondja, hogy
Unterminated object at character 2054 of [{"id": ........
A ... rész ugye a teljes feldolgozandó json stringben. Ezt úgy értelmeztem, hogy a 2054. karakter nem tetszik neki, viszont az egész json-om nincs 1200 karakter hosszú.
Találkozott már valaki hasonló jelenséggel? Van valami ötletetek erre a problémára? -
half333
őstag
Vagy ha nem tudtok,legalább megírnátok hol keressem azt ahol tudnak segíteni ebben?
-
Karma
félisten
válasz
RexpecT
#1427
üzenetére
ViewPagerben van ez? Mert ha igen, akkor az lehet a kiváltó ok, hogy a VP mindig előre létrehozza a következő N elemet, hogy simább legyen az átjárás.
Egy próbát megérhet, hogy a setOffscreenPageLimitnek nullát adsz meg, elvileg annak le kéne tiltania ezt a viselkedést, cserébe lassabb lesz.
-
RexpecT
addikt
Üdv!
Fragmenteket használok, és az utolsó Fragment megnyitásakor egy másik Activityt akarok betölteni Intent segítségével.
Az utolsó előtt Fragment megnyitásakor 1-2 másodperc elteltével automatikusan meghívódik az utolsó Fragmentben deklarált Intent. Ez mitől lehet?
-
half333
őstag
Sziasztok! Akárhol is kérek segítséget,nem írnak semmit,hát felteszem itt is! Olyan gondom van hogy a telefon érzékeli a memóriakártyám,de pc-re csatlakoztatva,nem lehet elérni,bármit is próbáltam,igy belenyúltam a system/etc/vold.fstab-ba többféle módszert is kipróbáltam,de ugyszint semmi,esetleg (mivel tudtok programozni,megmondanátok hogy elég csak ott átírni a dolgokat,vagy a system-en belül még máshol is lehet a baj? Léci,ha tudtok segítenétek,mert így elég bonyolúlt a másolgatás

-
thon73
tag
válasz
SektorFlop
#1424
üzenetére
Az a lényeg szempontjából mindegy. Az első példa sem list-tel operál.
Szívfájdítóul: én se vagyok otthon, viszont most éjjel is majd 30 fok van, ráadásul a tengerre néz az ablak... de hogy nekem se legyen olyan jó, holnap nyakig öltönyben előadás![;]](//cdn.rios.hu/dl/s/v1.gif)
-
SektorFlop
aktív tag
-
Karma
félisten
válasz
kisguly
#1421
üzenetére
Ettől még nem programozási kérdés
, van nagy tabletes topik és valószínűleg navonos is külön. Persze nem biztos.
Mindenesetre valószínűsítem, hogy valami ilyesmit kéne végigjárnod.A tableten lévő fájl meg ne az eszközön akard megnyitni, inkább másold le és úgy nézz bele desktopon. A név alapján gyanús, hogy nyers pixeladatot tartalmaz tömörítés nélkül -– ha a fájl mérete 2 457 600 byte, vagy ennek fele, szinte biztos.
-
kisguly
tag
Szép estét!
Szeretném lecserélni a tabon a bekapcsoláskor bejövő első képet, ami általában a készülékre utaló kép. Nagy valószínűséggel a kernelben van. Ha a recovery-t indítom akkor is bejön. Milyen néven találom ezt a képet és hol? Milyen progival tudok csinálni másikat?
Előre is köszönöm a segítséget.
-
TheProb
veterán
Ola!
Van itt olyan mágus aki keni-vágja az android appokat?
Van egy app amit csak bizonyos telfonokkal lehet használni, lehetséges-e szerintetek, hogy megpimpelhető-e úgy, hogy ezt a készülékkorlátozást valahogy kijátszam?
Az .apk megvan, forráskód nincs. -
unknownerror
tag
válasz
WonderCSabo
#1416
üzenetére
Webview-val szórakoztam egész nap, az a bajom szerintem, hogy javás ez a panorámás cucc, amit csináltak. Többféle formátumban elküldte a készítő, de egyszerűen nem tudom rávenni a cuccot, hogy menjen. Persze nagy a valószínűsége, hogy én rontok el valamit. Jah belső tárhelyről kell, hogy betöltse ezt, nem tudom, hogy számít-e valamiben.
Szinte mindig adobe flash, css, html5 nincs támogatva hibát kapom, de a telefonomon egy-két variációban betölti, viszont akkor jobbra-balra ha lépkedek, fehér lesz, meg néha egy csíkban megjelenik a kép, szóval nem az igazi.Hozzáteszem, a tárgy neve mobilkommunikáció, direkt nem szoftverfejlesztőnek szakosodtam, hanem hálózati mérnöknek, gondoltam jó lesz ez a tantárgy, erre android programozás, jól meg...szivattam magam.

Ráadásul a 26főből kb 2-en álltunk neki a programnak, ismerős sincs, aki értene ehhez -
WonderCSabo
félisten
válasz
unknownerror
#1415
üzenetére
Ha csak annyi a programnak a feladata, hogy megjelenítse a weboldalat, akkor egy WebView-val megteheted.
-
unknownerror
tag
Sziasztok!
Főiskolás vagyok és kaptam egy összetettebb feladatot. Soha nem programoztam még androidra, bár tanultunk c,c++,c#-ot, de egyikből se egetrengetően sokat, "meglepetés" ez a feladat.
A lényege: ezt kellene valahogy megjeleníteni a programomban, ráadásul 2.3.3-tól működjön. Van .swf változata is ennek, de azzal se jutottam többre.
Órákat gugliztam, félretettem, megint próbálkoztam, de sehogy se jön össze a kivitelezés.
4.1.2 van a telefonomon, a gyári böngésző megnyitja, de még erre se tudom összehozni saját programmal, bár nagy a valószínűsége, hogy én bénázok valamit. -
thon73
tag
válasz
SektorFlop
#1412
üzenetére
Írtam egy kis programot hozzá. EZT vettem alapul. És ITT a bővített program zip formában.
A teljes arraylist-et az outputFragment kezeli. Amikor az inputFragment-en beírsz, az értéket elküldi az Activity-nek, az Activity pedig továbbküldi az outputFragment-nek. Ez utóbbi írja be a list-be, és frissíti a listát.
A Te esetedben nem az activity, hanem a db hordozza az adatot. De az array-t szerintem a listfragmentnek kéne kezelnie (vagy az activity-nek).
A lényeg: MINDENKÉPPEN jeleznie kell az inputFragmentnek a ListFragment irányába, hogy új elem érkezett!! Ezt nem fogja (szerintem) beépített on... metódus megtenni, neked kell megcsinálni. VAGY: a LOader osztály már megcsinálja "magától".A példa globális adapter változót használ, de a getListAdapter() is jó, csak a típusát módosítani kell (uis. nincs benne notifyDataSetChanged)
public void refreshOutput( String data )
{
// 1. érdekes: ez is működik
// lista.add( data );
// 2. adapter írja be - azonnal kiírja
// adapter.add( data );
// 3. invalidateviews - azonnal működik
// lista.add( data );
// getListView().invalidateViews();
// 4. notify
lista.add( data );
adapter.notifyDataSetChanged();
}A fenti kódban váltogasd a kommenteket, de szerintem nem ez a baj, hanem a ListFragment nem kap értesítést. ((Hogy az 1. példa miért működik, azt nem tudom, annak nem lenne szabad.
))Ja, igen. A forgatás (újraindítás) törli a listánkat, de most nem is ez volt a feladat. Neked meg a db úgyis megmarad.
Remélem segítettem
-
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.
-
thon73
tag
válasz
SektorFlop
#1410
üzenetére
Amikor megnyomod a gombot, akkor a db.newCostRow(c); betölti az adatokat egy adatbázisba. Két sorral később a cm.setCostItem(); "visszatölti" az adatokat az ArrayList-be?
Hogy fér hozzá a Fragment1 a cm listához?
Itt történik a megjelenítendő lista feltöltése?
Mert ha igen, akkor a bibi valahol a két Fragment kezelésében lesz. Ha itt lecserélted a komplett listát, akkor itt kellene értesítened az Adaptert vagy a ListView-t, hogy változott a helyzet. De a Fragment - elvileg - közvetlenül nem férhet hozzá egy másik Fragment adataihoz (különösen nem a ListView-hoz).
Ha a Fragment1 változtatja az adatokat, akkor neki "üzennie" kéne az Activity-n keresztül, hogy Fragment2 frissítse a listát. Vagy. Fragment1 csak bekéri és átadja az adatokat, majd üzen Fragment2-nek (aki a listát is tartalmazza), hogy a bekért adatokkal frissítse az ArrayList-et is, és a listát is.
De lehet, hogy csak bennem nem állt össze, bocs. -
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.
-
Sianis
addikt
válasz
lordjancso
#1407
üzenetére
Ez nem nyerő?
Sianis
-
lordjancso
senior tag
Nem tud valaki egy elegáns megoldást arra, hogy hogyan ellenőrizzem le, hogy a szerver él-e, amihez async kéréseket szeretnék intézni az alkalmazásban? Szerintem a legjobb lenne, minden async kérés doInBackground metódusában.
Pár megoldást már megpróbáltam (stackoverflow-n amit találtam), de elegánsnak egyik sem volt igazán nevezhető. Ami meg egyszerűnek és jónak tűnt, az vagy csak 2.x-en, vagy csak 4.x-en működött. -
thon73
tag
Bocsánat a pongyola fogalmazásért! Igazad van, a "cursor oldallal" csak azt akartam kifejezni, hogy az eredmény oldalán. Azóta kipróbáltam, az android-tól független sqlite "csonkolja" az oszlopneveket.
A legtöbb nehézségem egyébként abból fakadt, hogy megtanultam valamit sqlite-ban, működött is; de nem tudtam átfogalmazni az android/java által elgondolt módra. Mindegy, most már egyre jobban kitapasztalom... -
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 SQL
Az 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.
-
thon73
tag
Köszönöm mindenkinek! A lényegi kérdés pont az, amit hunfatal tett fel (Cursor oldal), a SektorFlop által feltett (query oldal) sem triviális, de ott működtek a teljes nevek.
Az elméleti kérdés érdeklődőknek továbbra is fennáll
: miért dob exception-t, ha a Cursor oszlopaira teljes névvel akarok hivatkozni ((azt a választ, hogy azért mert nem teljes névvel azonosítja az oszlopokat, már tudom, de: miért van így??)) ÉS ha exception-t dob (a log-ban piros sorok), akkor hogyan mehet tovább? Na de ez csupán filozófia.A konkrét kérdést így próbáltam ki:
String[] projection = new String[] {
BooksTable.FULL_ID,
AuthorsTable.FULL_NAME + " AS N ",
BooksTable.FULL_TITLE + " AS T " };
CursorLoader cursorLoader = new CursorLoader(getActivity(),
BooksTable.CONTENT_URI,
projection,
BooksTable.FULL_SEARCH + " like ? ",
new String[] { "%"+filterString+"%" },
AuthorsTable.FULL_NAME + " COLLATE LOCALIZED ");ahol:
case BooksTable.DIRID:
// Set the table
queryBuilder.setTables( BooksTable.TABLENAME +
" LEFT OUTER JOIN " + AuthorsTable.TABLENAME +
" ON " + BooksTable.FULL_AUTHOR_ID + "=" + AuthorsTable.FULL_ID );A FULL_ jelenti a teljes azonosítót table.column formátumban. Ellenőrzés log-ban:
"Cursor cols: " + Arrays.toString( data.getColumnNames()
Eredménye:
Cursor cols: [_id, N, T ]Vagyis: az AS a cursor oldalon is működik! Arra persze figyelni kell, hogy egy _id oszlop maradjon! Én egyébként ezt megkerülve minden oszlopnak más nevet adtam előtte, ill. a két _id-t (csak ellenőrzésre kellett) oszlopszám alapján kérdeztem le. De ez a módszer sokkal jobb ((és ezt a problémát nem találtam még sehol a neten, biztos mindenki rögvest tudta...))
SektorFlop! Az nagyon jó hír, biztosan fogok még kérdezni ezret. Egy egyszerű adatbáziskezelőt készítgetek, próbaként könyvek/szerzők stb. feljegyzésével, de a végső cél egy beteg-adat kezelő alkalmazás.
Egy átfogó kérdésem rögtön lenne: nagy szükségem van export/import funkcióra. Kapcsolt adatbázisoknál van-e erre valami elegáns v. beépített módszer? Magamtól úgy terveztem megoldani, hogy exportnál a hivatkozott elem részeit is kiírom, importnál pedig megkeresem, van-e ilyen elem, és úgy hivatkozok rá, vagy ha nincs - létrehozom. A nem kapcsolt táblák már jönnek-mennek!((Ha esetleg valaki még meg tudná mondani, hogyan lehet a LogCat-ot vágólapra másolni az Eclipse-ben, akkor kissé könnyebben tudnám ide másolni a releváns részeket. A mentés/keresés/megnyitás/másolás egy kissé macerás...))
-
kisguly
tag
Sziasztok!
Olyan kérdésem lenne a szakértő Urakhoz, hogy az ES File Explorer alatt a ?-s fájlok mivel nyithatók meg? Szövegként sikerült, de az teljesen érthetetlen. Találtam ugyanis a system\media\image alatt bootlogo nevű fájlt. Ezt szeretném megnézni. -
fatal`
titán
válasz
SektorFlop
#1401
üzenetére
Szerintem neki inkább (nem tudom SQLiteban megy-e, ms sqlezek, azt is inkább csak alapszinten, egyelőre):
SELECT a.id AS a_Id, b.Id as b_id FROM a LEFT JOIN b ON b.a_id = a.id
Utána a Cursorral tud a_Id-ra és b_Id-ra hivatkozni.
Új hozzászólás Aktív témák
- LG Gram 14 WUXGA IPS i7-1360P 5.0Ghz 12mag 32GB DDR5 1TB SSD Intel Iris XE 10óra Akku Win11 Garancia
- CORSAIR K100 AIR
- Xiaomi Redmi 14C / 4/128GB / Kártyafüggetlen / 12Hó Garancia
- Bomba ár! Dell Latitude 3340 - i3-4GEN I 4GB I 500GB I 13,3" HD I HDMI I Cam I W10 I Garancia!
- Vállalom Xianomi Okos kamerák, szoftveres javíttását
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest




Vgy nagyon kihalt ez a topic, pedig szerintem lenne jövője.

Az előző megoldások tökéletesek, ki is próbáltam őket, - csak éppen (List)Fragment-nél nem működnek. Ott ugyanis úgy kell elkészítenem a kódot, hogy ÜRES Konstruktorral újra elkészíthető legyen a Fragment.
Én nagyon sokat tanultam a javaslataidból, hála és köszönet! 
![;]](http://cdn.rios.hu/dl/s/v1.gif)
, van nagy tabletes topik és valószínűleg navonos is külön. Persze nem biztos.


