Android Studio למתחילים, חלק 2: חקור את האפליקציה וקודד אותה

עודכן: ינואר 2020.

בחלק 1 של מבוא למתחילים זה ל- Android Studio, הגדרת את Android Studio בסביבת הפיתוח שלך והכרת את ממשק המשתמש. כעת, בחלק 2, תקודד את האפליקציה הראשונה שלך.

אפליקציית הסלולר המונפשת מורכבת מפעילות אחת, המציגה את דמות הרובוט של אנדרואיד של גוגל וכפתור להנפשת הדמות. לחיצה על הכפתור גורמת לדמות לשנות צבע בהדרגה מירוק לאדום לכחול, ואז חזרה לירוק. האפליקציה אמנם לא שימושית במיוחד, אך הכתיבה שלה תעזור לך להרגיש בנוח בשימוש ב- Android Studio. בחלק 3, תבנה ותפעל את האפליקציה באמצעות אמולטור מכשיר אנדרואיד וטאבלט קינדל פייר.

שים לב שסדרה זו עודכנה עבור Android Studio 3.2.1, המהדורה היציבה הנוכחית נכון לכתיבת שורות אלה.

חלונות הפרויקט והעורך של Android Studio

הצגתי את החלון הראשי של Android Studio בסוף חלק 1. חלון זה מחולק למספר אזורים, כולל חלון Project בו אתה מזהה את קובצי המשאבים של האפליקציה, וחלונות עורך שונים בהם תכתוב את הקוד ותציין משאבים לאפליקציות לנייד. ב- Android Studio. חלון הפרויקט וחלון העורך מוצגים באיור 1.

ג'ף פריזן

חלון הפרויקט מדגיש את W2A , שהוא שם W2A.javaקובץ המקור של האפליקציה (אם כי .javaסיומת הקובץ אינה מוצגת). המקביל ל- W2A הוא חלון עורך, אליו מגיעים באמצעות לחיצה כפולה על W2A בחלון הפרויקט. חלון העורך חושף את התוכן הנוכחי של הקובץ, במקרה זה קוד המקור השלד של Java לפעילות העיקרית של האפליקציה.

כל חלון עורך משויך לכרטיסייה. לדוגמה, חלון העורך של W2A משויך לכרטיסייה W2A.java . מוצגת גם כרטיסייה שנייה המזוהה כ- main.xml ( פריסת ברירת המחדל מבוססת XML לפעילות הראשית של האפליקציה). אתה עובר מחלון עורך אחד למשנהו על ידי לחיצה על לשונית החלון.

הורד קבל את הקוד הורד את קוד המקור לאפליקציית Android לדוגמה: W2A.java. נוצר על ידי ג'ף פרייזן עבור JavaWorld.

אפליקציית האנדרואיד לדוגמא

האפליקציה לדוגמא ( W2A.java ) מורכבת מפעילות עיקרית המציגה את דמות הרובוט של אנדרואיד וכפתור. כאשר המשתמש לוחץ על הכפתור, הרובוט מונפש באמצעות סדרת צבעים. בחלק זה נחקור את קוד המקור והמשאבים של הפעילות.

חקור וקודד את האפליקציה לדוגמה של Android

קוד המקור של הפעילות נשמר בקובץ W2A.java, המוצג ברשימה 1.

רישום 1. W2A.java

 package ca.javajeff.w2a; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class W2A extends Activity { AnimationDrawable androidAnimation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView androidImage = (ImageView) findViewById(R.id.android); androidImage.setBackgroundResource(R.drawable.android_animate); androidAnimation = (AnimationDrawable) androidImage.getBackground(); final Button btnAnimate = (Button) findViewById(R.id.animate); View.OnClickListener ocl; ocl = new View.OnClickListener() { @Override public void onClick(View v) { androidAnimation.stop(); androidAnimation.start(); } }; btnAnimate.setOnClickListener(ocl); } } 

W2A.javaהקובץ מתחיל עם אמירת חבילה , אשר שם את החבילה ( ca.javajeff.w2a) המאחסן את W2Aהכיתה. לאחר מכן סדרת הצהרות ייבוא ​​עבור סוגי API שונים של Android. לאחר מכן, הקוד מתאר את W2Aהמחלקה שמתארכת android.app.Activity.

W2Aמכריז תחילה על androidAnimationשדה מופע מסוג android.graphics.drawable.AnimationDrawable. אובייקטים מהסוג AnimationDrawableמתארים אנימציות מסגרת אחר מסגרת, בה מוחלף הציור הנוכחי לציור הבא ברצף האנימציה.

מהו ציור?

