- Netfone
- Mobil flották
- Fotók, videók mobillal
- Samsung Galaxy A54 - türelemjáték
- One mobilszolgáltatások
- Yettel topik
- Apple iPhone 16 Pro - rutinvizsga
- Samsung Galaxy A56 - megbízható középszerűség
- Nothing Phone (3a) és (3a) Pro - az ügyes meg sasszemű
- Mi nincs, grafén akku van: itt a Xiaomi 11T és 11T Pro
Új hozzászólás Aktív témák
-
Karma
félisten
Sajnos rossz irányba lépkedsz a megoldás útján
Azzal hogy main függvényeket írtál, nem jutottál sehova. Desktopon se jelentene semmit ebben a formában, itt meg végképp nem.
Mindenekelőtt el kéne olvasnod valami Android oktatóanyagot - a developer.android.com-on például van training, de nem biztos hogy jó a tematikája neked.
Esetleg ha vondolod, holnap megírom a feladatod és a kész kódból levonhatod a következtetéseket.
-
WonderCSabo
félisten
Te nagyon kevered a szezont a fazonnal. Nem sokat programoztál Javában, meg úgy egyáltalán, jól sejtem? Az alapokat valahogy össze kéne szedni. A szál nem azt jelenti, hogy egy külön osztályba szervezed a kódot, hanem teljesen mást.
Most gondoltam el kezdem magyarázni, hogy hogyan készíts egy új szálat Android módon stb, de rájöttem, hogy igazából a szál fogalmát se ismerheted, különben nem jössz elő ezzel a példával. No offense. Itt van egy leírás az Android UI száláról. Itt pedig úgy szálakról általában. Ha ezeket elolvastad, ne tévesszen meg a dolog, Android-on nem Thread-et szoktunk használni, hanem az első linkben bemutatott AsyncTask-ot.
Default constructor cannot handle exception type MalformedURLException thrown by implicit super constructor. Must define an explicit constructor
Ha egy osztályban nem deklarálsz explicite konstruktort, akkor a fordító létrehoz egy úgynevezett default konstruktort, aminek nincs paramétere és nem dob semmilyen kivételt. De csak akkor hozza létre. ha az ősnek létezik és elérhető olyan konstruktora aminek nincs paramétere és nem dob semmilyen kivételt. Tehát valójában "így nézne ki a class":
public class UrlRead {
public UrlRead(){
super();
}
...
}Ezen kívül Te a konstruktoron kívül rögtön inincializálod a két meződet. Ebben az esetben ez a művelet valójában úgymond a default konstruktorban fog végrehajtódni, valahogy így lesz a lefordított osztályban (pszeudokód):
public class UrlRead {
URL logPage;
BufferedReader in;
public UrlRead(){
logPage = new URL("http://bkaroly.hu/log.php");
in = new BufferedReader(new InputStreamReader(logPage.openStream()));
super();
}
...
}Itt viszont meghívod az URL osztály konstruktorát. Ebben deklarálva van, hogy MalformedURLException-t dobhat:
URL osztály részlete:
public URL(String url) throws MalformedURLException{ ... }
Javában viszont minden ellenőrzött kivételt (és a MalformedURLException az), kötelező lekezelni. Ennek két módja van, vagy try-catch blokkba rakod a műveletet, vagy jelzed, hogy tovább dobható a kivétel a throws kulcsszóval. De a default konstruktor nem dobhat tovább kivételt, ahogy már jeleztem, ezért kapod ezt a fordítási hibát.
Mellesleg a kódodnak nem sok értelme lenne ha fordulna is, hiszen megkapod a BufferedReadert de aztán semmit se kezdesz vele.
-
WonderCSabo
félisten
Szia!
Jó úton haladsz. Az ArrayElem class-t majd nevezd át valami értelmesre, mert elég hülye nevet adtam neki.
List<ArrayElem> ReturnDataSet = new ArrayList <ArrayElem>();
Egyrészt ne legyen package private, hiszen így megsérted az enkapszulációt, továbbá itt felesleges az inicializácót, mivel majd a GSON feltölti ezt a mezőt.
A WebView-al pedig eléggé félrelőttél, teljesen felesleges. Arra csak akkor van szükséged, ha meg akarsz jeleníteni egy weboldalt. Próbáld így:
URL logPage = new URL("http://bkaroly.hu/log.php");
BufferedReader in = new BufferedReader(new InputStreamReader(logPage.openStream()));
Gson gson = new Gson();
LogHolder holder = gson.fromJson(in, LogHolder.class);Itt nem az ArrayElem.class-ot kell átadni, hanem a LogHolder.class-t, remélem világos miért.
Javítottam a kódban egy elírást - Karma
[ Módosította: Karma ]
-
WonderCSabo
félisten
Kb. mindent leírtam, amit meg kell csinálnod... A metódus a GSON API része, amit meg kell hívnod ahhoz, hogy egy JSON stringből Java objektumot készíts. Az első paraméterében a deszerializálandó elemet fogadja, a második paramétere pedig a típus, hogy mivé szeretnéd alakítani a JSON-t. Itt a részletes API doc: http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html
Itt pedig részletes user guide: http://sites.google.com/site/gson/gson-user-guide -
WonderCSabo
félisten
Feltételezem te itt azt szeretnéd, hogy a letöltött JSON stringet Java objektummá alakítsd, és annak az értékeit valahol megjelenítsd, igaz? Ebben az esetben nem értem a WebView hogy jön ide.
Nem tudom mennyi részét akarod átalakítani GSON-al, de ha az egészet, akkor a SerializedName ide nem lesz elég. Hiszen itt van egy JSON obj, aminek egyetlen mezője a ReturnDataSet, amiben egy array van, amely JSON objektumokból áll. Tehát ehhez én csinálnék egy osztályt am egy ilyen array elemet reprezentál, továbbá még egy osztályt (LogHolder ) aminek egyetlen fieldje van ez a ReturnDataSet és List<ArrayElem> típusú. Aztán beadnám a GSON-nak hogy az egészet deszerializálja:
Gson gson = new Gson();
LogHolder holder = gson.fromJson(log_txt_tartalma, ArrayElem.class);A log.txt letöltehted előtte egy string-be, vagy egy Readert adsz be a fromJson első paraméterének ami beolvassa a netről, ahogy tetszik.
-
Hiderseek
újonc
Igen, az úgy nem egészen jó.
Így, ha nem tárolod változóban:
message = getIntent().getStringExtra("enUzenetemAMasodikActivitybol");
extraMessage = getIntent().getStringExtra("azEnExtraUzenetem");Ilyen pedig nincs:
MasodikActivity."enUzenetem"
MasodikActivity."azEnExtraUzenetem"
Mivel te a változóért nyúlsz, nem pedig egy értékért. A változóért, amelynek az értéke kell. Értedígy lehetne, ha a második activityben deklarálod a két változót, amelynek értéke a kulcsod.
2.Activity
public static final String enUzenetem = "enUzenetemAMasodikActivitybol";
public static final String enExtraUzenetem = "enUzenetemAMasodikActivitybol";3.Activity
Így tudod használni a második activityben lévő két változód.
MasodikActivity.enUzenetem
MasodikActivity.azEnExtraUzenetemmessage = getIntent().getStringExtra(MasodikActivity.enUzenetem);
extraMessage = getIntent().getStringExtra(MasodikActivity.enExtraUzenetem); -
Hiderseek
újonc
Az
intent.putStringExtra()
függvénynél két dolgot kér. Egy "kulcsot", amivel később azonosítani tudod. Jelen esetben, amikor meg akarod hívni, valamint magát az adatot amit tovább akarsz küldeni.Vagyis a getStringExtra()-nál ahhoz hogy beazonosítsuk, hogy melyik adatra van jelen esetben szükség, argumentumként megadjuk a "kulcsot", amihez társítottuk az adatot.
A te esetedben ez a kulcs egy string az első activityben. (EXTRA_MESSAGE) Így amikor bekéred vissza kell érte "nyúlni", valahogy így:
getStringExtra(MainActivity.EXTRA_MESSAGE);
a lényeg, hogy megadd a kulcsot, amihez társítottad amikor bekéred.Az EXTRA_MESSAGE az első activityben ebben az esetben lehet akármi:
public static final String EXTRA_MESSAGE = "enKicsiExtraUzenetem";Ha a masodik activityben ezt adod meg, ugyanúgy jó:
getStringExtra("enKicsiExtraUzenetem");public class MasodikActivity extends Activity implements OnClickListener {
private String message;
private String extraMessage;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
message = getIntent().getStringExtra(MainActivity.EXTRA_MESSAGE);
extraMessage = getIntent().getStringExtra(MainActivity.EXTRA_TARGET_USER);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.btTovabb1).setOnClickListener(this);
((TextView) findViewById(R.id.tView1)).setText(message);
((TextView) findViewById(R.id.tView2)).setText(extraMessage);
}
public void onClick(View view) {
if(view.getId() == R.id.button2)
finish();
if(view.getId() == R.id.btTovabb1) {
Intent intent = new Intent(MasodikActivity.this, HarmadikActi.class);
intent.putExtra("enUzenetemAMasodikActivitybol", message);
intent.putExtra("azEnExtraUzenetem", extraMessage);
startActivity(intent);
}
}
}intent.putExtra("enUzenetemAMasodikActivitybol", message);
intent.putExtra("azEnExtraUzenetem", extraMessage);Tehát, megadod a kulcsot, amely egy String és az adatot. Akármilyen kulcsot adhatsz, de ahhoz hogy a következő activityben be tudd kérni, azt kell megadni, amit hozzárendeltél
-
Hiderseek
újonc
A második activity-d. Ez alapján a harmadikat meg tudod csinálni.
Csak írd bele, hogy mit adjon tovább, és a harmadikban, ugyanúgy mint itt, jelenítsd meg.public class MasodikActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
String message = getIntent().getStringExtra(MainActivity.EXTRA_MESSAGE);
String message2 = getIntent().getStringExtra(MainActivity.EXTRA_TARGET_USER);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.buttontovabb1).setOnClickListener(this);
findViewById(R.id.tView1).setText(message);
findViewById(R.id.tView2).setText(message2);
}
public void onClick(View view) {
if(view.getId() == R.id.button2)
finish();
if(view.getId() == R.id.buttontovabb1)
startActivity(new Intent(MasodikActivity.this, HarmadikActi.class));
}
} -
Karma
félisten
1) A megjelenítéssel az a baj, hogy létrehozol TextView-kat kódban, beállítod a szövegüket, de aztán nem rakod őket sehova se. Azt felejtsd el, hogy kódban csinálsz ilyesmit! Erre való a layout XML, ott rakd össze a felületet!
2) Semmi akadálya annak, hogy a harmadik Activityt a második indítsa. Szabadon építheted láncba őket - ha a második elfinisheli magát a harmadik indítása után, akkor a visszagombbal az elsőre jutsz. Ha nincs finish, akkor 3 -> 2 -> 1 lesz a visszairány.
-
Karma
félisten
Valószínűleg túlkomplikáltad fejben. Ahány input meződ van, annyiszor hívd meg a putExtrát, más-más kulccsal. Ez a "user" kulcs nem tudom honnan jön, valószínűleg valami üzenettel kapcsolatosat akartál volna írni a kódodban.
Célszerű egyébként az extrák kulcsait public static final Stringekben tárolni, és változóként hivatkozni rájuk, mert akkor kisebb az elgépelés esélye.
Megpatcheltem a példád:
public class MainActivity extends Activity {
public static final String EXTRA_MESSAGE = "com.valami.MainActivity.EXTRA_MESSAGE";
public static final String EXTRA_TARGET_USER = "com.valami.MainActivity.EXTRA_TARGET_USER";
Button _button1;
EditText _messageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_button1 = (Button) findViewById(R.id.button1);
_messageText = (EditText) findViewById(R.id.editText1);
_button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String message = _messageText.getText().toString();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_TARGET_USER, ...); // peldaul
startActivity(intent);
}
});
}
}Bátorkodtam a magyar megnevezéseidet és inkonzisztens kis-nagybetűidet egységesíteni. Mindenkivel jót teszel, különösen magaddal, ha csak egy nyelven és csak egy stílusban írsz kódot.
-
Karma
félisten
Egy kérdés, ami nagyon kikívánkozik: ezt a kódot, különösen a break labeleket, te írtad kézzel? Meg a static változóba lerakott adattagokat? Vagy ez egy visszafejtett projekt, amit elkezdtél kézzel reszelni?
Mert ha bármelyikre is igen a válasz, sőt, még anélkül is, nagyon javaslom hogy kuka az egész adatkezelésre és oldd meg rendesen. Például JSON-re a manuális feldolgozás helyett használd a Gson-t a modell osztályoddal és majd ő kitölti a mezőket.
A 173-as sort egyébként tényleg nem lehet elérni, hiszen előtte ott a return vagy a break minden esetben. A 202-essel ugyanez a helyzet, ott van előtte a return. A sor így felesleges. Egyben indikátora, hogy itt gondok vannak, nem kicsit.
-
Karma
félisten
Igen, bekerülnek, amikor az R újragenerálódik (Anttal fordítás elején, Eclipse-ben azonnal kellene a fájlváltozáskor, de legrosszabb esetben egy Refresh után a res könyvtáron).
Ezen kívül semmilyen dolgod nincs, csak megfelelően hivatkoznod kell (név alapján) az új fájlokra. Pl. XML-ben <include> tag, és benne @layout/uj_layout_file, ha pl. a layoutod neve az volt, hogy uj_layout_file.xml. Java kódban meg R.layout.uj_layout_file lesz a konstans.
-
Karma
félisten
Virtuous Ten Studiót használok erre mindig.
-
Sherkulás
aktív tag
szia
Ha most kezded az Android programozást akkor személy szerint nem a demux-olt app kódjának módosítgatását javaslom, mert annál mint láthatod erős anomáliákba futhatsz. (egy demux sose lesz 100%-os, bár ezzel többen vitatkoznak
)
Szóval szerintem a legjobb út ha GITHUB-ról lekapsz jó pár példa programot és azokat kezded el feldolgozni. Vannak szép összetett példaprogramok amiket lehet szépen módosítgatni és az által megtanulni mindent amit csak lehet.
A StacOwerflow meg napi szintű barátod lesz...
Új hozzászólás Aktív témák
Hirdetés
- DDR5 GAMER PC: Új RYZEN 7 8700F/9700X +RTX 4060/5060/4070/5070 +16-32GB DDR5! GAR/SZÁMLA/50 FÉLE HÁZ
- Dell Latitude 7410 Strapabíró Ütésálló Profi Ultrabook 14" -80% i7-10610U 16/512 FHD
- Szép! HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 32/512 Iris Xe FHD Magyar
- HP EliteBook 850 G8 Fémházas Multimédiás Laptop 15,6" -65% i7-1185G7 8/512 Iris Xe FHD Magyar
- 512 Gb-os NVME-k
- Telefon felvásárlás!! Samsung Galaxy A50/Samsung Galaxy A51/Samsung Galaxy A52/Samsung Galaxy A53
- AKCIÓ! Lenovo Thinkpad P15 Gen1 15 FHD notebook - i7 10750H 16GB RAM 512GB SSD Quadro T1000 W11
- Országosan a legjobb BANKMENTES részletfizetési konstrukció! Lenovo ThinkPad X13 Gen 5
- Lenovo ThinkPad L15 Gen 2 - 15.6" FullHD IPS - i5-1135G7 - 8GB - 256GB SSD - Win11 - MAGYAR
- Azonnali készpénzes GAMER / üzleti notebook felvásárlás személyesen / csomagküldéssel korrekt áron
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: Promenade Publishing House Kft.
Város: Budapest