ווידג'טים הם אלמנטים בממשק המשתמש (UI) לשימוש במסך האפליקציה. למשל - כפתורים, חלונות תצוגה. האפליקציה הבאה מדגימה שימוש בכפתורים , ואלמנטי טקסט. ה-UI כולל:
- איזור קלט אליו אפשר להקליד טקסט.
- איזור פלט לתצוגת טקסט.
- כפתור להעתקת הקלט לאיזור הפלט.
- כפתור לניקוי איזור הפלט.
לחץ על הקישור להורדת קבצי המקור.
נבחן תחילה את בקובץ main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <EditText
- android:id="@+id/edit_box"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:autoText="true"
- />
- <Button android:id="@+id/copy_button"
- android:text="@string/copy"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/text_box"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- <Button android:id="@+id/clean_button"
- android:text="@string/clean"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </LinearLayout>
הסברים:
שורה 7-12: הגדרה של חלון קלט טקסט.
שורה 14-17:הגדרת כפתור העתקה.
שורה 19-22: הגדרת חלון פלט טקסט.
שורה 24-27: הגדרת כפתור מחיקת טקסט.
נבחן את קוד הג'אווה בקובץ MyWidget.java:
- package com.ahs.ronen.widgetIntro;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- public class MyWidget extends Activity {
- TextView textBox ;
- EditText editBox ;
- Button cleanButton ;
- Button copyButton ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- textBox = (TextView)findViewById(R.id.text_box);
- editBox = (EditText)findViewById(R.id.edit_box);
- cleanButton = (Button)findViewById(R.id.clean_button);
- copyButton = (Button)findViewById(R.id.copy_button);
- cleanButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- textBox.setText("");
- }
- });
- copyButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- textBox.setText("");
- textBox.setText((editBox.getText().toString()));
- }
- });
- }
- }
שורה 8: זוהי מחלקה\class היורשת את Activity, ומטפלת ביצירת חלון ליצירת ממשקי המשתמש.
שורה 9-12: הכרזה של האובייקטים בהם נשתמש:
- TextView הוא אובייקט להצגת טקסט
- EditText הוא אובייקט לקליטת טקסט
- Button הוא אובייקט לכפתור אינטראקטיבי.
שורה 15: onCreate היא מתודה המופעלת עם הפעלת האובייקט.
שורה 17: הפעלת המתודה של ה"אבא". המימוש שלנו עוקף את מתודת ה- onCreate המקורית של מחלקת ה- Activity - ראה override שורה 14. יחד עם זאת עלינו לקרוא למתודה המקורית.
שורה 18: הגדרת ה- UI. המתודה ( setContentView(R.layout.main מגדירה את ממשק המשתמש על פי ה-layout עליו היא מצביעה, במקרה הנ"ל קובץ layout בשם main הנמצא בספריית layout. הקובץ R.java, מכיל אינדקסים ל-resources שהוגדרו עבור ה- UI. (עניין זה נידון כבר ה- Hello World). שימו לב: setContentView חיית להיות מופעלת לפני כל מתודה הקשורה ל- UI. אחרת תתקבל Error בזמן ההרצה.
שורה 19-23:
textBox = (TextView)findViewById(R.id.text_box);editBox = (EditText)findViewById(R.id.edit_box);
cleanButton = (Button)findViewById(R.id.clean_button);
copyButton = (Button)findViewById(R.id.copy_button);
findViewById שולפת את הגדרות הווידג'טים לתוך האובביקטים שלהן - שני הכפתורים ושני אובייקטים של טקסט.
שורה 24-27:
חיבור (רגיסטרציה) של פונקציה שתופעל עם הלחיצה על כפתור clean, מה שנקרא callback.
- cleanButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- textBox.setText("");
- }
- });
שורה setOnClickListener- 1 המתודה של מחלקת ה-Button שעושה את הרגיסטרציה ל- callback.
שורה 2. המתודה שתופעל עם לחיצת הכפתור היא onClick השייכת ל-Interface - OnClickListener הנבנה כאן בצורה "אנונימית".
שורה 3. המתודה שתקרא מתוך ה- callBack היא setText של האובייקט textBox. מתודה זו מעבירה את הטקסט לתוך האוביקט-textBox. במקרה הזה, הטקסט ריק ולכן המסך ינוקה.
שורות 28-31: רגיסטרציה של מתודה שתופעל עם לחיצה על כפתור copy. דומה לכפתור ה- clean שתואר למעלה.
- copyButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- textBox.setText("");
- textBox.setText((editBox.getText().toString()));
שורה 4 מעבירה לאוביקט התצוגה textBox את קלט מהאובייקט editBox.
יש לי שאלה בנושא שימוש בזיכרון , מה עדיף , להגדיר את האוביקטים כמו שאתה הגדרתה בתוך הCLASS (את הכפתורים ...) או להגדיר אותם בתוך הHENDEL (setOnClickListene)של הלחיצה ,כי זה יצור אותם רק בלחיצה עליו, או שזה לא משנה מבחינת הקצאות זיכרון לאובייקט?
השבמחקהי לאוניד, בהחלט עדיף להגדיר את האובייקטים בתחום הדרוש בלבד. אנא הצע פתרון יעיל יותר אם ניתן. רונן.
השבמחקמה אתה אומר על הדוגמה הזאות ? (התחשבות להקצאות זיכרון מה עדיף?)
השבמחקButton btRemoveIcon = (Button) findViewById(R.id.remove_icon);
btRemoveIcon.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//Code here
}
});
לאוניד, בהחלט פתרון יעיל יותר. רונן.
השבמחקהפיתרון יעיל רק בהנחה שאתה לא תרצה לשנות מאפיינים של הווידג'ט מאוחר יותר בתוך הקוד. (כפתורים בד"כ נשארים קבועים)
השבמחקאבל אם אתה מתכנן לבצע שינויים בווידג'ט (כמו ב TextView למשל הרי שלדעתי עדיף כבר להחזיק רפרנס קבוע אליו, מאשר לקרוא כל פעם ל findViewByID.
הרי ממילא החיסכון שלך בזיכרון הוא זניח מאוד.
מדוע? כי בג'אווה אתה מתעסק רק ברפרנס (פויינטר) ולא באובייקט עצמו, ולכן אם יש לך כפתור מוצג על המסך, אז הוא ממילא טעון ב RAM, וכל התוספת של להחזיק רפרנס לכפתור באופן קבוע זה רק תוספת של רפרנס ל Button ולא אובייקט Button שלם, שהרי לא אתה יצרת אותו.
שלום רונן,
השבמחקאיני מצליח לראות את צילומי המסך מלבד פוסטים בודדים..
לפני כמה ימים זה כן עבד,
אם הבעיה לא אצלי - יש מצב שתוכל לסדר את העניין (זה מאוד עוזר להבנה)
תודה רבה..
הבעיה אצלי לא קיימת. נסה להחליף דפדפן או לנקות את ה-cache.
השבמחקהיי רונן
השבמחקנורא אוהבת את המדריכים שלך הם עזרו לי מאוד!
אני עובדת על אפליקציה שהיא בעצם מדריך שכולל מאמרים ותמונות.
הצלחתי להכניס gallery לפי המדריך שלך :)
אבל אני לא מצליחה להכניס קובץ טקסט... אשמח אם תוכל לעזור לי...
שאלה: כשכותבים טקסט כמו למשל ה hello world יש לפניו הרי את ה / string@ ורק אז הטקסט. כשאני מפעילה באימולטור, אני רואה גם את זה כחלק מהטקסט למרות שזה לא. אם אני מוחקת, מן הסתם המערכת צועקת על שגיאה. איך פותרים זאת? אני התחלתי רק לימודים
השבמחקשאלה: במקום להשתמש באמולטור (איטי ומסורבל) אני פשוט מרי לטלפון, אבל האפליקציו נשארות עליו. יש דרך להגדיר שהן ירוצו ווירטואלית או יותקנו וימחקו לאחר הרצה?
השבמחקאיך מסתדרים עם יישור לימין? כשאני כותב טקסט הוא מופיע הפוך.
השבמחקהצלחתי להצמיד לימין (לאפשר את זה בmainfest, ולהגדיר gravity לימין) אבל הטקסט הפוך... יש פתרון נורמלי חוץ מלהקליד הכל הפוך?