Drawable משהו שניתן להסיק, כגון תמונה. AnimationDrawableבעקיפין מרחיב את android.graphics.drawable.Drawableהמעמד המופשט , שהוא הפשטה כללית לציור.

שיטת onCreate ()

כל עבודות האפליקציה מתבצעות בשיטת W2Aהעל onCreate(Bundle): אין צורך בשיטות אחרות, מה שעוזר לשמור על יישום זה פשוט.

onCreate(Bundle) ראשית קוראת לשיטת אותה superclass בשם זה, כלל שעליו להיות מלווה בכל שיטות הפעילות הגורמות.

לאחר מכן השיטה הזו מבוצעת setContentView(R.layout.main)כדי לבסס את ממשק המשתמש של האפליקציה. R.layout.mainהוא מזהה (מזהה) עבור משאב יישום, השוכן בקובץ נפרד. אתה מפרש מזהה זה באופן הבא:

  • Rהוא שם המחלקה שנוצרת בעת בניית האפליקציה. מחלקה זו נקראת Rמכיוון שתוכן שלה מזהה סוגים שונים של משאבי יישומים, כולל פריסות, תמונות, מחרוזות וצבעים.
  • layoutהוא שמו של כיתה המקוננת בתוכה R. משאב יישום שתעודת הזהות שלו מאוחסנת במחלקה זו מתאר משאב פריסה ספציפי. כל סוג של משאב יישומים משויך למחלקה מקוננת ששמה נקרא באופן דומה. לדוגמה, stringמזהה משאבי מחרוזות.
  • mainהוא שמו של intקבוע מבוסס שמוצהר בתוכו layout. מזהה משאבים זה מזהה את משאב הפריסה הראשי. באופן ספציפי, mainמתייחס main.xmlלקובץ המאחסן את פרטי הפריסה של הפעילות הראשית. mainהוא W2Aמשאב הפריסה היחיד.

עובר R.layout.mainאל Activityים" void setContentView(int layoutResID)שיטת מורה אנדרואיד כדי ליצור מסך ממשק המשתמש באמצעות מידע פריסת מאוחסן main.xml. מאחורי הקלעים, אנדרואיד יוצר את רכיבי ממשק המשתמש המתוארים main.xmlומציב אותם על מסך ההתקן כמפורט main.xmlבנתוני הפריסה.

המסך מבוסס על תצוגות (הפשטות של רכיבי ממשק משתמש) וקבוצות תצוגה (תצוגות שמקבצות רכיבי ממשק משתמש קשורים). תצוגות הן מקרים של מחלקות שמתעדות את android.view.Viewהמחלקה בצורה משנה ואנלוגיות לרכיבי AWT / Swing. קבוצות תצוגה הן מקרים של מחלקות שמתעדות את android.view.ViewGroupהמחלקה המופשטת ומקבילות למכולות AWT / Swing. אנדרואיד מתייחס לתצוגות ספציפיות (כגון כפתורים או ספינרים) כווידג'טים .

ממשיך, onCreate(Bundle)מבצע ImageView androidImage = (ImageView) findViewById(R.id.android);. שיחות הראשונות הצהרה זו Viewשל View findViewById(int id)שיטה למצוא את android.widget.ImageViewהאלמנט הכריז main.xmlוזוהה android. הוא ImageViewמאתחל ומאתחל אותו לערכים המוצהרים main.xmlבקובץ. ההצהרה שומרת אז את הפניה של אובייקט זה במשתנה מקומי androidImage.

ImageView ואנימציה Drawable

בשלב הבא, androidImage.setBackgroundResource(R.drawable.android_animate);מעורר האמירה ImageView"s בירושה (מ View) void setBackgroundResource(int resID)שיטה, קביעת הרקע של נוף המשאב המזוהה על ידי resID. R.drawable.android_animateמזהה טיעון קובץ XML בשם android_animate.xml(בהמשך), אשר מאחסן מידע על אנימציה, ואשר מאוחסן resשל drawableשרת מרוחק. setBackgroundResource()השיחה מקשרת את androidImageהמבט אל הרצף של תמונות המתואר על ידי android_animate.xml, אשר יצויר על השקפה זו. התמונה הראשונית מצוירת כתוצאה משיחת שיטה זו.

ImageViewמאפשר לאפליקציה להנפיש רצף של ציורים באמצעות AnimationDrawableשיטות קריאה . לפני שהאפליקציה תוכל לעשות זאת, עליה להשיג ImageViewאת זה AnimationDrawable. androidAnimation = (AnimationDrawable) androidImage.getBackground();פקודת השמה העוקב משיג משימה זו על ידי הפנייה ImageViewשל בירושה (מ View) Drawable getBackground()שיטה. שיטה זו מחזירה את AnimationDrawableהנתון הנתון ImageView, אשר מוקצה לאחר מכן androidAnimationלשדה. AnimationDrawableלמשל משמש כדי להתחיל ולהפסיק אנימציה, תהליך אתאר בקצרה.

