Sziasztok!
Jelenleg egy olyan alkalmazással küzdök, amivel egy fogorvoshoz lehet bejelentkezni androidos telefonon. A kérés az volt, hogy a bejelentkezési űrlapot négy külön oldalra bontsuk le. Az első oldalon bekérem a páciens adatait: név, telefon, email cím. A második oldalon az időpont szerepel, a harmadik oldalon pedig a kezelést választja ki. A negyedik oldalról szeretném elküldeni az emailt, ott még szerepel egy beviteli mező, amiben megjegyzéseket írhat az orvosnak. A kérdésem az lenne, hogy az értékeket hogyan tudom átvinni az utolsó oldalra, SQLite használata nélkül.
Page
viewed times
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
24 Comments
Auth Gábor
Szerintem egy közönséges Singleton DTO osztály megfelelő erre a feladatra, az Activity onPause metódusában elmented, az onResume metódusban visszatöltöd, a végén törlöd a tartalmát, ha elküldted. Ez nem véd az ellen, amikor a program futása közben bejön egy telefonhívás, és a platform kilövi a programot, de ez a jelenlegi hardverek esetén már ritka dolog.
Turi István
Egy kicsit kínai amit írsz, de nagyjából értem. Jelenleg így néz ki az Info.java fájl:
EditText name, phone, email;
ImageButton next;
String request_name, request_phone, request_email;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.info);
name = (EditText) findViewById(R.id.NameText);
phone = (EditText) findViewById(R.id.PhoneText);
email = (EditText) findViewById(R.id.EmailText);
next = (ImageButton) findViewById(R.id.NextButtonInfo);
next.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Info.this, Date.class);
intent.putExtra("request_name", name.getText().toString());
intent.putExtra("request_phone", phone.getText().toString());
intent.putExtra("request_email", email.getText().toString());
startActivity(intent);
Hova teszem az onPause-t?
Előre is köszi a segítséget!
Auth Gábor
Az onPause és az onResume egy szinten van az onCreate metódussal, szóval simán mellé kell csak tenni, lásd a 2. Az alkalmazások szerkezete cikkben az Activity életciklust. A lényeg az, hogy csinálsz egy sima Singleton osztályt, abba beleteszed a nevet, telefonszámot és email címet tartalmazó mezőt (hozzá getter-setter metódusokat), majd az onPause részben egy ilyesmit csinálst:
Illetve az onResume ugyanezt teszi, csak fordítva:
Nagyjából ennyi...
Turi István
Valahogy nem látom át a dolgot! Erre jutottam, de a mezők kitöltése után hibával leáll!
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
public class Info extends Activity {
EditText name, phone, email;
ImageButton next;
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
name = (EditText) findViewById(R.id.NameText);
phone = (EditText) findViewById(R.id.PhoneText);
email = (EditText) findViewById(R.id.EmailText);
DTOClass dto = DTOClass.getInstance();
dto.setName(name.getText());
dto.setPhone(phone.getText());
dto.setEmail(email.getText());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
ImageButton next = (ImageButton) findViewById(R.id.NextButtonInfo);
next.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Info.this, Date.class);
startActivity(intent);
}
});
}
}
Auth Gábor
DTOClass osztályt létrehoztad a mentendő mezőkkel?
Turi István
Úgy érzem létrehoztam, de erős a gyanúm, hogy valami hiányzik belőle!
public static DTOClass getInstance() {
// TODO Auto-generated method stub
return null;
}
public Object getName;
public Object getEmail;
public Object getPhone;
public void setName(Editable text) {
// TODO Auto-generated method stub
}
public void setPhone(Editable text) {
// TODO Auto-generated method stub
}
public void setEmail(Editable text) {
// TODO Auto-generated method stub
}
public CharSequence getName() {
// TODO Auto-generated method stub
return null;
}
public CharSequence getPhone() {
// TODO Auto-generated method stub
return null;
}
public CharSequence getEmail() {
// TODO Auto-generated method stub
return null;
}
Auth Gábor
Na, ez így nagyon nem jó...
Egyrészt nem Object, hanem String kellene típusnak, másrészt a return null, illetve az üres metódus törzsek okoznak bajt, ilyesmit kellene beleírni:
Hasznos lenne némi alap Java tudást magadhoz venned, mert csak kudarcok fognak érni, az Android közepesen erős Java tudást igényel, hasznos ismerni a GC-t, az objektumok életciklusát, szálak működését és kezelését, mert egy akkuzabáló és lassú alkalmazásod lesz, amit nem fognak szeretni a felhasználók.
Turi István
Köszi szépen a segítséget! Folyamatosan tanulgatom a javat, de aztmondták, ez sűrgÅs, ezt kell csinálni!
Auth Gábor
Hajrá...
Ha elakadsz, segítünk.
Anonymous
Nahát régen jártam erre. Köszi a segítséget, sikerült megoldani, de most elakadtam az e-mail küldésnél! Szóval az a helyzet, hogy amikor az utolsó oldara behívom az előző oldalakon megadott értékeket, valamiért e-mailben nem jelenik meg. A kérdésem az lenne, hogy több Intent.EXTRA_TEXT-et használhatok, vagy össze kell kapcsolnom a stringeket. Az utolsó oldaon van egy beviteli mező, azt megjeleníti az emailben, a többit nem. TextView-ot használva megjeleníti az eddig bevitt adatokat, csak az email üzenetében nem.
A mail kód így néz ki:
String message = et.getText().toString(); - Az et a beviteli mező
Intent email = new Intent (Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL,/emailcím/);
email.putExtra(Intent.EXTRA_SUBJECT, "Tárgy");
email.putExtra(Intent.EXTRA_TEXT, message);
email.setType("message/rcf822");
Ha mégegy beviteli mezőt szeretnék hozzátenni, akkor mit is kell csinálnom?
Előre is köszi!
Auth Gábor
Össze kell fűzni egy message-be...
Turi István
Ismét köszi! Majd valahogy meghálálom ám.
Turi István
Szia! Még mindig tele vagyok kérdésekkel. A DTO Class-t hogyan hozom létre Eclipseben? New Java Class-nél a Modifiers menüben és a Superclass menüben mit kell választanom?
Köszi.
Auth Gábor
Szerintem semmit nem kell kiválasztanod, alapértelmezetten jó osztályt kellene létrehoznia az Eclipse-nek, de nem értek hozzá, nagyon ritkán használom...
Turi István
Nos, létrehoztam a DTO Class-t, végre eljutottam odáig, hogy nem ír ki semmi hibát, nem huzogat pirossal alá mindent. A java file most így néz ki.
package com.turiistvan.sharedapp;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View.OnClickListener;
import android.widget.EditText;
public class Home extends Activity {
private EditText username;
private EditText password;
private EditText age;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setUsername((EditText) findViewById(R.id.usernameEditText1));
setPassword((EditText) findViewById(R.id.PasswordeditText2));
setAge((EditText) findViewById(R.id.AgeeditText3));
}
/**
* @return the username
*/
public EditText getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(EditText username) {
this.username = username;
}
/**
* @return the password
*/
public EditText getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(EditText password) {
this.password = password;
}
/**
* @return the age
*/
public EditText getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(EditText age) {
this.age = age;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
DTOClass dto = DTOClass.getInstance();
dto.setUsername(getText());
dto.setpassword(getText());
dto.setage(getText());
}
private Editable getText() {
// TODO Auto-generated method stub
return null;
}
}
Most kellene beletennem a gomb akciót, de az onCreate metódus már nem megy, vagyis az eclipse nem ajánlja fel. Innentől, hogy határozom meg a gombot, hogy lépjen a következő oldalra?
Auth Gábor
Bocsánat, hogy csak most reagálok, el voltam foglalva a szerver költöztetésével.
Ránézésre jól néz ki... nem tudom mi lehet a baja, fordításnál nem ír hibát?
Turi István
Sikerült megoldanom a problémát, nem tudom, hogy hogyan, most a gomb nem reagál, nem ugrik a következő oldalra!
package com.turiistvan.sharedapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class Home extends Activity {
private EditText username;
private EditText password;
private EditText age;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setUsername((EditText) findViewById(R.id.usernameEditText1));
setPassword((EditText) findViewById(R.id.PasswordeditText2));
setAge((EditText) findViewById(R.id.AgeeditText3));
}
/**
* @return the username
*/
public EditText getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(EditText username) {
this.username = username;
}
/**
* @return the password
*/
public EditText getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(EditText password) {
this.password = password;
}
/**
* @return the age
*/
public EditText getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(EditText age) {
this.age = age;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
DTOClass dto = DTOClass.getInstance();
dto.setUsername(getText());
dto.setpassword(getText());
dto.setage(getText());
}
private Editable getText() {
// TODO Auto-generated method stub
return null;
}
protected void onResume() {
setContentView(R.layout.sec);
Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(Home.this, Sec.class));
}
});
}
}
Auth Gábor
Az alábbi szekcióban próbálj meg logot írni:
Majd nézd meg a logban, hogy kiírta-e a logba (logcat) a gombra kattintáskor. Egyébként a super.onResume() nincs meghívva, lehet, hogy ez a baj.
Turi István
Köszi.
Van még egy kérdésem.
Ha az xml-ben elhelyezek egy datepickert, akkor annak az értékét, amit a felhasználó beállít, hogyan jelenítem meg a másik oldalon egy TextView-ben?
Auth Gábor
Lekérdezed belőle, lásd a 5. Választómezők cikk vége felé a példát.
Turi István
Igen, átolvastam, de kicsit bonyolultnak tűnik. Találtam egy ilyen megoldást:
final DatePicker dp = (DatePicker) findViewById(R.id.DateRequest);
dp.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
mYear = dp.getYear();
mMonth = dp.getMonth();
mDay = dp.getDayOfMonth();
dp.setText(new StringBuilder()
.append(mMonth + 1).append("-")
.append(mDay).append("-")
.append(mYear).append(" "));
}
});
A gond azt vele, hogy a kiemelt részben a setText-re hibár ír.
Ennyi nem elég a lekérdezéshez?
Auth Gábor
A DatePicker-nek nincs szerintem setText metódusa, szöveget nem tudsz beletenni.
Turi István
Elég csak ezt beletenni, vagy az egész kód kell?
public
void
onDateSet(DatePicker view,
int
year,
int
month,
int
day)
{
TextView textView = (TextView) findViewById(R.main.pickedDate);
textView.setText(year +
"-"
+ (month +
1
) +
"-"
+ day);
}
Auth Gábor
Ez így működni látszik, ha arra van szükséged, hogy egy textView mutassa a kiválasztott dátumot. Esetleg lehet még cizellálni azzal, hogy legyenek bevezető nullák is.