Theory
એ form જેણે પોતાને ખાલી કરી નાખ્યું
એક student FestConnect નું form અડધું ભરે છે, પછી વધુ આરામથી લખવા ફોનને આડો ફેરવે છે. એણે લખેલું દરેક ખાનું અચાનક કોરું થઈ જાય છે.
એ તમે લખેલો bug નથી; એ Android નું મૂળભૂત વર્તન છે. પડદો ફેરવવો એ ગોઠવણનો ફેરફાર છે, અને મૂળભૂત રીતે Android એ Activity ને નાશ કરીને ફરી સર્જે છે, અને ન સંઘરાયેલી અવસ્થા ભૂંસી નાખે છે. તમે એને એક manifest ના attribute, android:screenOrientation, થી અને ફેરવવાથી ખરેખર શું થાય છે એ સમજીને નિયંત્રિત કરો છો.
Theory
પેટી ફેરવો એટલે ઓરડો ફરી બંધાય
ઢીંગલીઘરનો એવો ઓરડો કલ્પો જ્યાં, દર વખતે તમે આખું ઘર ફેરવો ત્યારે રાચરચીલું કાઢી નખાય છે અને ઓરડો નકશા પરથી નવેસરથી ગોઠવાય છે. તમે હાથે જે ફેરગોઠવણ કરી હતી એ બધું જતું રહે છે. Android ફેરવવા પર આ જ કરે છે: એ Activity ને તોડીને onCreate થી ફરી બાંધે છે. કાં તો તમે તમારી ગોઠવણ પહેલાં સંઘરો, કાં તો ઘરને ફરતું અટકાવો.
Theory
દિશા ગોઠવવી અને સમજવી
એને manifest માં Activity પર ગોઠવો:
- portrait: ઊભું બંધાયેલું.
- landscape: આડું બંધાયેલું.
- sensor / fullSensor: ઉપકરણના ફેરવવાના sensor ને અનુસરે છે.
- unspecified: તંત્ર નક્કી કરે છે (મૂળભૂત).
મુશ્કેલી: ફેરવવું એ ગોઠવણનો ફેરફાર છે, અને મૂળભૂત રીતે એ Activity ને નાશ કરીને ફરી સર્જે છે (onCreate ફરી ચાલે છે), અને ન સંઘરાયેલી UI ની અવસ્થા ખોવાય છે. દિશા બાંધવાથી ફેરવવાનું અટકે છે, અને એથી ફરી ગોઠવાવાનું પણ; વૈકલ્પિક રીતે, અવસ્થા onSaveInstanceState માં સંઘરો.
Practical
Form ને portrait માં બાંધો (manifest)
<activity
android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- screenOrientation="portrait" -> the screen will not rotate,
so the Activity is not recreated, so the half-filled
FestConnect form keeps its values. -->This example runs in Gri-Learn on the web, where you can edit it and see the output.
Think first
ફેરવવાથી ખાનાં કેમ ખાલી થયાં?
મૂળભૂત દિશા સાથે, ફોન ફેરવવાથી FestConnect નું form ભૂંસાઈ ગયું. ઘટનાઓની સાંકળ સમજાવો, અને બે જુદા ઉકેલ આપો.
Show the answer
ફેરવવાથી ગોઠવણનો ફેરફાર થાય છે; મૂળભૂત રીતે Android Activity નો નાશ કરીને એને ફરી સર્જે છે, અને onCreate ને શરૂઆતથી ફરી ચલાવે છે, એટલે memory માંનાં ખાનાંનાં મૂલ્યો જતાં રહે છે. બે ઉકેલ: (1) android:screenOrientation="portrait" થી દિશા બાંધો, એટલે ફેરવવાનું નહીં, ફરી સર્જાવાનું નહીં; કે (2) મૂલ્યોને onSaveInstanceState/onCreate માં સંઘરો અને પાછાં લાવો જેથી એ ફરી બંધાવાનું ટકી જાય. Form માટે બાંધવું સૌથી સાદું છે; અવસ્થા સંઘરવી એ વધુ સામાન્ય, મજબૂત ટેવ છે.
Quiz
મૂળભૂત રીતે, વાપરનાર ઉપકરણ ફેરવે ત્યારે Activity નું શું થાય છે?
- એ નાશ પામીને ફરી સર્જાય છે (onCreate ફરી ચાલે છે), અને ન સંઘરાયેલી UI ની અવસ્થા ખોવાય છે
- કશું થતું નથી; Activity અડ્યા વગર ચાલતી રહે છે
- App સાવ બંધ થઈ જાય છે
- ફક્ત manifest ફરી load થાય છે, Activity નહીં
Show the answer
એ નાશ પામીને ફરી સર્જાય છે (onCreate ફરી ચાલે છે), અને ન સંઘરાયેલી UI ની અવસ્થા ખોવાય છે
ફેરવવું એ ગોઠવણનો ફેરફાર છે, અને મૂળભૂત રીતે Android Activity નો નાશ કરીને એને ફરી સર્જે છે, અને onCreate ફરી બોલાવે છે, અને એટલે જ ન સંઘરાયેલાં ખાનાં ફરી ગોઠવાય છે (A). Activity ફક્ત અડ્યા વગર ચાલતી રહેતી નથી (B), app બંધ થતી નથી (C), અને manifest ચાલતી વખતે 'ફરી load' થતું નથી (D). ફેરવવા પર ફરી સર્જાવાનું આ વર્તન જ કારણ છે કે કાં તો દિશા બાંધો કાં તો અવસ્થા સંઘરો.
Watch out
દિશાના ફાંદા
1. ફેરવવાથી અવસ્થા ટકે છે એવું માનવું: મૂળભૂત રીતે ટકતી નથી; Activity ફરી સર્જાય છે. દિશા બાંધો કે અવસ્થા સંઘરો.
2. દિશાને responsive layout સાથે ગૂંચવવી: screenOrientation કઈ બાજુ ઉપર એ બાંધે છે; layout ને landscape પ્રમાણે ગોઠવવું એ અલગ રચનાનું કામ છે (વૈકલ્પિક layout નાં resources).
3. બધું જ portrait માં ચુસ્તપણે બાંધી દેવું: form માટે ઠીક છે, પણ એ ખરો પાઠ છુપાવે છે કે Activities એ ફરી સર્જાવાનું ટકી શકવું જોઈએ.
Theory
આગળ: પડદા પર નિયંત્રણો મૂકો
તમારો FestConnect નો પડદો સ્વચ્છ (મથાળાની પટ્ટી નહીં) અને સ્થિર (દિશા બંધાયેલી) છે. હવે એને ખરેખરાં inputs જોઈએ. હવે પછીનો પાઠ મુખ્ય form નાં widgets મૂકે છે, એટલે કે નામ માટે EditText અને એક Button, અને Button ના onClick ને ખાનું વાંચવા જોડે છે, જે તમારી Android ની app માં પહેલી ખરેખરી interactivity છે.
Summary
Key takeaways
- Manifest માં <activity> પર android:screenOrientation ગોઠવો: portrait, landscape, sensor, unspecified (મૂળભૂત).
- ફેરવવું એ ગોઠવણનો ફેરફાર છે; મૂળભૂત રીતે Android Activity નો નાશ કરીને એને ફરી સર્જે છે (onCreate ફરી ચાલે છે).
- એ ફરી સર્જાવાનું ન સંઘરાયેલી UI ની અવસ્થા ભૂંસી નાખે છે, અને એટલે જ અડધું ભરેલું form ફેરવવા પર ખાલી થાય છે.
- દિશા બાંધીને (portrait) કે onSaveInstanceState માં અવસ્થા સંઘરીને/પાછી લાવીને સુધારો.
- screenOrientation (કઈ બાજુ ઉપર) એ responsive landscape નું layout રચવાથી જુદું છે.
- Memory hook: પેટી ફેરવવાથી ઓરડો નકશા પરથી ફરી બંધાય છે.