לבסוף, onCreate(Bundle)יוצר את כפתור Animate . זה קורא findByViewId(int)להשיג את המידע על הכפתור main.xmlואז מיישר את android.widget.Buttonהכיתה.

לאחר מכן היא משתמשת בממשק Viewהמקונן של הכיתה onClickListenerליצירת אובייקט מאזין. void onClick(View v)שיטת אובייקט זה מופעלת בכל פעם שהמשתמש לוחץ על הכפתור. המאזין רשום עם שלה Buttonאובייקט על ידי קורא Viewשל" void setOnClickListener(AdapterView.OnClickListener listener)שיטה.

לעצור, ואז להתחיל את האנימציה, ניפשת מפעילת מאזין קליק "s androidAnimation.stop();ואחריו androidAnimation.start();. stop()השיטה נקראת לפני start()כדי להבטיח כי לחיצה נוספת של ניפשת הכפתור גורמת אנימציה חדשה להתחיל.

עדכן ושמור את הקוד שלך

Before we continue, replace the skeletal code in your W2A.java tab with the code from Listing 1. Save the contents of this window by pressing Ctrl+S, or select Save All from the File menu.

Coding the Android app's main.xml

The app's main activity is associated with an XML-based layout, which is stored in file main.xml, and which is presented in Listing 2.

Listing 2. main.xml

After the XML declaration, Listing 2 declares a LinearLayout element that specifies a layout (a view group that arranges contained views on an Android device's screen in some manner) for arranging contained widgets (including nested layouts) either horizontally or vertically across the screen.

The tag specifies several attributes for controlling this linear layout. These attributes include the following:

  • orientation identifies the linear layout as horizontal or vertical. Contained widgets are laid out horizontally or vertically, and the default orientation is horizontal. "horizontal" and "vertical" are the only legal values that can be assigned to this attribute.
  • layout_width identifies the width of the layout. Legal values include "fill_parent" (to be as wide as the parent) and "wrap_content" (to be wide enough to enclose content). (Note that fill_parent was renamed to match_parent in Android 2.2, but is still supported and widely used.)
  • layout_height identifies the height of the layout. Legal values include "fill_parent" (to be as tall as the parent) and "wrap_content" (to be tall enough to enclose content).
  • gravity identifies how the layout is positioned relative to the screen. For example, "center" specifies that the layout should be centered horizontally and vertically on the screen.
  • background identifies a background image, a gradient, or a solid color. For simplicity, I've hardcoded a hexadecimal color identifier to signify a solid white background (#ffffff). (Colors would normally be stored in colors.xml and referenced from this file.)

The LinearLayout element encapsulates ImageView and Button elements. Each of these elements specifies an id attribute, which identifies the element so that it can be referenced from code. The resource identifier (special syntax that begins with @) assigned to this attribute begins with the @+id prefix. For example, @+id/android identifies the ImageView element as android; this element is referenced from code by specifying R.id.android.

These elements also specify layout_width and layout_height attributes for determining how their content is laid out. Each attribute is assigned wrap_content so that the element will appear at its natural size.

ImageView specifies a layout_marginBottom attribute to identify a space separator between itself and the button that follows vertically. The space is specified as 10 dips, or density-independent pixels. These are virtual pixels that apps can use to express layout dimensions/positions in a screen density-independent way.

Density-independent pixels

פיקסל עצמאית בצפיפות (מטבל) שווה פיקסל פיזי אחד על מסך 160-dpi, צפיפות הבסיס שנוטל על אנדרואיד. בזמן ריצה, אנדרואיד מטפלת בשקיפות בכל קנה המידה של יחידות הטבילה הנדרשות, בהתבסס על הצפיפות בפועל של המסך בשימוש. יחידות טבילה מומרות לפיקסלים במסך באמצעות המשוואה: פיקסלים = מטבלים * (צפיפות / 160) . לדוגמא, על מסך של 240 dpi, טבילה אחת שווה 1.5 פיקסלים פיזיים. גוגל ממליצה להשתמש ביחידות טבילה כדי להגדיר את ממשק המשתמש של האפליקציה שלך כדי להבטיח תצוגה נכונה של ממשק המשתמש במסכי מכשיר שונים.

בחירה ושמירה של פריסה חדשה