Keresés

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

  • Karma

    félisten

    válasz meone #2610 üzenetére

    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

    válasz meone #2587 üzenetére

    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

    válasz meone #2578 üzenetére

    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

    válasz meone #2568 üzenetére

    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

    válasz meone #2566 üzenetére

    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

    válasz meone #2534 üzenetére

    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.azEnExtraUzenetem

    message = getIntent().getStringExtra(MasodikActivity.enUzenetem);
    extraMessage = getIntent().getStringExtra(MasodikActivity.enExtraUzenetem);

  • WonderCSabo

    félisten

    válasz meone #2534 üzenetére

    message = getIntent().getStringExtra(MasodikActivity."enUzenetemAMasodikActivitybol");

    Biztos fordul ez így?

  • Hiderseek

    újonc

    válasz meone #2532 üzenetére

    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

    válasz meone #2530 üzenetére

    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

    válasz meone #2525 üzenetére

    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

    válasz meone #2517 üzenetére

    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

    válasz meone #2514 üzenetére

    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

    válasz meone #2505 üzenetére

    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.

  • Sherkulás

    aktív tag

    válasz meone #2433 üzenetére

    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