Theory
લેબલથી ખરેખરા form સુધી
અત્યાર સુધી FestConnect ફક્ત લખાણ દેખાડે છે. નોંધણીના form એ લખાણ લેવું પડે: નામ લખવાનું ખાનું, અને એની સાથે કંઈક કરતું બટન.
એ બે widgets છે, EditText (લખાણનું ખાનું) અને Button, જે XML ના layout માં મુકાય છે. પણ એમને મૂકવું એ અડધું કામ છે. બીજું અડધું Java છે: દરેક widget ને એના id થી પકડવું અને બટન દબાય ત્યારે પ્રતિભાવ આપવો. એ દબાવવાનો પ્રતિભાવ છે onClick નું event, અને ત્યાં જ તમારી app પહેલી વાર વાપરનારને સાંભળે છે.
Theory
Form રચો, પછી બારીએ કારકુન બેસાડો
XML એ counter પર મુકાયેલું છાપેલું form છે: નામ માટે ખાલી જગ્યા, પાના પર દોરેલું 'Submit' નું બટન. પણ કાગળ જાતે કશું કરતું નથી. Java એ બારીએ બેઠેલો કારકુન છે જે, Submit દબાય ત્યારે, ખરેખર ખાલી જગ્યા વાંચે છે અને પગલું લે છે. તમે form એક વાર રચો છો (XML) અને પ્રતિભાવ આપવા કારકુન બેસાડો છો (onClick નું handler).
Theory
મૂકો, શોધો, પ્રતિભાવ આપો
1. XML માં મૂકો: એક EditText અને એક Button, દરેક android:id="@+id/..." સાથે.
2. Java માં શોધો: EditText name = findViewById(R.id.name); એ XML ના widget ને Java ના object સાથે જોડે છે.
3. વાંચો: name.getText().toString() વાપરનારે લખેલું (String તરીકે) લાવે છે.
4. દબાવવા પર પ્રતિભાવ આપો, બે રીતે:
- XML માં
android:onClick="register"જેpublic void register(View v)ની પદ્ધતિ બોલાવે, કે - Java માં
button.setOnClickListener(v -> { ... });.
Practical
Register નું બટન નામ વાંચે છે
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.activity_main);
EditText name = findViewById(R.id.name);
Button register = findViewById(R.id.register);
register.setOnClickListener(v -> {
String typed = name.getText().toString(); // read the field
// (next lesson: show 'typed' in a Toast)
});
}
}
// XML alternative for the button:
// android:onClick="register" -> public void register(View v) { ... }Think first
getText().toString() કેમ?
નામનું ખાનું વાંચવા તમે name.getText().toString() લખો છો, ફક્ત name.getText() નહીં. વધારાનું toString() કેમ? getText() ખરેખર કયો પ્રકાર પાછો આપે છે?
Show the answer
getText() એ Editable (CharSequence જેવો object) પાછો આપે છે, સાદી String નહીં. મોટા ભાગના code ને String જોઈએ છે, એટલે તમે એને ફેરવવા `.toString()` બોલાવો છો. જો તમે એ છોડી દો અને Editable ને String તરીકે વાપરવા જાઓ (સરખામણી, સંગ્રહ, કે String ની અપેક્ષા રાખતા Toast માટે), તો એ તમે ધારો છો એમ વર્તશે નહીં. getText().toString() નો રૂઢિપ્રયોગ એ જ રીત છે જેનાથી તમે દર વખતે EditText માંથી વાપરી શકાય એવી String કાઢો છો.
Quiz
જો તમે XML માં android:onClick="register" વાપરો, તો Java ની પદ્ધતિ કેવી હોવી જોઈએ?
- public void register(View v) { ... }
- private String register() { ... }
- public void register() { ... } (કોઈ parameters નહીં)
- void register(int id) { ... }
Show the answer
public void register(View v) { ... }
android:onClick નું handler public હોવું જોઈએ, void પાછું આપવું જોઈએ, અને એક જ View નું parameter લેવું જોઈએ (જેના પર click થયું): public void register(View v) (A). એ private ન હોઈ શકે કે મૂલ્ય પાછું ન આપી શકે (B), એણે View નું parameter સ્વીકારવું જ પડે, એટલે parameter વગરની આવૃત્તિ જોડાતી નથી (C), અને parameter એ View છે, int નહીં (D). Signature ખોટું હોય તો Android પદ્ધતિ શોધી/બોલાવી શકતું નથી, એટલે બટન મરેલું લાગે છે.
Watch out
Widget અને onClick ના ફાંદા
1. toString() વગર EditText વાંચવું: getText() એ Editable છે, String નહીં. getText().toString() વાપરો.
2. ખોટું onClick નું signature: XML ના onClick ની પદ્ધતિ public void name(View v) હોવી જ જોઈએ. Private હોય, કે View ના parameter વગરની હોય, તો એ બોલાવાશે નહીં.
3. findViewById ભૂલી જવું (કે ખોટું id): એ null પાછું આપે છે, અને એને અડતાં NullPointerException સાથે app તૂટે છે. XML માંના @+id ને Java માંના R.id સાથે મેળવો.
Theory
આગળ: વાપરનારને કહો કે એ થઈ ગયું
અત્યારે દબાવેલું નામ ક્યાંય દેખાતું નથી. હવે પછીનો પાઠ Toast ઉમેરે છે, એટલે કે થોડી વાર માટે ઊપસી આવતો નાનો સંદેશો, જેથી Register દબાવતાં 'Welcome, Aditi' ચમકે. પ્રતિભાવ આપવાની એ સૌથી સાદી રીત છે, અને એ તમે હમણાં લખેલા onClick માં સીધી બંધબેસે છે.
Summary
Key takeaways
- XML માં widgets મૂકો: EditText (લખાણનું ખાનું) અને Button, દરેક android:id="@+id/..." સાથે.
- Java માં findViewById(R.id.xxx) એ XML ના widget ને Java ના object સાથે જોડે છે (ids મેળવો).
- EditText ને getText().toString() થી વાંચો (getText() એ Editable પાછો આપે છે, String નહીં).
- દબાવવાનું બે રીતે સંભાળો: android:onClick="method" (public void method(View v)) કે Java માં setOnClickListener.
- ખોટું onClick નું signature કે null આપતું findViewById બટનને મરેલું દેખાડે છે કે app તોડે છે.
- Memory hook: XML form રચે છે, Java બારીએ કારકુન બેસાડે છે.