Let's go back to the JustJava app for
just a moment.
Let's look at the MainActivity
class displayMessage method.
Things are starting to make
a little more sense in here.
We already recognize that we're creating
a variable called orderSummaryTextView.
The data type of this
variable was TextView.
We didn't understand this part yet
though.
On the next line, we call a method
on this text view object.
We use the same variable
name as declared up here.
So we call orderSummaryTextView.setText.
Then we pass a string as
an input to the method.
This string message originally
came as an input parameter
to the display message method.
Now let's dig in to this part of
the code, which we don't understand yet.
It looks like findViewById
is a method call, though.
Because its preceding these parenthesis
with what looks like an input argument.
But, what's weird is that this method
isn't defined anywhere in this class.
If I double-click on this name and
then hit command F, or
control-F if you're on Windows, then
we can try to do a search in this file.
I only see two occurrences
of findViewById, and
they're used in similar ways.
But I don't see any method
that's called findViewById.
Speaking of which,
earlier in the main activity class,
we see a call to setContentView,
but if you search for
this in the file, it's also not
defined in the main activity.
So, where are these methods defined?
Well, MainActivity is
actually a pretty short file.
It's only about 90 lines long,
but there's actually more to
this class than meets the eye.
The code says,
extends AppCompatActivity.
This means that the main
activity is an extension
of the functionality in
the AppCompatActivity class.
On your computer if you see action
bar activity here, that's okay,
that's just an older version of this.
The latest version that you should
be using is AppCompatActivity.
And AppCompatActivity gives us
backward compatibility support
on older Android devices.
The AppCompatActivity is part
of the Android support library.
It allows us to use the latest
UI features on Android,
while still working on
older Android devices.
By extending
the AppCompatActivity class,
we're getting all the functionality,
all the state and
the methods from here within
the MainActivity for free.
We don't have to copy and
paste any code from here.
We can just simply extend that class.
If you're interested,
you can find out more information on
AppCompatActivity by googling for it.
Here's the reference doc for
the AppCompatActivity class.
Since I have the Chrome
extension installed,
I can view the source as well.
And this is the code for where
the AppCompatActivity class is defined.
You can see that there's a lot
of functionality here, but
the key message is that you don't have
to understand how it's implemented.
All you need to know is that when
you extend AppCompatActivity,
you get all of this functionality for
free.
At a high level you can
visualize it like this.
This is a class definition for
MainActivity.
And say you have some
methods defined here.
When you extend AppCompatActivity
then we can access the state and
then the methods from AppCompatActivity.
Now, they're not physically added
to the main activity class, but
you can imagine that they're there,
because you can still reference
the state and the methods as well.
And that's how our code can refer
to things like setContentView or
findViewById.
Because we inherited those methods, we
didn't define them in the MainActivity.
The MainActivity is shown as
a screen on the device, but
we didn't write the code for that in the
MainActivity, we inherited that as well.
We don't have the state and the methods
from AppCompatActivity directly
in the class, but now we know that
they're there and we can refer to them.
Speaking of inheriting things,
there's good and bad parts about that.
Sometimes we'll want to
inherit behavior but
other times we might want
to modify it slightly.
If you want to change some of
the behavior from this inherited class,
you can override certain methods.
You can add this @override text on top
of a method so that the computer knows
that you don't want the version of
the method from the AppCompatActivity.
But instead, you want this
version that you've defined here.
This is a tricky topic, and
it requires a lot of practice.
But we have seen one example
of overriding a method
from the AppCompatActivity class.
And that method is the on create method.
By overriding the on create method in
the MainActivity, we're specifying our
own implementation for what should
happen when that method is called.
Don't worry if you don't
understand this right away.
I'm just giving you a brief overview
of a bunch of object-oriented
programming concepts.
It's absolutely expected that you
would still have lingering questions.
And still need to read up more
these topics in order to fully
understands them.
Another way to visualize the
relationship between the MainActivity
and the AppCompatActivity classes is
to draw a Class Hierarchy Diagram.
This is different from
a View Hierarchy Diagram, because
the View Hierarchy Diagram shows a tree
of views that are shown on a screen.
The Class Hierarchy Diagram
shows the relationship
between different Java classes.
We have AppCompatActivity as superclass.
Since MainActivity extends
from AppCompatActivity,
then this is known as the subclass.
So whenever you see this class
definition whatever you extend is known
as the superclass.
This would be the subclass.
So if you created another activity
called detail activity and
you extended AppCompatActivity,
this would be the subclass, and
this would be the superclass.
Here's another example of
Java class inheritance.
If you think about it,
the text view, image view, and
button views all have some
common aspects to them.
All of these views have a width and
a height on the screen.
We haven't learned this yet, but
they also have a visibility state.
So they can all be made invisible or
visible.
There are a couple of other properties
as well, that are common among them.
Instead of writing out code for these
properties within the text view class,
and then copying it over to image view,
and then button class.
We can do something a little smarter.
We can create a view class.
We can extract the common properties
among all of these views and then put
them inside this view class that way
the code only has to be written once.
But then how do we make the connection
between the text view class and
the view class?
If you're thinking inheritance,
you're correct.
In the TextView java file we're
going to define the text view class.
That way we'll inherit all this data and
the methods from the view class.
Then we won't have to have as
much code in the TextView class
because part of the functionality is
already written in the view class.
The same would apply for
the ImageView and
Button classes,
we don't have to write as much code.
In these files, we only have to
write about what's different
about the ImageView
compared to the View class.
I think of this as specifying a delta,
so the ImageView class only has to
specify what's different about the
ImageView compared to the View class.
If we don't want to inherit certain
behavior from the View class,
we can just specify the updated
behavior within the ImageView class, or
any of these classes.
To remind you of the terminology,
in this case,
TextView would be the subclass,
and View would be the superclass.
If we go back to the documentation for
the TextView class,
we actually understand this part now.
It says TextView extends view.
Now we know that it means that
we're inheriting the state and
the methods from the ViewClass.
And down here is a class
hierarchy diagram.
It shows that the TextView class
is inheriting from the ViewClass.
And in turn, the View class
inherits from the Object class.
If you explore around,
you can find other classes,
like the EditText class, which actually
extends from the TextView class.
So it takes the behavior
form the TextView class and
then adds a little more
specific functionality to it.
So EditText extends from TextView.
And TextView extends from View,
and View extends from Object.
And this is the class hierarchy diagram.
There's a lot going on, and
you can look at it for hours.
But let me just show you one thing
on the TextView documentation page.
I want to show you the method for
SetVisibility.
Here's the Java method for
SetVisibility within the TextView class.
This changes whether
the view is visible or not.
If I click on this method,
it actually brings me to the View class.
And then it describes
what this method does.
So you can see that a TextView
object has a set visibility method.
But it was actually inherited
from the View class.
So we got this functionality for
free, from the View class.
Okay, we just covered
a ton of new concepts.
Normally this would be spread out over
a semester of a computer science course.
We're going to do a little
bit of practice now and
hopefully it will start to
connect the dots for you.
But know that it will
take a lot more time and
practice until you fully
grasp these concepts.
Okay, first exercise, I want you
to create another new Android app,
because we don't want to
mess up the just Java app.
Once you create the project,
then run the app.
Once you create your app,
you're going to see a MainActivity file.
That MainActivity file will
extend from AppCompatActivity.
In your version of Android Studio,
if the MainActivity extends from
ActionBarActivity instead,
that's okay too.
That's just an older version
of AppCompatActivity.
By removing this method override,
we're going to fall back to
the way that onCreate method appeared
in the AppCompatActivity class.
The presence of this method says we want
different behavior in the MainActivity
for the onCreate.
So removing it brings us back
to the original behavior in
the AppCompatActivity class.
When you run the app,
what do you notice is different
compared to when you first ran the app?
Write your answer in this text box.
JustJava لنعد لتطبيق
.للحظة فقط
MainActivity لنلق نظرة على فئة
.أسلوب عرض الرسالة
.بدأت الأمور تبدو مفهومة هنا
أدركنا سابقًا أننا ننشئء متغيّرًا يسمى
.order Summary Text View
نوع البيانات في هذا المتغير
.TextView هو
بالرغم من أننا لم نفهم
.هذا القسم بعد
في السطر الثاني،سنلجأ لطريقة
.text view object فيما يخص
سنقوم باستعمال نفس اسم المتغير
.كما هو موضح هنا
.orderSummaryTextView.setText إذن نستدعي
.ثم نضع سلسلة كمدخل للأسلوب
رسالة السلسلة هاته
جاءت كمَعلمة إدخال
.display message لأسلوب
الآن، لنتعمق في هذا القسم
.من الرمز الذي لا نفهمه بعد
findViewById يبدو وكأن
.هو أسلوب إستدعاء رغم ذلك
لأنها تسبق هذه الأقواس
.بما يشبه وسيطة الإدخال
لكن، ما هو غريب أن هذا الأسلوب
.لم يتم تحديده في أي مكان في هذه الفئة
إذا قمت بنقر مزدوج على هذا الإسم
أو،F وبعد ذلك نقرت على أمر
إذا كنت تستخدم نظام الويندوز F التحكم
.وبالتالي يمكننا البحث عن هذا الملف
أرى فقط تكرارين
و ،findViewByIdلـ
.وقد تم استعمالهما بأساليب متشابهة
لكنني لا أرى أي أسلوب
.findViewById استدعى
وكما تم الإشارة له من قبل
،main activity في فئة
setContentViewنرى استدعاءً لـ
ولكن إذا بحثت عن
هذا في الملف، فهو أيضًا
.main acitivity لم يتم تحديده في
إذن، أين تم تحديد هذه الأساليب؟
هو MainAcitivity ،حسنًا
في الواقع ملف صغير
،وطوله حوالي 90 سطرًا
ولكن هناك في الواقع ما هو أهم
.في هذه الفئة
،يقول الرمز
.AppCompatActivityامتداد لـ
MainAcitivity وهذا يعني أن
.هو ملحق
.AppCompatActivity الوظيفة في فئة
action bar activity إذا رأيت
هنا على حاسوبك، فلا بأس في ذلك
.فذلك فقط مجرد نسخة قديمة
النسخة الأخيرة التي ينبغي أن تسنعملها
.AppCompatActivity هي
AppCompatActivity تمنحنا
دعمًا للتوافق السابق
.على أجهزة أندرويد السابقة
AppCompatActivity تعتبر
.جزءً من مكتبة دعم الأندرويد
وهي تسمح لنا باستخدام آخر ميزات
،واجهة المستخدم على الأندرويد
كما أنها لا تزال تعمل
.على أجهزة الأندرويد القديمة
عبر تمديد فئة
،AppCompatActivity
نحن نحصل على جميع الوظائف
وجميع الحالات، و
الأساليب من خلال
.بالمجّان MainActivity
.لا نحتاج لنسخ ولصق كل رمز من هنا
يمكننا ببساطة تمديد تلك الفئة
،إذا كنت مهتمًا
يمكن العثور على المزيد من المعلومات حول
.عبر البحث عنها في غوغل AppCompatActivity
لفئة doc هذا هو المرجع
.AppCompatActivity
وبما أن لدي ملحق كروم
،متبثًا
.يمكنني عرض المصدر كذلك
وهذا هو الرمز الذي تم فيه تحديد
.AppCompatActivity فئة
يمكنك رؤية وجود
العديد من الوظائف هنا، ولكن
الرسالة الأساسية أنه لا ينبغي عليك
.فهم كيف تم تنفيذ ذلك
كل ما عليك معرفته هو أنه عندما
.AppCompatActivity تُمدّد
فستحصل على جميع الوظائف
.بالمجان
،وفي مستوى عالٍ
.إظهارها على هذا النحو
هذا تحديد الفئة لـ
.MainActivity
وكما لديك هنا بعض الأساليب
.التي تم تحديدها هنا
AppCompatActivity عندما تمدّد
فيمكنك الوصول للحالة، و
والأساليب بعد ذلك
.AppCompatActivity من خلال
الآن، لم يتم إضافتهم فعليًا
ولكن،main activity لفئة
،يمكن أن تتصور أنهم هناك
لأنه يمكنك الرجوع للحالة
.وجميع الأساليب كذلك
وبذلك يمكن لرمزنا الإحالة
أو،setContentViewلبعض العناصر مثل
findViewById.
لأنه قد اكتسبنا تلك الأساليب
.MainActivity ولم نحددها في
MainActivity يتم إظهار
كشاشة على الجهاز، ولكن
MainActivity لم نكتب رمز ذلك في
.بل إكتسبنا ذلك أيضًا
ليس لدبنا الحالة والأساليب
AppCompatActivity مباشرة من
في الفئة، ولكننا نعرف
.أنهم هناك، ويمكننا الإحالة إليهم
،وبالحديث عن إكتساب الأشياء
.هناك جوانب جيدة وسيئة في ذلك
أحيانًا، نريد إكتساب
سلوك، ولكن
.وأحيانًا، نريد تعديله قليلاً
إذا أردت تغيير بعض السلوك
،من هذه الفئة المكتسبة
.يمكنك تجاوز العديد من الأساليب
في أعلى الأسلوب @override text يمكنك إضافة
حتى يعرف الحاسوب
بأنك لا تريد نسخة الأسلوب
.AppCompatActivity من
ولكن بدلاً من ذلك، تريد النسخة التي
.قمت بتحديدها هنا
هذا موضوع معقد، و
.يتطلب الكثير من الممارسة
لكننا قد رأينا مثالاً واحدًا
على تجاوز أسلوب
.AppCompatActivity من خلال فئة
.on create وذلك الأسلوب هو الأسلوب
on create عبر تجاوز أسلوب
فنحن نُخصّص ،MainActivity في
التنفيذ الخاص بنا لما ينبغي أن يحدث
.عندما يتم إستدعاء ذلك الأسلوب
.لا تقلق إذا لم تفهم هذا الآن
فأنا فقط أقدم لمحة عامة
للعديد من مفاهيم
.البرامج الموجهة
من المتوقع تمامًا أن يكون لديك
.بعض الأسئلة العالقة
ولا تزال تحتاج لقراءة المزيد من
هذه المواضيع لتفهم ذلك
.بشكل كامل
وهناك طريقة أخرى لإظهار العلاقة
MainActivity بين
AppCompatActivity و فئات
.هو أن ترسم فئة مخطط تسلسل هرمي
وهذا مختلف عن عرض
مخطط التسلسل الهرمي لأن
يظهر عرض مخطط التسلسل الهرمي شجرة
.طرق عرض تظهر على الشاشة
تُظهر فئة مخطط التسلس الهرمي
العلاقة
.بين مختلف فئات الجافا
.كفئة عليا AppCompatActivity لدينا
تمتد من MainActivity بما أن
AppCompatActivity،
.إذن فهذا ما يسمى بالفئة الفرعية
إذن، فأينما رأيت تحديد هذه الفئة
فمهما قمت بتمديدها، فذلك يسمى
.بالفئة العليا
.وهذه ستكون فئة فرعية
أخرى تسمى activity إذا أنشأت
و detail activity
AppCompatActivity ومدّدت
فهذه ستكون الفئة الفرعية و
.هذه ستكون الفئة العليا
وهذا مثال آخر
.Java عن اكتساب الفئات الخاص بـ
إذا فكرت في الأمر، فإن طريقة
عرض النص والصورة
.والأزرار لها ميزات مشتركة
كل طرق العرض تلك لها عرض
.وارتفاع على الشاشة
لم ندرس ذلك بعد، ولكن تلك الطرق لديها
.أيضا وضع للرؤية
إذًا يمكن أن نجعلها ظاهرةً
.أو مخفيةً
وهناك العديد من الخصائص التي تعد
.مشتركة بينها أيضًا
عوض كتابة الرمز لتلك الخصائص
،في فئة طريقة عرض النص
وثم نسخه في فئتي طريقة
.عرض الصورة والأزرار
.يمكننا القيام بشيء ذكي قليلًا
.يمكننا إنشاء فئة لطريقة العرض
يمكننا أن نستخرج الخصائص المشتركة
في كل طرق العرض ونضعها
في داخل فئة طريقة العرض، وبهذه الطريقة
.لن يتوجب علينا كتابة الرمز سوى مرة واحدة
ولكن كيف يمكننا القيام بالربط بين
فئة طريقة عرض النص و
فئة طريقة العرض؟
.إذا كنت تفكر في الاكتساب، فأنت محق
سنقوم بتحديد فئة طريقة عرض النص
.TextView java داخل ملف
وبهذه الطريقة ستُكتسب جميع البيانات
.والأساليب من فئة طريقة العرض
وبعد ذلك لن يتوجب علينا كتابة
.TextView الرمز كاملًا في فئة
لأن جزءًا من الوظيفة تمت كتابته
.سابقًا في فئة طريقة العرض
ImageView الأمر نفسه ينطبق على فئات
والأزرار، إذاً لا يتوجب علينا كتابة
.الرمز بأكمله
في هذه الملفات، يتوجب علينا
كتابة ما هو مختلف فقط
ImageView بين
View وفئة
،أفكر في الأمر كتحديد لدلتا
تحتاج ImageView إذًا ففئة
ImageView لتحديد ما هو مختلف بين
.View وفئة
إذا لم نرغب في اكتساب سلوك معين
،View من فئة
يمكننا تحديد السلوك المحدّث
أو ،ImageView داخل فئة
.أي من هذه الفئات
،لتذكيرك بالمصطلحات
،في هذه الحالة
فئة فرعية TextView سيكون
.فئة عليا View و
إذا عدنا إلى وثائق
،TextView فئة
.فسنفهم ذلك الجزء الآن
.view امتداد لـ TextView وهي تقول
والآن نعلم أن ذلك يعني اكتساب
الوضع و
.ViewClass الأساليب من
وهنا في فئة
.مخطط التسلسل الهرمي
TextView ويظهر أن فئة
.ViewClass تكتسب من طرف
View وبدورها فئة
.Object تكتسب من طرف فئة
وإذا قمت بالبحث في الجوار، ستجد
،فئات أخرى
التي هي في الواقع EditText مثل فئة
.TextView امتداد لفئة
إذا فهي تأخذ السلوك
و TextView من فئة
ثم تضيف وظيفة محددة
.لها
.TextView هي امتداد لـ EditText إذًا
View هي امتداد لـ TextView و
.Object هي امتداد لـ View و
وهذه هي فئة مخطط
.التسلسل الهرمي
هناك المزيد والمزيد، ويمكنك أن
.تمضي ساعات في تفقده
ولكن دعني أريك شيئًا واحدًا
.TextView في صفحة وثائق
أريد أن أريك الطريقة الخاصة
.SetVisibility بـ
SetVisibility للقيام بـ Java ها هو أسلوب
.TextView داخل فئة
view وهذا يغير وضع
.لتكون ظاهرة أو مخفية
،إذا نقرتُ على هذا الأسلوب
.View فسينقلني في الواقع إلى فئة
وهي تصف العمل الذي
.يقوم به هذا الأسلوب
TextView object ويمكنك أن تلاحظ أن
.set visibility لديه أسلوب
ولكنها في الواقع تكتسب من
.View فئة
إذن حصلنا علي هذه الوظيفة بالمجان
.View من فئة
حسنًا، لقد غطينا العديد
.من المفاهيم
عمومًا، هذه التفاصيل يمكن التوسع فيها
.من خلال كورس فصل علوم الحاسوب
سنقوم الآن بالقليل
من الممارسة و
نتمنى أن تكون الأمور واضحة
.بالنسبة لك
ولكن عليك أن تعلم أن ذلك سيتطلب
الكثير من الوقت و
الممارسة حتى تتمكن من فهم
.هذه المفاهيم بشكل تام
حسنًا، التمرين الأول، أريد منك أن
،تُنشئ تطبيق أندرويد جديد آخر
لأننا لا نريد أن نفسد
.Java تطبيق الـ
،عندما تنشئ المشروع
.قم بتشغيل التطبيق
،عندما تنشئ التطبيق الخاص بك
.MainActivity سوف ترى ملف
.AppCompatActivity ذلك الملف سيمتد من
الخاصة بك Android Studio في نسخة
يمتد من MainActivity إذا كان
،عوضًا عن ذلك ActionBarActivity
.فذلك جيد أيضًا
لأنه يعتبر نسخة قديمة من
.AppCompatActivity
،وعبر إزالة أسلوب التجاوز
سنرجع إلى
onCreate الطريقة التي ظهرت بها فئة
.AppCompatActivity في فئة
إن تواجد هذا الأسلوب يُبين أننا نريد
MainActivity سلوكًا مختلفًا في
.onCreate لـ
إذا قمنا بحذفها فسيعيدنا ذلك إلى
السلوك الأصلى في
.AppCompatActivity فئة
،عندما تشغل التطبيق
ما هو الاختلاف الذي تلاحظه بالمقارنة
مع المرة الأولى التي شغلت فيها التطبيق؟
.أكتب إجابتك في خانة النص التالية
Volvemos a la aplicación
Just Java solo un momento.
Vemos el método displayMessage
en la clase MainActivity.
Parece que las cosas
empiezan a cobrar sentido aquí.
Nos damos cuenta
de que intentámos crear
una variable que se llama
orderSummaryTextView.
El tipo de información
de esta variable es TextView.
Sin embargo, aún no entendemos
esta parte de aquí.
En la siguiente línea, invocamos
un método en este objeto TextView.
Usamos el mismo nombre
de variable declarado aquí arriba.
Lo llamamos
orderSummaryTextView.setText.
Luego pasamos un String
como entrada para el método.
Este mensaje (String) inicialmente
venía como parámetro de entrada.
del método displayMessage.
Vamos a analizar esta parte
del código que no entendemos aún.
Parece que findViewByld
es una invocación a un método,
porque precede a estos paréntesis
con lo que parece
un argumento de entrada.
Pero es extraño que no
se defina este método
en ninguna parte de la clase.
si hago doble clic en el nombre
y luego presiono el comando F
o control F, en Windows,
podemos buscar dentro del archivo.
Solo veo dos coincidencias
con findVIewBYld
y se usan de modo parecido.
Pero no veo ningún método
que se llame finViewByld.
A propósito, anteriormente
en la clase MainActivity
vimos una invocación a setContentView,
pero al buscarlo en el archivo no
está definido en MainActiivty tampoco.
¿Donde se definen estos métodos?
MainActivity es en realidad
un archivo bastante pequeño.
Solo tiene 90 líneas,
pero hay más sobre esta clase
de lo que aparenta a simple vista.
El código dice, extends
(extiende) AppCompatActivity.
Lo que significa que MainActivity
es una extensión de la funcionalidad
en la clase AppCompatActivity.
En el ordenador, si ves aquí,
ActionBarActivity está bien.
Es solo una versión más antigua.
Deberías usar la versión más reciente
que es AppCompatActivity.
AppCompatActivity da soporte
para compatibilizar versiones previas
en los aparatos antiguos de Android.
AppCompatActivity es parte de
la biblioteca de soporte de Android.
Nos permite usar los atributos
UI más recientes en Android
mientras que todavía funciona
en otros aparatos antiguos de Android.
Al extender la clase AppCompatActivitiy
conseguimos gratis
todas las funcionalidades,
metodos y estados de aqui,
dentro de MainActivity.
No tenemos que copiar
y pegar ningún código desde aquí
Simplemente extender esta clase.
Puedes obtener más información
en Google sobre AppCompatActivity.
Aquí está el documento de referencia
de la clase AppCompatActivity.
Como tengo instalada
la extensión de Chrome,
también puedo ver la fuente.
Y este es el código desde donde
se define la clase AppCompatActivity.
Puedes ver que hay un montón
de funcionalidades aquí,
pero la clave es que no tienes
que entender cómo se implementa.
Solo necesitas saber que cuando
extiendes AppCompatActivity
consigues gratis
todas estas funcionalidades.
A nivel superior. podemos
visualizarlo de esta manera
Esta es la definición
de clase para MainActivity.
Y digamos que hay definidos
algunos métodos aquí.
Si extendemos AppCompatActivity
podemos acceder al estado
y los métodos de AppCompactActivity.
Ahora no se han añadido
físicamente a la clase MainActivity
pero puedes imaginar que están allí,
porque tienes aún referencia
al estado así como a los métodos.
Y así es como el código se
refiere a cosas con setContenView
o findViewByld.
Porque heredamos esos métodos,
no los definimos en MainActivitiy.
MainActivity aparece como
una pantalla en el aparato,
pero no escribimos el código
para eso en MainActivity,
sino que lo heredamos también.
No tenemos el estado y los métodos
directamente de AppCompatActivity
en la clase, pero ahora sabemos
que están y referirnos a ellos.
Hablando de heredar cosas,
tiene ventajas y desventajas.
A veces queremos heredar
un comportamiento,
pero otras, sencillamente
modificarlo ligeramente.
Para cambiar un comportamiento
de esta clase heredada
se puede override
(sobreescrir) sus métodos.
Basta añadir este texto
@override encima del método.
y así el ordenador sabe
que no quieres la versión
del método de AppCompatActivity.
y que prefieres la versión
que has definido aquí.
Es un tema complicado
y requiere mucha práctica.
Pero hemos visto un ejemplo
de override un método
de la clase AppCompatActivity.
y ese método es onCreate.
Al override el método onCreate
en MainACtivity específicamos
nuestra propia implementación
de lo que sucederá al invocar el método.
No te preocupes sino
lo entiendes todo ahora.
Es solo una breve visión
de un montón de conceptos
sobre la programación
orientada a objetos.
Es normal que todavía
tengas un montón de preguntas
y necesites leer más sobre esto
para realmente entenderlo.
Otra forma de visualizar las relaciones
entre las clases de MainActivity
y AppCompactActivity es dibujar
un diagrama con jeraraquía de clases.
Este es diferente
a un diagrama jerárquico de vistas.
El diagrama de vistas muestra
un árbol con vistas en la pantalla.
Y el de clases muestra las relaciones
entre la diferentes clases de Java.
Tenemos AppCompatActivity
como una superclase.
Dado que MainActivity se extiende
desde AppCompatActivity,
se denomina subclase.
Por eso, siempre que veas
esta definición de clase,
todo lo que se extienda
se conoce como superclase.
Y esta será la subclase.
Así, si creamos otra actividad
que vamos a llamar DetailActivity
y la extiendes desde AppComptActivity,
está será la subclase
y esta la superclase.
Aquí hay otro ejemplo
de clases heredadas en Java.
Si piensas en las clases TextView,
ImageView o ButtonView,
todas tienen aspectos en común.
Todas tienen una determinada
altura y anchura en la pantalla.
Todavía no lo vimos, pero tienen
también un estado de visibilidad.
De modo que se pueden
definir como visibles o invisibles.
Hay también un par de otras
propiedades que comparten.
En lugar de escribir el código
para estas propiedades
dentro de la clase TextView
y luego copiarlo sobre las clases,
ImageView y ButtonView,
podemos hacer algo mejor.
Podemos crear una clase View
y extraer todas las propiedades
comunes entre estas vistas
para ponerlas dentro de la clase View.
De este modo, escribiremos
el código solo una vez.
Pero entonces ¿cómo relacionamos
las clases TextView y View ?
Si piensas en "heredar," vas bien.
En el archivoTextViewde Java
vamos a definir la clase TextView.
Así, heredaremos los datos
y métodos de la clase View.
Y no tendremos tanto código
en la clase TextView,
porque parte de la funcionalidad
ya está escrita en la clase View.
Para las clases ImageView
y Button se aplicaría lo mismo,
no hay que escribir tanto código.
En estos archivos solo tenemos
que escribir lo que es diferente
de ImageView en comparación
con la clase View.
Es como definir una función delta,
así, en la clase ImageView
solo tenemos que específicar
lo que la diferencia de la clase View.
Si no queremos heredar ciertos
comportamientos de la clase View
basta con actualizar y especificar
un nuevo comportamiento
dentro de la clase ImageView
o cualquiera de estas clases.
Te recuerdo la teminología,
que en este caso sería,
TextView la subclase
y View la superclase.
Si volvemos ahora
a la documentación de View Class,
ya entendemos esta parte.
Dice que TextView extiende View.
Ahora sabemos que significa
que heredamos el estado
y los métodos de la clase View.
Y más abajo, aquí hay
un diagrama de jerarquía.
Nos muestra que la clase TextView
se hereda de la clase View.
Y a su vez, la clase View
se hereda de la clase Object.
Mira alrededor y verás otras clases,
como la clase EditText, la cuál
se extiende desde la clase TextView.
Toma el comportamiento
de la clase TextView
para añadirle después
funcionalidades específicas.
EditText se extiende
por tanto desde TextView,;
TextView se extiende desde View;
y View se extiende desde Object.
Este es el diagrama
jerárquico de clases.
Hay un montón de cosas
y podría llevarnos horas.
Solo te mostraré una cosa
en la documentación de TextView.
Es el método SetVisibility.
Aqui está el métodoSetVisibility
dentro de la clase TextView.
Nos permite cambiar
si la vista es visible o invisible.
Si hago clic en el método,
me lleva a la clase View,
donde se describe
lo que hace el método.
El objeto TextView vemos
que tiene el método SetVisibility,
aunque lo heredó de la clase View.
Por tanto, esta funcionalidad
es gratis por la clase View.
Acabamos de cubrir
una tonelada de conceptos.
Lo normal, sería repartirlos en
un curso de informática en un semestre
Vamos a practicar un poco ahora
y espero que empezarás
a conectar todas las cosas.
Pero sabemos que necesitarás
mucho más tiempo y práctica
para que entiendas
totalmente estos conceptos.
Primer ejercicio, crearás
una nueva app para Android.
porque no queremos
estropear la app Just Java.
Después de crear
el proyecto, ejecuta la app.
Una vez creada la app
verás el archivo MainActivity.
El archivo MainActivity se extiende
desde AppCompatActivity.
Si se extiende desde ActionBarActivity
en tu versión de Android,
no pasa nada, esta bien.
Es solo una versión anterior
de AppCompatActivity.
Al eliminar este método
override revertiremos a la forma
como aparecía onCreate
en la clase AppCompatActity.
La presencia de este método
nos indica que queremos
un comportamiento diferente
para onCreate en MainActivity.
Al eliminarlo volvemos a
a su comportamiento inicial
en la clase AppCompatActivity.
Cuando ejecutes la app,
¿qué cambia en comparación
a la primera vez que la ejecutaste?
Anota la respuesta en la casilla de texto.
Retournons un instant
à l'appli JustJava.
Regardons la méthode displayMessage
de la classe MainActivity.
Ça commence à être
un peu plus clair ici.
Nous voyons déjà que nous créons
une variable nommée orderSummaryTextView.
Le type de données de cette variable
était TextView.
Mais on ne comprenait pas
cette partie avant.
Sur la ligne suivante, nous appelons
une méthode sur cet objet TextView.
Nous utilisons le même nom de variable
que celui que nous avons choisi ici.
Nous la nommons donc
orderSummaryTextView.setText.
Nous insérons une chaîne de caractères
comme entrée de méthode.
Cette chaîne était initialement apparue
comme paramètre d'entrée
de la méthode d'affichage du message.
Creusons un peu plus cette partie du code
que nous ne comprenons pas.
FindViewById ressemble
à un appel de méthode
Il précède ces parenthèses dont le code
ressemble à un argument d'entrée.
Mais étrangement, cette méthode
n'apparaît nulle part dans la classe.
Si je double-clique sur ce nom
et que je tape commande F
ou Contrôle F, sous Windows, je peux
faire une recherche dans le fichier.
Je ne trouve que deux occurrences
de findViewById.
Elles sont utilisées de façon similaire.
Mais, je ne vois aucune méthode
appelée findViewById.
Justement, auparavant,
dans la classe MainActivity,
nous avons vu un appel de setContentView
mais si on le recherche
dans ce fichier, on le retrouve pas
défini dans MainActivity.
Alors, où ces méthodes
sont-elles définies ?
Eh bien, MainActivity
est un fichier assez court.
Il ne contient que 90 lignes environ.
Pourtant cette classe contient
plus d'informations qu'il n'y paraît.
Le code dit :
« extends AppCompatActivity ».
Cela signifie que MainActivity
est une extension
de la fonctionnalité de la classe
AppCompatActivity.
Si vous voyez ActionBarActivity ici
sur votre ordinateur, ne vous affolez pas.
C'est juste que vous avez
une version plus ancienne.
La version la plus récente
est AppCompatActivity.
AppCompatActivity nous offre
un soutien de rétrocompatibilité
sur les appareils Android plus anciens.
AppCompatActivity fait partie
de la bibliothèque de soutien Android.
Il permet d'user des dernières fonctions
de l'interface utilisateur Android
tout en travaillant
sur des appareils Android plus anciens.
L'extension de la classe
AppCompatActivity
fait obtenir toutes les fonctionnalités,
tous les états
et toutes les méthodes à partir d'ici
dans MainActivity, gratuitement.
Pas besoin de faire de copier-coller
de code d'ici.
Il suffit d'étendre cette classe.
Si vous le désirez,
vous pouvez trouver plus d'informations
sur AppCompatActivity sur Google.
Voici le document de référence
de la classe AppCompatActivity.
Comme j'ai l'extension
Chrome installée,
je peux aussi voir la source.
Voici le code qui indique où la classe
AppCompatActivity est définie.
Vous observez de nombreuses
fonctionnalités ici.
Mais vous n'avez pas besoin
de comprendre comment elles s'appliquent.
Tout ce que vous devez savoir,
c'est que l'extension d'AppCompatActivity,
vous permet d'obtenir gratuitement
toutes ses fonctionnalités.
À un autre niveau, vous pouvez
le visualiser ainsi.
Voici une définition de classe
pour MainActivity.
et vous avez des méthodes
définies ici.
En étendant AppCompatActivity
vous pouvez accéder à l'état
puis aux méthodes d'AppCompatActivity.
Ils ne sont pas ajoutés physiquement
à la classe MainActivity.
Mais, on sait qu'ils sont là
parce qu'on peut toujours se référer
à l'état et aux méthodes.
C'est ainsi que notre code peut se référer
à des objets tels que setContentView
ou findViewById.
Ayant hérité de ces méthodes, pas besoin
de les définir dans MainActivity.
MainActivity apparaît comme un écran
sur l'appareil.
Pourtant, nous n'avons pas écrit de code
dans MainActivity, nous en avons hérité.
Nous n'avons ni l'état, ni les méthodes
d'AppCompatActivity
directement dans la classe mais ils y sont
et nous pouvons nous y référer.
Hériter, ça a des avantages
et des inconvénients.
Parfois, nous voulons hériter
d'un comportement.
D'autres fois, nous voulons juste
l'outrepasser légèrement.
Si vous voulez changer le comportement
d'une classe héritée,
vous pouvez modifier certaines méthodes.
On peut ajouter : « @override » au-dessus
de la méthode pour que l'ordinateur sache
que vous ne voulez pas la version
de la méthode d'AppCompatActivity.
Mais que vous préférez la version
que vous avez définie ici.
C'est un sujet délicat qui demande
beaucoup d'entraînement.
Mais nous avons vu un exemple
pour outrepasser une méthode
de la classe AppCompatActivity.
C'est la méthode « on create ».
En outrepassant la méthode on create
dans MainActivity, on indique
l'action qui doit être exécutée
quand cette méthode est appelée.
Ne vous affolez pas
si vous ne comprenez pas.
Je n'ai fait qu'un bref résumé
des concepts de programmation
orientée objets.
Je m'attends à ce que vous ayez
des questions en suspens
et que vous ayez besoin de revoir
ces thèmes
avant de bien les comprendre.
Une autre façon de voir les relations
entre les classes MainActivity
et AppCompatActivity , c'est de faire
un diagramme de hiérarchie des classes.
C'est différent d'un diagramme
de hiérarchie des vues
car ce dernier montre l'arborescence
des vues qui apparaissent à l'écran.
Le schéma de hiérarchie des classes
montre la relation
entre différentes classes Java.
AppCompatActivity est une super-classe.
Comme MainActivity est une extension
d'AppCompatActivity,
c'est une sous-classe.
Donc, dès que vous voyez cette définition
de classe quelle qu'en soit l'extension,
c'est une super-classe.
Voici une sous-classe.
Si vous vouliez créer une autre activité
nommée DetailActivity
par extension d'AppCompatActivity,
ce serait la sous-classe
et la super-classe.
Voici un autre exemple d'héritage
de classe Java.
Quand on y réfléchit,
TextView, ImageVIew et ButtonView,
ont des aspects communs.
Toutes ces vues ont une largeur
et une hauteur à l'écran.
Nous ne l'avons pas encore étudié mais
elles ont aussi un état de visibilité.
On peut toutes les rendre invisibles
ou visibles.
Elles ont encore d'autres propriétés
en commun.
Au lieu d'écrire le code de ces propriétés
dans la classe TextView,
puis de le copier dans les classes
ImageView et Button.
On peut utiliser une astuce
en créant une classe View.
On peut extraire les propriétés communes
de toutes ces vues,
puis les insérer dans cette classe View
et n'écrire ce code qu'une seule fois.
Mais comment faire le lien
entre la classe TextView
et la classe View ?
Si vous pensez à l'héritage,
vous avez visé juste.
Dans le fichier Java TextView, nous allons
définir la classe TextView.
Nous hériterons de toutes les données
et toutes les méthodes de la classe View.
Nous n'aurons donc pas besoin d'écrire
beaucoup de code dans la classe TextView.
Car une partie de la fonctionnalité
est déjà rédigée dans la classe View.
C'est la même chose pour
les classes ImageView
et Button. Pas besoin d'écrire
autant de code.
Dans ces fichiers, il suffit d'écrire
les différences
entre ImageView
et la classe View.
Je vois ça comme un delta,
il suffit d'indiquer en quoi
la classe ImageView
diffère de la classe View.
Si on ne veut pas hériter d'une partie
des comportements de la classe View,
il suffit d'indiquer le comportement
souhaité dans la classe ImageView
ou toute autre classe.
Je vous rappelle les termes utilisés :
Ici, TextView est la sous-classe,
et View, la super-classe.
Si on revient aux documents
relatifs à la classe TextView,
on les comprend mieux maintenant.
On lit TextView provient de View.
Nous savons maintenant
que nous avons hérité cet état
et ces méthodes de la classe View.
Et voici un diagramme
de hiérarchie des classes.
Il montre que la classe TextView
ihérite de la classe View.
Et la classe View hérite
de la classe Object.
En regardant autour,
vous trouverez d'autres classes,
par exemple, la classe EditText
qui provient de la classe TextView.
Elle adopte donc le comportement
de la classe TextView.
Puis, des fonctionnalités plus précises
y sont ajoutées.
Donc EditText vient de TextView.
Et TextView vient de View,
et View vient d'Object.
C'est donc le diagramme
de hiérarchie des classes.
Il y a beaucoup de choses à voir.
On pourrait y passer des heures.
J'aimerais vous montrer quelque chose
sur la page de documentation TextView.
Je veux vous montrer la méthode
SetVisibility (régler la visibilité).
Voici la méthode Java,
SetVisibility, dans la classe TextView.
Elle permet de rendre la vue
visible ou non.
Si je clique sur cette méthode,
j'arrive à la classe View.
Je trouve une description
de ce que fait cette méthode.
Un objet TextView a donc une méthode
de visibilité prédéfinie.
Mais elle a été héritée de la classe View.
Nous avons obtenu cette fonctionnalité
gratuitement de la classe View.
Ok, nous venons de découvrir
beaucoup de nouveaux concepts.
En général, il faut un semestre de cours
d'informatique pour étudier tout ça.
Passons aux exercices pratiques.
J'espère que tout ceci
sera plus clair.
Sachez que vous aurez
vraiment besoin de temps
et d'entraînement pour assimiler
ces concepts.
Ok, premier exercice : créez une nouvelle
appli Android,
car je préfère que votre appli
JustJava ne soit pas désorganisée.
Une fois le projet créé,
lancez l'appli.
Une fois l'appli créée, vous verrez
un fichier MainActivity.
Ce fichier MainActivity proviendra
d'AppCompatActivity.
Dans votre version d'Android Studio,
si MainActivity provient
d'ActionBarActivity,
ça passe aussi.
C'est une version plus ancienne
d'AppCompatActivity.
En enlevant la modification appliquée
à cette méthode, on va retrouver
comment la méthode onCreate est apparue
dans la classe AppCompatActivity.
La présence de cette méthode indique
qu'on veut un autre comportement
de la méthode onCreate
dans MainActivity.
En l'enlevant, on revient donc
au comportement initial
de la classe AppCompatActivity.
Quand vous lancez l'appli,
Quelle différence relevez-vous par rapport
à votre premier lancement de l'appli ?
Répondez
dans ce champ.
Mari kita kembali
ke aplikasi JustJava untuk sesaat.
Mari kita lihat di kelas MainActivity
metode displayMessage.
Semuanya mulai sedikit tegang di sini.
Kita sudah mengenali
bahwa kita menciptakan variabel
yang disebut orderSummaryTextView.
Tipe data variabel ini adalah TextView.
Kita masih belum memahami bagian ini.
Pada baris berikutnya, kita sebut
metode pada tampilan objek teks ini.
Kita menggunakan nama variabel
yang sama seeprti dinyatakan di sini.
Jadi kita sebut
orderSummaryTextView.setText.
Kemudian kita melewati string
sebagai masukan untuk metode ini.
Pesan string ini awalnya
datang sebagai parameter masukan
untuk metode menampilkan pesan.
Sekarang kita masuk ke bagian kode,
yang masih belum kita mengerti.
Sepertinya findViewById
adalah panggilan metode.
Karena memiliki tanda kurung ini
yang tampak seperti
sebuah argumen masukan.
Tapi anehnya metode ini tidak
didefinisikan di mana saja di kelas ini.
Jika saya klik dua kali pada nama ini
dan kemudian tekan perintah F,
atau kontrol F jika kau memakai Windows,
maka kita dapat mencoba
melakukan pencarian di berkas ini.
Saya hanya melihat
dua kejadian findViewById,
dan mereka digunakan
dengan cara yang sama.
Tapi saya tidak melihat
metode yang disebut findViewById.
Omong-omong,
sebelumnya di kelas MainActivity,
Kita bisa melihat setContentView,
tapi jika kau mencari ini di berkas,
hal ini juga tidak didefinisikan
dalam MainActivity.
Jadi, di mana metode ini didefinisikan?
MainActivity sebenarnya
berkas yang cukup singkat.
Dan hanya terdiri dari sekitar 90 baris,
tapi ada sebenarnya
kelas ini yang penting.
Kode mengatakan,
perluas AppCompatActivity.
Ini berarti bahwa MainActivity
adalah perpanjangan
dari fungsi di kelas AppCompatActivity.
Pada komputermu jika kau melihat
kegiatan bar di sini, tidak apa-apa,
itu hanya versi lama progaram ini.
Versi terbaru yang harus kau
gunakan adalah AppCompatActivity.
Dan AppCompatActivity
memberi kita dukungan kompatibilitas
Pada perangkat Android yang lebih tua.
AppCompatActivity adalah bagian
perpustakaan dukungan Android.
Hal ini memungkinkan kita untuk
menggunakan fitur UI terbaru pada Android,
Sementara masih bekerja pada
perangkat Android yang lebih tua.
Dengan memperluas kelas AppCompatActivity,
Kita mendapatkan semua fungsi tersebut,
semua bagian dan metode dari sini,
dalam MainActivity secara gratis.
Kita tidak perlu salin dan
menempelkan kode apa pun dari sini.
Kita hanya perlu memperpanjang kelas itu.
Jika kau tertarik,
kau dapat mengetahui informasi
lebih lanjut tentang AppCompatActivity
dengan mencarinya di Google.
Berikut ini adalah dokumen referensi
untuk kelas AppCompatActivity.
Karena saya memiliki
ekstensi Chrome yang diinstal,
Saya bisa melihat sumbernya juga.
Dan ini adalah kode di mana
kelas AppCompatActivity didefinisikan.
Kau dapat melihat
ada banyak fungsi di sini,
tapi pesan utamanya kau tak perlu
memahami bagaimana ini diterapkan.
Kau hanya perlu tahu saat
kau memperpanjang AppCompatActivity,
kau mendapatkan
semua fungsi ini secara gratis.
Pada tingkat tinggi,
kau dapat memvisualisasikan seperti ini.
Ini adalah definisi kelas
untuk MainActivity.
Dan kau punya beberapa
metode yang didefinisikan di sini.
Saat kau memperpanjang AppCompatActivity,
maka kita dapat mengakses bagian ini
dan metodenya dari AppCompatActivity.
Secara fisik mereka tidak
ditambahkan ke kelas MainActivity,
tapi kau bisa bayangkan mereka ada,
karena kau masih dapat
mereferensi bagian dan metodenya.
Dan seperti itu bagaimana
kode kita dapat merujuk
pada hal-hal seperti
setContentView atau FindViewById.
Karena kita warisi metode-metode tersebut,
yang kita tak definisikan di MainActivity.
MainActivity akan ditampilkan
sebagai layar pada perangkat tapi
kita tidak menulis kodenya
di MainActivity, kita mewarisinya juga.
Kita tidak punya bagian dan metode
langsung dari AppCompatActivity di kelas
tapi sekarang kita tahu mereka ada
dan bisa merujuk pada mereka.
Berbicara tentang mewarisi hal,
ada hal baik dan buruk tentang itu.
Terkadang kita ingin mewarisi perilaku,
tapi lain kali kita mungkin ingin
memodifikasinya sedikit.
Jika kau ingin mengubah beberapa
perilaku dari kelas warisan ini,
kau dapat mengganti
metode-metode tertentu.
Kau dapat menambahkan teks
@Override di metodenya agar komputer tahu
bahwa kau tidak ingin versi
metode dari AppCompatActivity.
Tapi sebaliknya, kau ingin versi
yang telah kau definisikan di sini.
Ini topik yang rumit,
dan membutuhkan banyak latihan.
Tapi kita telah melihat salah satu
contoh menulis ulang metode
dari kelas AppCompatActivity.
Dan metode itu ada di metode menciptakan.
Dengan mengesampingkan metode yang ada
di dalam MainActivity,
kita menentukan implementasi sendiri
untuk apa yang harus terjadi
saat metode itu dipanggil.
Jangan khawatir jika kau tidak mengerti.
Saya baru saja
memberikanmu gambaran singkat
mengenai sekelompok konsep
objek pemrograman berorientasi.
Sangat diharapkan bahwa
kau masih mempunyai pertanyaan.
Dan masih perlu membaca lebih lanjut
topik ini untuk lebih memahaminya.
Cara lain memvisualisasikan hubungan
antara MainActivity dan AppCompatActivity
dengan cara menggambar
Diagram Hierarki Kelas.
Ini berbeda dengan
Diagram Hirearki Tampilan
karena Diagram Hirearki Tampilan
menunjukkan tampilan pohon
yang ditampilkan pada layar.
Diagram Hierarki Kelas
menunjukkan hubungan
antara kelas Java yang berbeda.
Kami memiliki AppCompatActivity
sebagai kelas super.
Sejak MainActivity meluas
dari AppCompatActivity,
maka ini dikenal sebagai bagian kelas.
Jadi, setiap kali kau
melihat definisi kelas ini,
apa pun yang kau perpanjang
dikenal kelas super.
Ini akan menjadi bagian kelas.
Jika kau membuat aktivitas lain
yang disebut kegiatan rinci
dan kau memperpanjang AppCompatActivity,
ini akan menjadi bagian kelas,
dan ini akan menjadi kelas supernya.
Berikut ini contoh lain
dari warisan kelas Java.
Jika kau berpikir tentang hal itu,
tampilan teks, gambar, dan tombol,
semuanya memiliki beberapa
aspek umum kepada mereka.
Semua tampilan ini memiliki
lebar dan tinggi pada layar.
Kita belum mempelajarinya, tapi
mereka juga memiliki bagian visibilitas.
Jadi mereka semua bisa dibuat
tidak terlihat atau terlihat.
Ada juga beberapa sifat lainnya,
yang umum di antara mereka.
Alih-alih menulis kode untuk
properti ini dalam kelas tampilan teks
dan kemudian menyalinnya
ke tampilan gambar lalu kelas tombol.
Kita bisa lakukan sesuatu
yang sedikit lebih pintar.
Kita dapat membuat tampilan kelas.
Kita dapat mengekstrak
sifat umum di antara tampilan ini,
lalu masukkan mereka
dalam tampilan kelas ini,
dengan cara itu kode tersebut
hanya harus ditulis sekali.
Tapi bagaimana kita
membuat hubungan antara
kelas tampilan teks dan tampilan kelas?
Jika kau berpikir warisan, kau benar.
Dalam berkas java TextView kita
akan menentukan kelas tampilan teks.
Dengan begitu kita akan mewarisi
semua data dan metode dari tampilan kelas.
Kemudian kita tidak perlu memiliki
banyak kode seperti di kelas TextView
karena bagian dari fungsi tersebut
sudah ditulis di kelas tampilan.
Hal yang sama akan berlaku untuk
yang kelas ImageView dan tombol,
kita tidak harus menulis kode yang banyak.
Dalam berkas ini, kita hanya perlu
menulis tentang apa yang berbeda
mengenai ImageView
dibandingkan dengan kelas tampilan.
Saya menganggap ini
sebagai menentukan delta,
jadi kelas ImageView
hanya harus menentukan
apa yang berbeda tentang ImageView
dibandingkan dengan kelas tampilan.
Jika kita tidak ingin mewarisi
perilaku tertentu dari kelas tampilan,
Kita dapat menentukan
perilaku yang telah diperbarui
di dalam kelas ImageView
atau kelas mana pun yang ada di sini.
Untuk mengingatkanmu tentang terminologi,
dalam hal ini TextView akan menjadi
bagian kelas dan tampilan kelas supernya.
Jika kita kembali ke dokumentasi
untuk kelas TextView,
kita akan memahami bagian ini sekarang.
Dikatakan TextView memperluas tampilan.
Sekarang kita tahu sudah mewarisi
bagian dan metode dari ViewClass.
Dan di sini adalah diagram hierarki kelas.
Ini menunjukkan bahwa kelas
TextView mewarisi dari ViewClass.
Dan pada gilirannya,
kelas tampilan mewarisi dari kelas objek.
Jika kau mencarinya lagi,
kau akan menemukan kelas-kelas lain,
Seperti kelas EditText, yang
sebenarnya pemanjangan kelas TextView.
Jadi dibutuhkan perilaku
membentuk kelas TextView dan
kemudian menambahkan
sedikit fungsi khusus untuk itu.
Jadi EditText pemajangan dari TextView.
Dan TextView pemanangan tampilan,
dan tampilan pemanjangan dari objek.
Dan ini adalah diagram hirearki kelas.
Ada banyak hal yang terjadi, dan
kau bisa melihatnya selama berjam-jam.
Tapi izinkan saya menunjukkan satu hal
di halaman dokumentasi TextView.
Saya ingin menunjukkan
metode untuk SetVisibility.
Berikut ini adalah metode Java
untuk SetVisibility dalam kelas TextView.
Ini mengubah apakah
tampilannya terlihat atau tidak.
Jika saya klik pada metode ini,
ini akan membawa saya ke kelas tampilan.
Dan kemudian menjelaskan soal metode ini.
Jadi kau dapat melihat bahwa objek
TextView memiliki metode set visibilitas.
Tapi itu sebenarnya mewarisi
dari kelas tampilan.
Jadi kita punya fungsi ini secara gratis,
dari kelas tampilan.
Oke, kita baru saja menemukan
banyak konsep baru.
Biasanya ini akan dipelajari selama
satu semester dari jurusan ilmu komputer.
Kami akan melakukan
sedikit latihan sekarang
dan mudah-mudahan itu
akan membuatmu sedikit memahaminya.
Tapi hal itu membutuhkan
lebih banyak waktu dan latihan
sampai kau sepenuhnya
memahami konsep-konsep tersebut.
Oke, latihan pertama, saya ingin kau
membuat aplikasi Android lain yang baru
karena kita tidak ingin
mengacaukan aplikasi JustJava.
Setelah kau membuat proyek,
kemudian jalankan aplikasinya.
Setelah kau membuat aplikasimu,
kau akan melihat berkas MainActivity.
Berkas MainActivity tersebut akan
memperpanjang dari AppCompatActivity.
Dalam versi Android Studio milikmu,
jika MainActivity
memperpanjang dari ActionBarActivity
itu bukan sebuah masalah.
Itu hanya versi lama
dari AppCompatActivity.
Dengan menghapus metode ini,
kita akan mundur kembali
di mana metode OnCreate
muncul di kelas AppCompatActivity.
Kehadiran metode ini mengatakan,
kami ingin perilaku yang berbeda
di MainActivity untuk metode OnCreate.
Jadi dengan menghapusnya
membawa kita kembali ke perilaku aslinya
di dalam Kelas AppCompatActivity.
Saat kau menjalankan aplikasi,
apa yang kauperhatikan berbeda
dibandingkan saat pertama kali
kau menjalankan aplikasinya?
Tulis jawabanmu dalam kotak teks ini.
ちょっとだけ JustJava アプリに戻りましょう
MainActivity クラスの
displayMessage メソッドを見ましょう
そのものはここから始まって
少し分かりやすく書いてあります
作りかけの変数 orderSummaryTextView が
あるのが分かりますね
この変数のデータ型は
TextView でした
ここの部分はまだ
理解していないんですけどね
次の行は TextView オブジェクトの
メソッドを呼んでいます
今回は上に書いてある変数名と
同じものを使います
なので orderSummaryTextView.setText を
呼びます
それから メソッドの入力として
文字列を渡します
この message という文字列は
元々は displayMessage メソッドの入力でした
ここで まだ理解していない
この部分を詳しく見ていきましょう
findViewById とあるのは
メソッド呼び出しのようです
これはカッコ囲みの
入力引数っぽい箇所の前にあるからです
しかし奇妙なことに このメソッドは
このクラス内のどこにも見当たりません
この名前をダブルクリックして
Command + F もしくは
Windows で Ctrl + F を押すと
ファイル内を検索できます
2つだけ findViewById を見つけました
2つとも同じように使われています
他に findViewById という
メソッドはないですね
そういえば 前に MainActivity クラスで
setContentView を呼び出す場面に
出会いましたが
ファイル内検索をしても今回同様
MainActivity 内には見つかりませんでした
では そのメソッド定義は
どこでしょうか?
まず MainActivity は
実はとても短いファイルです
たった約 90 行です
しかし 実はそこには目に見えない
より多くのクラスがあるのです
ここに extends AppCompatActivity を
呼んでいるコードがあります
これは MainActivity が
AppCompatActivity クラス内の
機能を拡張したものだという意味です
あなたの環境でここに ActionBarActibity と
あったとしても大丈夫です
バージョンが古いだけです
使うべき最新バージョンは
AppCompatActivity ですが
AppCompatActivity には―
古い Android デバイスをサポートする
後方互換性があります
AppCompatActivity は
Android サポートライブラリの一部です
それにより 古い Android デバイスを
使っていたとしても
最新のユーザーインターフェイスを使えます
AppCompatActivity クラスを
拡張することによって
MainActivity 内の
全ての機能 ステート メソッドを
ここからタダで手に入れることができます
AppCompatActivityから
コピー&ペーストする必要はありません
シンプルにクラスを拡張できます
興味があれば AppCompatActivity について
検索で探しましょう
AppCompatActivity クラスの
リファレンスがあります
Chrome 拡張機能を入れていれば
ソースも見られます
これが AppCompatActivity クラスが
定義されたコードです
多くの機能がここにあるのが
分かると思いますが
ここで言いたいのは
実装を理解する必要はありません
理解してもらいたいのは
AppCompatActivity を拡張したら―
全ての機能をタダで手に入れられる
ということです
高いレベルからは
このように視覚化できます
これは MainActivity の
クラス定義です
いくつかのメソッドの定義はここです
AppCompatActivity を拡張したら
このステートにアクセスしたり
AppCompatActivity の
メソッドにアクセスもできます
物理的に MainActivity クラスに
追加しているわけではありませんが
ここにあると考えてください
この中にあるステートもメソッドも
参照できますからね
以上が setContentView や
findViewById などを
どうやって参照しているかです
これらのメソッドは継承されているので
MainActivity の中で定義しません
MainActivity は実機上の
画面で表示されますが
MainActivity 内でそのコードは書いていません
同様に継承しているからです
ステートやメソッドを AppCompatActivity から
クラスに直接は持ってきませんが
それらがそこにあると分かりましたし
参照することも可能です
継承といえば 長所と短所があります
ある時は 動作をそのまま
継承したいでしょうし
別の時には
少し変えたいかもしれません
もし 継承したクラスから
いくつか動作を変えたいなら
メソッド上書きができます
@override をメソッドの最初に加えれば
AppCompatActivity 内のメソッドではなく
代わりにここに定義した方を使いたいのだと
コンピューターは理解します
これは難解ですし
たくさん経験しないと分かりません
実は 私たちは 既に
AppCompatActivity クラスから
上書きされたメソッドの例を見ています
onCreate メソッド がそれです
MainActivity 内で onCreate メソッドを
上書きすることで
メソッドが呼ばれたときに動いてほしい
自分たちの実装を具体的に指定してます
今すぐ理解できなくても心配しないでください
オブジェクト指向プログラミングの概念を
かいつまんで紹介しているだけです
このことについて
問題が喉に引っかかっていたり
全てを把握するには関連文献を
もっと読む必要があることは想定内です
クラス階層図を描いて―
MainActivity クラスと AppCompatActivity クラスの
関係を視覚化するやり方もあります
これはビュー階層図とは違います
ビュー階層図は 画面上のビューを
ツリー状で表しますが
クラス階層図は異なる Java クラス間の
関係性を示します
AppCompatActivity は
スーパークラスとなります
MainActivity は
AppCompatActivity から拡張したので
サブクラスだとみなされます
クラス定義を見る時はいつでも
拡張元は全てスーパークラスと呼ばれます
こちらがサブクラスになります
もし あなたが もう1つ―
DetailActivity なるものを作って
AppCompatActivity を拡張したなら
これがサブクラスになり
これはスーパークラスです
ここにもう1つ Java クラス継承の
例があります
ここでは TextView も
ImageView も Button も
全て共通要素を
持っていると思ってください
全てのビューは スクリーン上に
幅と高さを持ちます
まだ学んでいませんが
これらには可視性ステートもあるのです
これらは全て可視状態にも
不可視状態にもできるのです
他にもこれらに共通するものが
数プロパティあります
この TextView クラスにある
プロパティのコードを書き出して
ImageView や Button の
クラスにコピーする代わりに
もう少しスマートなやり方があります
まず View クラスを作って―
全てのビューに共通するプロパティを抜き出し
この View クラスの中に置きます
そうすればコードを書くのは一度で済みます
では どうやってこの
TextView クラスと View クラスの間に
つながりを作るのでしょうか?
継承を考えているのなら
その考えで合っています
TextView.java ファイルの中に
TextView クラスを定義します
こうして View クラスから
データとメソッドを全て継承します
すると この TextView クラスと
同じコードは入れなくてもよくなります
その機能の一部は 既に
View クラスの中にあるからです
同じことが ImageView など
下位のクラスにも言えます
コードをたくさん書く必要はありません
これらのファイルでは
ImageView.java と View.java を比べて
違う箇所のみを書けばよいのです
差分を明確にする意味では―
ImageView クラスには View と
違う部分だけが入ってなくてはなりません
もし View 内の特定の動作を
継承したくないなら
書き換えた動作を ImageView に書いたり
他のクラス内に書いたりできます
用語を復習しましょう
この場合 TextView はサブクラスで
View がスーパークラスです
TextView クラスの
ドキュメントに戻って
私たちは今 ここの部分を理解しました
TextView が View を拡張する とあります
今なら 意味が分かります
ステートとメソッドを
View クラスから継承している―
ということですね
ここにはクラス階層図があります
これは TextView クラスが View クラスから
継承されている ことを示しています
さらに View クラスは
Object クラスから継承しています
もっと探索すれば
他のクラスも発見できます
EditText クラスは TextView クラスから
拡張している といった具合に
これは動作を
TextView クラスから持ってきて
機能を少し加えたものです
つまり EditText は TextView から
拡張しています
TextView は View から拡張していて
View は Object から拡張してます
そして これがそのクラス階層図です
たくさんありますので
何時間でも見ていられますが
今回は TextView ドキュメントの
ページの紹介だけで ご勘弁を
ここからは setVisibility のメソッドを
ご紹介したいと思います
TextView クラス内に
setVisibility 用のメソッドがあります
これはビューの可視と不可視を
切り替えるものです
このメソッドをクリックすると
View クラスに飛びます
そして これはメソッドの説明です
TextView オブジェクトは setVisibility メソッドを
伴っているのが分かります
そして それは View クラスから
継承されたものです
この機能は View クラスから
タダで得たものです
さて 新しい概念をたくさん見てきましたね
これは通常ならコンピューター科学の
コースで 1学期間かけて行うものです
これから 少し練習をします
あなたにとって 点と点を
つなぐことになると良いのですが
しかし これらの概念を
完全に把握するには
より多くの時間と練習が必要なことは
知っておいてください
OK 最初の練習です
新たな Android アプリを作ってください
ここで JustJava アプリの
まとめをしておきましょう
作り終わったら
そのアプリを実行してください
アプリができたら
MainActivity ファイルを見てください
MainActivity ファイルは
AppCompatActivity から拡張しています
Android Studio のバージョンによっては
MainActivity が ActionBarActivity から
拡張しているかもしれませんが
それでも構いません
それは AppCompatActivity の
古いバージョンなだけです
MainActivity の onCreate メソッド上書きを
取り除きながら
AppCompatActivity クラスの onCreate の
挙動に戻りましょう
今 このメソッドがあるため
MainActivity 内では
onCreate メソッドは異なる挙動にしたい
となっています
なので これを取り除き
AppCompatActivity クラスにある
元の動作に戻してください
アプリを実行したら―
最初にアプリを実行した時と
何が違うか気づきましたか?
ここに答えを書きましょう
잠시 Just Java 앱으로 돌아가보죠
MainActivity 클래스
displayMessage 메소드를 봅시다
여기서 조금씩 더 이해되기 시작해요
우리는 이미 orderSummary
텍스트 뷰라는 변수를 만들었어요
이 변수의 데이터 종류는
텍스트 뷰입니다
우리는 아직 이 부분을
이해하지 못했어요
다음 줄에서, 이 텍스트 뷰
개체에서 메소드를 호출해요
우리는 여기 위에서 선언한
것과 같은 변수 이름을 사용해요
orderSummaryTextView.setText를
호출합니다
그리고 메소드의 입력값으로
문자열을 넘깁니다
이 문자열 메시지는 원래
메시지 메소드를 표시하는
입력 파라미터로 왔어요
이제 우리가 이해하지 못한
코드의 이 부분을 파헤쳐봅시다
findViewByld는 메소드
호출처럼 보이네요
입력 선언 처럼 보이는 것을 가진
이 괄호 뒤에 따라오기 때문이죠
하지만 이상하게도, 이 메소드는
이 클래스의 어디에서도 정의되지 않았죠
이 이름을 더블클릭하고
cmd+F를 누르거나
윈도우에서 ctrl+F를 누르면
이 파일에서 검색할 수 있어요
findViewByld 나타난
두 경우가 보이네요
그들은 비슷한 방법으로 쓰였고요
하지만 findVIewByld라는
메소드를 보이지 않아요
앞서 MainActivity 클래스에
있었던 것으로 얘기하자면
setContentView 호출을 봤죠
하지만 이걸 파일에서 찾으면
이 또한 MainActivity에
정의되지 않았어요
그럼 이 메소드들은 어디서 정의될까요?
MainActivity는 사실
꽤 짧은 파일입니다
90줄밖에 되지 않죠
하지만 클래스에는
눈에 보이는 것 이상이 있죠
코드는 AppCompatActivity를
상속하라고 말합니다
이것은 MainActivity가
AppCompatActivity의
기능의 상속이라는 뜻입니다
당신의 컴퓨터에 ActionBarActivity가
있어도 괜찮아요
이것의 더 오래된 버전이거든요
당신이 사용해야 할 최신 버전은
AppCompatActivity입니다
AppCompatActivity는
더 오래된 Android 기기에서
이전 호환성 지원을 해줍니다
AppCompatActivity는
Android 지원 라이브러리의 일부죠
이는 우리가 오래된
Android기기를 사용할 때도
Android의 최신 UI 기능을
사용하게 해줍니다
AppCompatActivity 클래스를
상속함으로써
우리는 여기
MainActivity 안에서
모든 기능, 모든 상태,
모든 메소드를 무료로 얻어요
우리는 여기서 코드를
복사하거나 붙여넣을 필요가 없죠
그저 그 클래스를 상속하기만 하면 되죠
관심이 있다면
AppCompatActivity의
정보를 구글에서 찾을 수 있어요
AppCompatActivity 클래스에
대한 참고 문서가 여기 있어요
전 Chrome 확장을 설치했으므로
소스를 볼 수 있습니다
이것은 AppCompatActivity
클래스가 정의된 코드입니다
여기 기능이 많은 걸 볼 수 있지만
중요한 것은 이것이 작동하는
방법을 이해하지 않아도 된다는 거죠
당신이 해야 할 일은 App
CompatActivity를 상속할 때
무료로 이 기능을 모두 얻는 겁니다
높은 단계에서 이것을
이렇게 가시화할 수 있어요
이것은 MainActivity의
클래스 정의입니다
여기 정의된 메소드가 좀 있다고 해요
AppCompatActivity를 상속하면
우리는 상태에 접근할 수 있고
AppCompatActivity의
메소드에도 접근할 수 있죠
그들은 물리적으로 메인 액티비티
클래스에 추가되지 않았지만
그들이 여기 있는 걸 상상할 수 있어요
여전히 그 상태와 메소드를
참조할 수 있기 때문이죠
우리 코드는 그렇게
setContentView나
findViewByld를 참조합니다
우리가 그 메소드를 물려받았기에
MainActivity에 그걸 정의하지 않아요
MainActivity는 기기
화면에 보이지만
우리는 그걸 물려 받았기 때문에
메인 액티비티 안에 그 코드를 쓰지 않죠
직접적으로 클래스 내
AppCompatActivity의
상태나 메소드를 갖고 있지 않지만
그들은 여기 있고 참조할 수 있어요
무언가 물려받는 것에는
좋은 점과 나쁜 점이 있어요
가끔 우리는 행동을 물려받지만
다른 때엔 그걸 약간
수정하고 싶을 거예요
물려받은 클래스의 행동을
바꾸고 싶다면
특정 메소드를 오버라이드해야 합니다
당신이 AppCompatActivity의
이 메소드 버전을 원하지 않는다는 걸
컴퓨터가 알 수 있도록 @override를
메소드의 상단에 추가할 수 있어요
하지만, 여기 정의한 메소드
버전을 원한다면요
그건 까다로운 주제이고
연습이 많이 필요해요
하지만 우리는
AppCompatActivity 클래스의
메소드 오버라이딩의 예를 봤어요
그 메소드는 onCreate입니다
onCreate 메소드를
메인 액티비티에서 오버라이딩하면
메소드르 호출했을 때 발생하는 것을
위한 실행을 특정지을 수 있습니다
이걸 바로 이해하지 못해도 걱정마세요
객체 지향 프로그래밍
개념 더미의 간략한 요약을
드리려고 했을 뿐입니다
당연히 아직 여러분에게
떠다니는 질문이 있을 겁니다
그걸 완전히 이해하려면
아직 이 주제에 대해서
더 읽어야 합니다
MainActivity와
AppCompatActivity 클래스의
관계를 가시화하는 방법은
클래스 계층 다이어그램을 그리는 거예요
이건 뷰 계층 다이어그램과 달라요
뷰 계층 다이어그램은 화면에
보여지는 뷰 나무를 보여주니까요
클래스 계층 다이어그램은
다른 Java 클래스들 간의
관계를 보여줍니다
슈퍼클래스로
AppCompatActivity가 있죠
MainActivity는 AppCompat
Activity로부터 상속받으므로
이건 서브클래스입니다
이 클래스 정의를 언제 보든
어떤 것이 슈퍼클래스로
정의되어 있든 간에요
이건 서브클래스입니다
DetailActivity라는
다른 액티비티를 만들고
AppCompatActivity를 상속하면
이것이 서브클래스가 되고
이것은 슈퍼클래스입니다
Java 클래스 상속의 다른 예가 있어요
이것에 대해 생각하면,
텍스트 뷰, 이미지 뷰, 버튼 뷰는
모두 그들에게 공통적인 면을 갖고 있죠
이 모든 뷰들은 화면에서
너비와 높이를 가집니다
아직 배우지 않았지만
그들은 가시 상태를 가집니다
그들은 보이거나 안 보이게 될 수 있죠
다른 속성들도 있는데요,
그것도 그들 사이에서 공통됩니다
텍스트 뷰 클래스 안에서
이 속성을 위해 코드를 쓰는 대신
이미지 뷰 전체로 이걸 복사하고
버튼 클래스에도 그렇게 해요
우린 좀 더 똑똑한 걸 해요
우린 뷰 클래스를 만들 수 있죠
이 뷰들에서 공통 속성을 추출해서
그걸 이 뷰 클래스 안에 넣으면,
코드는 한 번만 쓰이면 됩니다
그럼 텍스트 뷰 클래스와
뷰 클래스 사이의 연결은
어떻게 만들까요?
상속을 생각한다면, 맞습니다
TextView Java 파일에서
텍스트 뷰 클래스를 정의합니다
그렇게 뷰 클래스로부터
이 모든 데이터와 메소드를 상속합니다
그럼 TextView 클래스 안에
많은 코드를 갖지 않아도 되죠
기능의 일부가 이미
뷰 클래스 안에 쓰였기 때문이죠
이미지 뷰와 버튼 클래스에도
같은 방법이 적용됩니다
많은 코드를 사용하지 않아도 되죠
이 파일들에서, 우린 단지
View 클래스와 비교해서
ImageView의 다른 점을
쓰면 됩니다
이건 델타를 특정짓는 것이고
ImageView 클래스는
View 클래스와 비교해서 Image
View의 다른 점만 특정지으면 됩니다
View 클래스로부터 특정 행동을
상속하지 않고 싶다면
우린 그저 ImageView 클래스나
다른 클래스에서 업데이트 된 행동을
특정지으면 됩니다
이 경우, 용어를 상기시키자면
TextView는 서브클래스이고
View는 슈퍼클래스입니다
TextView 클래스에 대한
문서로 돌아가보면
이제 이 부분을 이해해요
TextView가
View를 상속한다고 하죠
이제 이것이 View 클래스로부터
상태와 메소드를 상속하는 것을
의미한다는 것을 압니다
여기 아래엔 클래스
계층 다이어그램이 있네요
TextView 클래스가
View 클래스로부터 상속받습니다
다음으로 뷰 클래스는
Object 클래스로부터 상속받고요
탐색해보면 다른
클래스도 찾을 수 있어요
TextView 클래스로부터
상속하는 EditText 같은 거요
이는 TextView 클래스의
행동을 받고
이에 더 특정한 기능을 추가해요
EditText는
TextView로부터 상속받죠
TextView는 View로부터,
View는 Object로부터요
이건 클래스 계층 다이어그램입니다
할게 더 많고
몇 시간 동안 이걸 볼 수 있어요
TextView 문서 페이지에서
한 가지를 보여드리죠
setVisibility 메소드를
보여드리고 싶어요
TextView 클래스 안의 Java
setVisibility 메소드예요
이건 뷰가 보일지 안 보일지를 정해요
이 메소드를 클릭하면
이 View 클래스로 데려다줍니다
이 메소드가 무엇을 하는지 서술했죠
TextView 개체가 setVisibility
메소드를 가지는 게 보이죠
하지만 이는 사실 View 클래스에서
상속받았습니다
View 클래스로부터
이 기능을 무료로 얻었죠
좋아요, 새 개념을 많이 다뤘죠
보통 이건 컴퓨터 과학 코스의
한 학기에 퍼져있습니다
우리는 이제 연습을 조금 해볼텐데
이것이 당신을 위한
선을 연결해주길 바라요
하지만 이 개념들을
완전히 습득할 때까지
더 많은 시간과 연습이 필요합니다
네, 첫 연습으로, 다른
새 Android 앱을 만드세요
Just Java 앱을
망치고 싶지 않으니까요
프로젝트를 만들어서 앱을 실행하세요
앱을 만들면 MainActivity
파일을 보게 될 겁니다
MainActivity 파일은 App
CompatActivity로부터 상속합니다
당신의 Android Studio 버전에서
MainActivity가
ActionBarActivity로부터
상속해도 괜찮습니다
그건 AppCompatActivity의
이전 버전이거든요
이 메소드 오버라이드를 삭제하여
onCreate 메소드가
AppCompatActivity 클래스에
나타나는 방식으로 돌아갈 겁니다
이 메소드의 존재는 우리가
onCreate를 위해
MainActivity의 다른 행동을
원한다고 말해줍니다
이걸 삭제하면 우리는
AppCompatActivity 클래스의
기존 행동을 다시 얻게 되죠
앱을 실행할 때
처음 실행한 앱과 비교해
어떤 다른 점을 발견했나요?
이 텍스트 박스에 답을 쓰세요
Vamos voltar à aplicação Just Java
por um momento.
Vejamos a classe MainActivity >
método displayMessage.
As coisas começam a fazer
um pouco mais de sentido aqui.
Já percebemos que estamos
tentando criar uma variável
chamada
orderSummaryTextView.
E o tipo de informação
desta variável é TextView.
Mas ainda não havíamos
entendido essa parte.
Na linha seguinte, ordenamos
um método a este objeto TextView.
Usamos o mesmo nome da variável
que foi declarada aqui em cima.
Para podermos chamá-la
orderSummaryTextView.setText.
Depois passamos um string
como entrada para o método.
Esta mensagem de string
chegou originalmente
com um parâmetro de entrada
do método displayMessage.
Vamos passar para esta parte
do código que ainda não entendemos.
Parece que findViewById
é uma ordem de método,
porque precede estes parêntesis
com o que parece ser
um argumento de entrada.
Mas o que é estranho
é que este método
não se encontra definido
em parte nenhuma da classe.
Se eu clicar duas vezes neste nome,
carregando em Command+F,
ou Control+F
se estiver em Windows,
podemos tentar fazer
uma procura neste arquivo.
Vejo apenas duas ocorrências
de findViewByID
e são usadas
de modos semelhantes.
Mas não vejo um método
que se chame findViewById.
A propósito, anteriormente,
na classe MainActivity,
viamos uma ordem para
setContentView.
Mas se a procurarmos no arquivo
também não se encontra
definida na MainActivity.
Então, onde estão definidos
estes métodos?
Na verdade, o MainActivity
é um arquivo bem pequeno.
Tem apenas cerca de 90 linhas.
Mas esta classe tem mais do que aparenta.
O código diz
extends.AppCompatActivity.
Isso significa que MainActivity
é uma extensão da funcionalidade
na classe AppCompatActivity.
No seu computador, se ao invés
aparece ActionBarActivity aqui,
não há problema pois trata-se
de uma versão mais antiga disto.
A versão mais recente que deve usar
é a AppCompatActivity.
Esta oferece suporte de compatibilidade
com versões anteriores
em aparelhos Android mais antigos.
A atividade AppCompatActivity faz parte
da biblioteca de suporte Android.
Permite-nos usar os mais recentes
atributos de UI da Android,
enquanto ainda trabalhamos
em aparelhos Android mais antigos.
Ao extender a classe
AppCompatActivity
obtemos todas as funcionalidades,
estados e métodos daqui,
de dentro da MainActivity,
gratuitamente.
Não temos de copiar/colar
qualquer código daqui.
Podemos apenas
extender essa classe.
Se desejar, pode encontrar mais informação
sobre AppCompatActivity no Google.
Aqui está o documento de referência
da lição sobre AppCompatActivity.
Visto que eu tenho a extensão do Chrome
instalada, posso ver a fonte também.
E este é o código segundo o qual
a lição sobre AppCompatActivity
se encontra definida.
Podemos ver que tem
muitas funcionalidades aqui.
Mas a mensagem principal
é que você não tem de saber
como elas são implementadas.
Tudo o que precisa saber
é que quando você
usa extend AppCompatActivity
obtém todas esta funcionalidade de graça.
Num nível superior,
pode visualizá-la do seguinte modo:
Esta é uma definição de classe
da MainActivity
e suponhamos que tem
alguns métodos definidos aqui.
Quando extendemos AppCompatActivity,
podemos acessar o estado e os métodos
da AppCompatActivity.
Eles não se encontram
fisicamente adicionados
à classe da MainAcitvity,
mas pode imaginar que eles estão lá,
porque ainda pode referenciar
o estado assim como os métodos.
E esta torre de código
pode referir-se a coisas como
ContentView ou findViewByID
porque herdamos esses métodos.
Não os definimos na MainActivity.
A MainActivity é exibida
como uma tela no aparelho.
Mas nós não escrevemos o código
para isso na MainActivity.
Também o herdamos.
Não temos o estado nem os métodos
da AppCompatActivity
diretamente na classe, mas agora
sabemos que estão lá
e podemos referenciá-los.
Falando em herdar,
há vantagens e desvantagens.
Podemos desejar herdar o comportamento
mas, por vezes, podemos querer
modificá-lo um pouco.
Se quiser modificar parte
do comportamento desta classe herdada,
pode sobrepor
alguns dos métodos.
Pode adicionar este @override
em cima de um método
para que o computador saiba
que você não quer a versão
do método de AppCompatActivity
e que quer antes a versão
que definiu aqui.
Este ponto é complicado
e requer muita prática.
Mas já vimos um exemplo
de sobreposição de um método
da classe AppCompatActivity.
e esse método é o onCreate.
Ao substituir o onCreate na MainActivity,
especificamos nossa própria implementação
para o que vai acontecer quando o método
for ordenado.
Não se preocupe se não entender logo.
Estou apenas dando um breve resumo
de várias noções de programação por objetos.
É perfeitamente normal
que ainda tenha perguntas
e necessite de ler mais um pouco
antes de os entender na totalidade.
Uma outra maneira de visualizar
a relação entre MainActivity
e as classes AppCompatActivity,
é desenhando um diagrama
com a hierarquia das classes.
É diferente de um diagrama
de hierarquia de views
porque esse mostra
uma árvore de views
que são mostradas na tela.
O diagrama de classes mostra a relação
entre as diferentes classes de Java.
Temos a AppCompatActivity
como uma superclasse.
Uma vez que a MainActivity estende
a partir da superclasse AppCompatActivity,
se denomina como subclasse.
Por isso, sempre que vir
esta definição de classe,
o que quer que você estenda
é conhecido como superclasse.
E esta seria a subclasse.
Assim, se criar outra atividade,
tal como a DetailActivity,
e estender a AppCompatActivity,
esta seria a subclasse
e esta a superclasse.
Vejamos outro exemplo
de herança de classes em Java.
Se pensar nisso, TextView,
ImageView e ButtonView,
todas contêm aspetos comuns.
Todas elas têm
uma largura e altura na tela.
Ainda não aprendemos isso,
mas também têm um estado de visibilidade.
De modo a poderem ser definidas
como visíveis ou invisíveis.
Existem outras propriedades também,
comuns entre elas.
Em vez de escrever o código
para estas propriedades
na classe TextView e depois
copiá-lo para as classes
ImageView e ButtonView,
podemos fazer algo mais inteligente.
Podemos criar uma classe View.
Podemos extrair as propriedades comuns
de todas estas vistas,
e depois colocá-las
dentro desta classe View.
Assim, o código
só tem de ser escrito uma vez.
Mas como fazemos a ligação
entre a classe TextView e a classe View?
Se está pensando em herança,
então você está certo.
No arquivo Java TextView
vamos definir uma classe TextView.
Assim, herdaremos o estado
e os métodos da classe View.
E assim, não teremos tanto código
na classe TextView
porque parte da funcionalidade
já se encontra escrita na classe View.
O mesmo se aplica para as classes
ImageView e ButtonView.
Não temos de escrever
todo esse código.
Nesses arquivos, só temos de escrever
o que é diferente na ImageView
quando comparada
com a classe View.
Eu vejo isto com especificar um Delta.
Assim, a classe ImageView
só tem de especificar
o que tem de diferente quando comparada
com a classe View.
Se não quisermos herdar alguns
dos comportamentos da classe View,
podemos simplesmente especificar
o novo comportamento da classe ImageView
ou de qualquer outra dessas classes.
E relembrando a terminologia,
aqui a TextView seria a subclasse
e View seria a superclasse.
Se voltarmos ao documento
relativo à lição sobre TextView,
já entenderemos esta parte.
Diz, TextView extends View.
Agora sabemos que significa que estamos
herdando estado e métodos da classe View.
E aqui temos um diagrama
com a hierarquia de classes.
Mostra que a classe TextView
está herdando da classe View.
E, por sua vez, a classe View
está herdando da classe Objeto.
Se continuar explorando,
encontrará outras classes.
Tal como a classe EditText,
que estende da classe TextView.
Por isso, herda o comportamento
da classe TextView, para além
de adicionar-lhe
outras funcionalidades.
Assim, EditText estende de TextView
e TextView estende de View
e View estende de Objet. E este
é o diagrama de hierarquia de classes.
Pode continuar a explorar
durante horas, mas primeiro
vou mostar algo da página
da documentação sobre o TextView.
Quero mostrar o método
para definir a visibilidade.
Aqui está o método Java para definir
visibilidade na classe TextView.
Isto permite alterar se a vista
fica visível ou não.
Se eu clicar nesse método,
ele me leva até à classe View.
E depois descreve
o que o método faz.
Pode ver que um objeto TextView
tem um método para definir a visibilidade
mas este foi herdado da classe View.
Por isso, obtemos esta funcionalidade
gratuitamente a partir da classe View.
Acabamos de ver uma série
de conceitos novos.
Geralmente, estes estariam distribuídos
ao longo de um semestre
de um curso de Ciências da Computação.
Vamos praticar um pouco
e eu espero que as coisas
comecem a ficar
mais claras para você.
Mas saiba que levará mais tempo
e prática até conseguir dominar
todos estes conceitos.
No primeiro exercício,
quero que você crie
um novo aplicativo para Android,
porque não queremos estragar
o aplicativo Just Java.
Depois de criar o projeto,
rode o aplicativo.
Depois de criar o aplicativo,
verá um arquivo MainActivity.
O arquivo MainActivity estenderá
a partir de AppCompatActivity.
Se na sua versão do Android Studio,
MainActivity estende de ActionBarActivity,
não há problema pois trata-se
apenas de uma versão mais antiga.
Ao remover este método Override,
vamos voltar para o modo
como o método OnCreate aparecia
na classe AppCompatActivity.
A presença deste método indica
que queremos um comportamento diferente
na MainActivity+ para o método Oncreate.
Por isso, ao removê-lo,
voltamos ao comportamento original
da classe AppCompatActivity.
Quando correr a aplicação,
quais as diferenças em comparação
com a primeira vez
em que correu a aplicação?
Escreva sua resposta nesta caixa.
Давайте вернемся к приложению JustJava.
Обратите внимание на класс MainActivity,
метод displayMessage.
Теперь все становится немного понятнее.
Мы уже установили, что создаем переменную
под названием orderSummaryTextView,
а тип данных для этой переменной
называется TextView.
Однако мы пока не разобрались
с этой частью.
На следующей строке мы вызываем метод для
этого объекта text view.
Мы используем то же название
переменной, что и здесь:
так, мы вызываем
orderSummaryTextView точка setText.
Затем следует строка
со входными данными для метода.
Сообщение в этой строке изначально служило
входным параметром
метода displayMessage.
А теперь давайте разберем эту часть кода,
которая для нас пока непонятна.
Судя по всему, findViewById —
это все-таки вызов метода:
он располагается перед частью в скобках,
которая похожа на входной аргумент.
Однако очень странно, что этот метод
нигде не определен в данном классе.
Если дважды кликнуть это название,
а затем нажать command F или
control F, если у вас Windows,
то можно выполнить поиск по этому файлу.
Нашлось только два совпадения
с findViewById.
В обоих случаях
они используются одинаково.
Однако я не вижу ни одного метода
под названием findViewById.
К слову, ранее в классе MainActivity
можно увидеть вызов setContentView,
и если выполнить аналогичный поиск
в файле, метод также не будет
определен в MainActivity.
Так где же определены эти методы?
Вообще, MainActivity —
довольно маленький файл:
в нем всего 90 строк, но на самом деле
он длиннее, чем видно с первого взгляда.
В коде написано расширение
AppCompatActivity,
это значит, что MainActivity —
это расширение
функциональности класса AppCompatActivity.
Если на вашем компьютере вы
видите ActionBarActivity,
ничего страшного —
это всего лишь более старая версия.
В последней версии, что вы используете,
метод называется AppCompatActivity.
AppCompatActivity обеспечивает
обратную совместимость
с более старыми устройствами Android.
AppCompatActivity — это часть
библиотек Android Support.
Она позволяет использовать
последние функции UI на Android
и одновременно поддерживает
более старые устройства Android.
За счет расширения
класса AppCompatActivity
мы бесплатно получаем всю функциональность
состояний и методов отсюда.
Внутри класса MainActivity
не нужно копировать
и вставлять код отсюда.
Можно просто расширить этот класс.
Если вам интересно,
можно найти больше информации об
AppCompatActivity в Google.
Вот поисковый массив для этого класса
класса AppCompatActivity
Поскольку у меня установлено
расширение Chrome,
я также могу видеть исходный код.
А вот часть кода, где определен класс
AppCompatActivity.
Вы видите, что здесь множество
функциональности, но самое главное:
вам не нужно понимать,
как она реализована.
Все, что вам нужно знать: когда вы
расширяете класс AppCompatActivity,
вы получаете всю эту функциональность
бесплатно.
На высоком уровне
это можно визуализировать так.
Это определение класса для Main Activity.
А методы определены вот здесь.
При расширении AppCompatActivity мы
получаем доступ к состояниям
и методам AppCompatActivity.
Сейчас они физически не добавлены
к классу MainActivity,
но понятно, что они там находятся,
поскольку вы можете сослаться
на состояние и методы тоже.
А вот так код может ссылаться
на такие методы, как setContentView
или findViewById,
потому что мы унаследовали эти методы.
Мы не определяли их в MainActivity.
Класс MainActivity показан
как экран на устройстве,
но мы и этот код не прописывали
в MainActivity. Мы его тоже унаследовали.
У нас в классе нет состояний и методов
напрямую из AppCompatActivity,
однако теперь мы знаем, что они тут,
и можем на них ссылаться.
При использовании наследования
есть плюсы и минусы.
Иногда хочется унаследовать поведение,
но в ряде случаев может потребоваться
слегка его изменить.
Если вы хотите изменить
поведение из унаследованного класса,
вы можете переопределить нужные методы.
Добавьте текст @override над методом,
чтобы компьютер понимал,
что вам не нужна версия метода
из AppCompatActivity,
а нужна данная версия, которую
вы определили вот здесь.
Это сложная тема, которая требует
практики,
тем не менее мы уже видели пример
переопределения метода
из класса AppCompatActivity,
и это метод onСreate.
Используя переопределение
метода onСreate в MainActivity,
мы указываем собственную реализацию того,
что должно произойти по вызову метода.
Не беспокойтесь, если вы
сразу всего не понимаете.
Я просто даю вам краткий обзор
некоторых понятий
объектно-ориентированного
программирования.
Совершенно понятно,
что у вас останутся вопросы и
вам потребуется больше информации
по этим темам
для полного понимания.
Другой способ показать
взаимосвязь между классами
MainActivity и AppCompatActivity —
построить диаграмму иерархии классов.
Она отличается от диаграммы иерархии
видов view, так как диаграмма иерархии
видов view показывает дерево видов
view, которые отображаются на экране.
Диаграмма иерархии классов
показывает взаимоотношение
между разными Java-классами.
AppCompatActivity — это суперкласс,
Начинается с AppCompatActivity
из AppCompactActivity.
и называется подклассом.
Итак, когда вы видите определение
этого класса, то, что вы расширяете,
называется суперклассом,
а вот это будет подклассом.
Так, если вы создадите другой класс
под названием DetailActivity
и расширите AppCompatActivity,
это будет подклассом,
а это суперклассом.
А вот еще один пример
унаследования Java-класса.
Если подумать, и TextView, и ImageView,
и ButtonView обладают общими свойствами.
У них всех есть ширина и высота на экране.
Мы еще об этом не говорили, но
у них также есть состояние видимости,
Их можно сделать невидимыми или видимыми.
Есть еще ряд других свойств,
общих для них всех.
Вместо того чтобы писать код
для этих свойств в TextView,
а затем копировать его в ImageView
и класс Button,
можно сделать кое-что поумнее.
Можно создать класс View,
экспортировать общие свойства
для всех видов views, а затем
поместить их внутрь этого класса View.
Таким образом,
код нужно будет написать всего один раз.
Но теперь как нам соединить TextView
и класс View?
Если вы подумали о наследовании, вы правы.
В java-файле TextView мы определим класс,
так мы унаследуем все состояния
и методы из класса View,
и нам не потребуется писать
много кода для класса TextView,
так как часть их функциональности
уже обозначена в классе View.
То же самое применимо к классам ImageView
и button.
Нам не нужно писать много кода,
в этих файлах потребуется
лишь указать разницу
в ImageView по сравнению с классом View.
Я определяю это как обозначение различий.
Итак, в классе ImageView нужно
указать только то, что отличается
от ImageView по сравнению с классом View.
Если вы не хотите наследовать
определенное поведение из класса View,
можно просто указать новое
поведение внутри класса ImageView
или в любом из этих классов.
Возвращаясь к терминологии,
в данном примере
TextView будет подклассом,
а View — суперклассом.
Если снова обратиться к документации по
классу TextView,
теперь нам понятна эта часть.
В ней говорится,
что TextView расширяет View.
Теперь мы знаем, что это означает:
мы наследуем состояние
и методы из класса View,
а ниже диаграмма иерархии классов,
которая показывает, что класс TextView
наследует класс View.
А класс View в свою очередь
наследует класс Object.
Если изучить код,
можно найти другие классы,
например класс EditText, который
фактически расширяет класс TextView.
Он берет поведение из класса TextView
и добавляет к нему
специфичную функциональность.
Так, EditText расширяет TextView,
TextView расширяет View,
а View расширяет Object.
А вот здесь
показана диаграмма иерархии классов.
Деталей очень много,
и можно разбираться в них часами,
но я хочу показать вам одну вещь
на странице документации TextView.
Я хочу познакомить вас с методом
SetVisibility.
Вот Java-метод для установки
видимости внутри класса TextView,
эта часть меняется в зависимости
от того, видим view или нет.
Если кликнуть на этот метод,
я перейду к классу view,
а затем идет описание того,
что этот метод делает.
Вы видите, что у TextView object есть
метод SetVisibility,
но по сути он был унаследован
из класса View.
Так мы получили функциональность
бесплатно из класса View.
Хорошо, мы только что ознакомились
с множеством новых понятий.
Обычно изучение данного материала занимает
целый семестр курса компьютерных наук.
Давайте теперь немного попрактикуемся, и,
я надеюсь, вы сможете
составить для себя полную картину.
Но учтите, что потребуется
гораздо больше времени и
практики, прежде чем вы полностью
разберетесь в этих понятиях.
Так, в этом упражнении вы должны
будете создать новое приложение Android,
потому что мы не хотим
испортить приложение JustJava.
Сначала создайте проект,
потом запустите приложение.
Когда вы создадите приложение, вы увидите
файл MainActivity.
Этот файл MainActivity будет унаследован
из AppCompactActivity.
Если в вашей версии Android Studio
вместо этого MainActivity
наследуется из ActionBarActivity,
все нормально:
это просто более старая версия
AppCompactActivity.
Удалив этот метод переопределения,
мы вернемся к тому,
как метод onСreate появился
в классе AppCompactActivity.
Наличие этого метода говорит о том,
что нам нужно
другое поведение в MainActivity
для метода onCreate.
То есть его удаление приводит
к восстановлению исходного поведения
класса AppCompatActivity.
После запуска приложения
обратите внимание на то, что изменилось
по сравнению с первым запуском приложения.
Запишите свой ответ в тетради.
JustJava uygulamasına geri dönelim.
MainActivity sınıfı içeresindeki
DisplayMessage metotuna bir göz atalım.
Her şey daha anlaşılır bir hal
almaya başlıyor artık.
Zaten orderSummaryTextView adında bir
değişken oluşturduğumuzu biliyoruz.
Bu görünümün veri
türü de TextView'di.
Bu kısmı henüz anlayamadık ama.
Bir sonraki satırda, bu TextView
öğesine bir metot çağırıyoruz.
Yukarıda belirtilen aynı
değişkeni kullanıyoruz.
Yani, orderSummaryTextView.setText'i
çağırıyoruz.
Daha sonra da metot için giriş
olarak bir string gireceğiz.
Bu string mesajı, aslen
görüntüleme mesajı metotuna
bir giriş parametresi olarak geldi.
Şimdi de kodun henüz
anlamadığımız bu kısmını irdeleyelim.
Görünüşe göre FindViewById
bir metot çağrısı.
Çünkü bu parantezler arasındaki giriş
parametresi gibi gözüken kısmın önünde.
Fakat ilginç olan, bu metotun sınıfın
hiçbir yerinde tanımlanmamış olması.
Bu isme iki kere tıklayıp Command+F
tuşlarına basarsam veya
Windows üzerinde iseniz Ctrl+F, o zaman
bu dosya içinde arama yapabilirim.
findViewById olan sadece
iki sonuç görüyorum ve
ikisi de benzer
şekillerde kullanılmış.
Fakat findViewById'i çağıran
başka bir metot görmüyorum.
Hazır lafı açılmışken, dana önceden
MainActivity sınıfında
setContentView'e bir çağrı görmüştük,
fakat bu dosya içinde
arama yaparsanız, o da
MainActivity'de tanımlanmamış.
Peki, bu yöntemler
nerede tanımlanmış?
MainActivity aslında
oldukça kısa bir dosya.
Sadece 90 satır uzunluğunda,
ama bu sınıfta
göründüğünden fazlası var.
Kodda extends AppCompatActivity yazıyor.
Bu da MainActivity'nin
AppCompatActivity sınıfındaki
bir işlevselliğin uzantısı
olduğu anlamına geliyor.
Bilgisayarınızda bir işlem çubuğu
hareketi görürseniz, önemli değil,
sadece bunun eski bir
sürümü olduğu içindir.
Kullanmanız gereken en son
sürüm ise AppCompatActivity.
Ayrıca AppCompatActivity, eski
Android cihazlarda bize geriye dönük
uyumluluk desteği de veriyor.
AppCompatActivity, Android
destek kütüphanesinin bir parçası.
Hala eski Android cihazlar üzerinde
çalışırken Android üzerindeki en son
kullanıcı arabirimini
kullanmamıza olanak sağlıyor.
AppCompatActivity
sınıfını genişleterek,
bedavaya MainActivity
içinden bütün işlevselliğe,
bütün durum
ve metotlara ulaşabiliyoruz.
Buradan herhangi bir kodu
kopyalayıp yapıştırmamıza gerek yok.
Sadece sınıfı genişletmemiz yeterli.
Eğer ilgileniyorsanız,
AppCompatActivity'i Google'da arayarak
daha fazla bilgiye ulaşabilirsiniz.
İşte AppCompatActivity sınıfı
için bir referans belgesi.
Chrome uzantısı bende yüklü olduğundan
kaynağı da görebiliyorum.
Ve bu da AppCompatActivity
sınıfının tanımlandığı yer.
Burada bir çok işlevsellik
olduğunu görebilirsiniz, fakat
kilit mesaj, nasıl uygulandığını
anlamak zorunda değilsiniz.
Tek bilmeniz gereken,
AppCompatActivity'i genişlettiğinizde
bütün bu işlevselliklere
bedavaya sahip olacak olmanız.
Yüksek seviyede şu
şekilde görselleştirebilirsiniz.
Bu, MainActivity için bir sınıf tanımı.
Ve diyelim ki, burada
tanımlanmış bazı metotlarınız var.
AppCompatActivity'i genişlettiğiniz
zaman, AppCompatActivity'den
durum ve metotlara ulaşabilirsiniz.
MainActivity sınıfına fiziksel
olarak eklenmiş değiller tabii ki, fakat
orada olduklarını düşünebilirsiniz,
çünkü hala duruma ve
metotlara gönderim yapabilirsiniz.
İşte kodumuz da setContentView veya
findViewById tarzı şeylere böyle
gönderim yapabiliyor.
O metotları devraldığımız için
MainActivity içinde tanımlamadık.
MainActivity cihaz üzerinde bir ekran
olarak gösteriliyor, fakat
MainActivity için o kodu
biz yazmadık, devraldık.
Durum ve metotlara direkt sınıf içindeki
AppCompatActivity'den sahip değiliz,
fakat artık orada olduklarını ve onlara
gönderim yapabileceğimizi biliyoruz.
Devralmaktan konu açılmışken, bunun
hem iyi hem de kötü yanları var.
Bazen bir davranışı
devralmak isteriz fakat
diğer zamanlarda biraz da
olsa değiştirmek isteyebiliriz.
Bu devralınmış sınıftan bazı
davranışları değiştirmek isterseniz
belirli metotları
geçersiz kılabilirsiniz.
Bu @override metnini metotun üzerine
ekleyebilirsiniz, böylece bilgisayar
AppCompatActivity'nin o sürümünü
istemediğinizi
fakat onun yerine buradaki tanımladığınız
sürümü istediğinizi bilecektir.
Bu zor bir konu ve çok
fazla pratik gerektiriyor.
Fakat AppCompatActivity
sınıfından bir metotu
geçersiz kılmayla ilgili
bir örnek gördük.
Ve bu metot da onCreate metotu.
MainActivity içindeki onCreate metotunu
geçersiz kılarak, o metotu çağırdığımızda
ne yapılması gerektiğini söyleyen kendi
uyarlamamızı tanımlamış oluyoruz.
Bu kısmı tam anlayamadıysanız
endişelenmeyin.
Size sadece, bir kaç tane nesne yönelimli
programlama kavramlarıyla ilgili
özet bilgiler veriyorum.
Aklınızda hala cevap bekleyen
sorular olması oldukça normal.
Ve hala bu konuları tamamen
anlamak için daha fazla
okumanız gerektiği.
MainActivity ile AppCompatActivity
sınıfları arasındaki ilişkiyi
görselleştirmenin bir diğer yolu da
sınıf hiyerarşi şeması çizmek.
Bu, görünüm hiyerarşi şeması
çizmekten farklı, çünkü
görünüm hiyerarşi şeması ekranda
görüntülenen görünümleri gösterir.
Sınıf hiyerarşi şeması
ise farklı Java sınıfları
arasındaki ilişkiyi gösterir.
Üst sınıf olarak elimizde
AppCompatActivity var.
MainActivity, AppCompatActivity'den
genişlediği için
alt sınıf olarak tanımlanıyor.
Bu sınıf tanımını ne zaman görürseniz,
genişlettiğiniz her ne ise o
üst sınıf olarak tanımlanır.
Bu da alt sınıf olacaktır.
Yani, DetailActivity adında başka
bir etkinlik oluşturursanız ve
AppCompatActivity'i genişletmişseniz,
bu alt sınıf olur
ve bu da üst sınıf.
Java sınıf devralmasıyla
ilgili işte bir örnek daha.
Şöyle bir düşündüğünüzde,
TextView, ImageView
ve ButtonView'in hepsinin
ortak yanları var.
Bütün bu görünümlerin ekranda
bir eni ve boyu mevcut.
Bu kısmı henüz öğrenmedik ancak
bir de görünebilirlik durumları var.
Yani hepsi görünmez veya
görünür hale getirilebilir.
Hepsi için ortak olan
başka özellikleri de var.
TextView sınıfı içinde bunlar
için kod yazıp ImageView ve
Button sınıfı üzerine
kopyalamak yerine
daha zekice bir şey yapabiliriz.
Bir View (görünüm) sınıfı oluşturabiliriz.
Bu üç görünüm için ortak olan özellikleri
çıkartabiliriz ve sonra da bu View
sınıfının içine yerleştirebiliriz, böylece
kodu bir kez yazmamız yeterli olacaktır.
Fakat, sonra TextView sınıfı ile
View sınıfı arasında nasıl
bağ kuracağız?
Eğer devralmayı düşünüyorsanız,
doğru bildiniz.
TextView java dosyasında
TextView sınıfını tanımlayacağız.
Bu sayede bütün bu verileri ve metotları
View sınıfından alabileceğiz.
Sonra TextView sınıfında bu kadar
çok kod olmasına gerek kalmayacak,
çünkü işlevselliğin bir kısmı
zaten View sınıfında yazılı durumda.
Aynı şey ImageView ve
Button sınıfları için de geçerli,
bu kadar kod yazmak
zorunda değiliz.
Bu dosyalarda, sadece
View sınıfı ile ImageView
arasındaki farklı olan
şeyleri yazmamız yeterli.
Ben bunu bir aralık belirleme olarak
görüyorum. Yani ImageView sınıfı,
View sınıfı ile karşılaştırıldığında,
sadece farklı olan şeyleri tanımlamalı.
Eğer ki View sınıfından bazı belli
davranışları devralmak istemiyorsak,
ImageView sınıfındaki ya da diğer
sınıflardaki güncellenmiş davranışları
belirtebiliriz.
Bu noktada, terminolojiyi
size hatırlatmak adına;
TextView alt sınıf oluyor
ve View de üst sınıf.
Tekrardan, TextView sınıfı için
belgelendirmeye döndüğümüzde
artık bu kısmı
anlayabilecek durumdayız.
TextView için View'i
genişlettiği yazıyor.
Bunun, View sınıfından metot
ve durum devraldığımız
anlamına geldiğini artık biliyoruz.
Ve burada da sınıf
hiyerarşi şeması var.
TextView sınıfının View
sınıfından devraldığını gösteriyor.
Ve sırayla, View sınıfı
Object sınıfından devralıyor.
Biraz incelerseniz, aslında
TextView'den genişleyen
EditText sınıfı gibi diğer
sınıfları bulabilirsiniz.
Yani, davranışı TextView
sınıfından alıyor ve
ona belirli bir işlevsellik ekliyor.
Böylece EditText,
TextView'den genişlemiş oluyor.
Ve TextView de View'den genişliyor,
ve View de Object'den genişliyor.
İşte sınıf hiyerarşisi şeması da bu.
Bir sürü şey var ve
saatlerce buna bakabilirsiniz.
Fakat ben size TextView belgelendirme
sayfasında tek bir şey göstereceğim.
SetVisibility için metotu
göstermek istiyorum.
İşte TextView sınıfı içinde
SetVisibility için Java metotu bu.
Görünümün görünebilir
olup olmayacağını belirliyor.
Eğer bu metota tıklarsam,
beni View sınıfına götürür.
Ve sonra da metotun
ne işe yaradığını açıklıyor.
Bu sayede bir TextView nesnesinin
görünebilirlik metotunun olduğunu,
fakat aslında View sınıfından
devraldığını görebilirsiniz.
Yani, bu işlevselliği View
sınıfından bedavaya almışız.
Pekala, bir ton yeni
kavramı ele aldık.
Normalde bu, bilgisayar bilimi
kursunda bir döneme yayılır.
Şimdi biraz alıştırma yapacağız ve
umuyorum ki sizin için
aradaki boşlukları doldurur.
Fakat unutmayın ki, bu kavramları
tamamen anlamanız çok daha
fazla zamanınızı alacak ve daha çok
pratik yapmanız gerekecek.
Peki, ilk alıştırma; yeni bir Android
uygulaması geliştirmenizi istiyorum,
çünkü Just Java uygulamasını
bozmak istemeyiz.
Projeyi oluşturduktan sonra,
uygulamayı çalıştırın.
Uygulamanızı geliştirdiğiniz de,
bir MainActivity dosyası göreceksiniz.
Bu MainActivity dosyası
AppCompatActivity'den genişleyecek.
Bunun yerine, Android Studio'su
sürümünüzde eğer MainActivity,
ActionBarActivity'den
genişliyorsa, o da olur.
Zaten AppCompatActivity'nin
sadece eski bir sürümü.
Bu geçersiz kılma metotunu
kaldırarak, onCreate metotunun
AppCompatActivity'de göründüğü
haline dönmüş olacağız.
Bu metotun olması MainActivity'de onCreate
için farklı bir davranış istediğimiz
anlamına geliyor.
Yani, onu kaldırmak bizi
AppCompatActivity sınıfındaki
orijinal davranışa geri döndürecek.
Uygulamayı çalıştırdığınızda,
ilk seferki çalıştırmanızdan
farklı bir şeyler fark ettiniz mi?
Cevabınızı bu metin kutusuna yazın.
Quay lại ứng dụng JustJava một chút.
Xem lớp MainActivity,
phương thức displayMessage.
Mọi thứ bắt đầu rõ ràng hơn
một chút ở đây.
Chúng ta thấy là đã có một biến
tên là orderSummaryTextView.
Kiểu dữ liệu của biến này là TextView.
Nhưng chúng ta vẫn chưa hiểu phần này.
Ở dòng tiếp theo, ta gọi một
Phương thức cho đối tượng TextView này.
Ta dùng cùng một tên biến
như đã khai báo trên này.
Ta gọi orderSummaryTextView.setText.
Rồi đặt một chuỗi làm đầu vào
cho Phương thức này.
Chuỗi thông điệp này vốn là
một tham số đầu vào
cho Phương thức displayMessage.
Giờ hãy xem kỹ phần mã này,
chỗ chúng ta còn chưa hiểu.
Có vẻ findViewById
là một lệnh gọi Phương thức.
Vì nó nằm trước các ngoặc đơn này với
tóm tắt giá trị đầu vào.
Nhưng kỳ lạ là Phương thức này không
được định nghĩa ở chỗ nào trong Lớp.
Nếu tôi nhấp đôi vào tên này
và nhấn Cmd F, hoặc
Ctrl F nếu bạn dùng Windows,
ta có thể thử tìm trong file này.
Tôi chỉ thấy hai sự kiện
có findViewById, và
chúng được dùng tương tự nhau.
Nhưng tôi không thấy Phương thức nào
tên là findViewById.
Nói đến chuyện này,
trước đây trong lớp MainActivity,
ta cũng thấy một lệnh gọi
setContentView, nhưng nếu tìm kiếm
trong file, thì nó cũng không được
định nghĩa trong MainActivity.
Vậy những Phương thức này
được định nghĩa ở đâu?
MainActivity thật ra là
một file rất ngắn.
Nó chỉ có khoảng 90 dòng,
nhưng thật ra trong Lớp này
còn có nhiều hơn thế.
Phần mã nói rằng,
mở rộng AppCompatActivity.
Điều này tức là MainActivity
là phần mở rộng
của phần chức năng
trong lớp AppCompatActivity.
Trên máy tính, nếu bạn thấy
ActionBarActivity ở đây thì không sao,
đó chỉ là một phiên bản cũ hơn.
Phiên bản mới nhất bạn nên dùng
là AppCompatActivity.
AppCompatActivity hỗ trợ
tương thích ngược cho chúng ta
trên các thiết bị Android cũ hơn.
AppCompatActivity là một phần của
thư viện hỗ trợ Android.
Nó cho phép ta dùng những tính năng
giao diện mới nhất của Android,
trong khi vẫn làm việc
trên các thiết bị Android cũ hơn.
Bằng cách mở rộng
lớp AppCompatActivity.
Chúng ta có tất cả tính năng,
tất cả trạng thái và
các Phương thức trong MainActivity
một cách miễn phí.
Ta không phải sao chép và
dán dòng mã nào từ đây.
Chúng ta chỉ đơn giản là
mở rộng Lớp này.
Nếu bạn thích,
có thể tìm hêm thông tin về
AppCompatActivity bằng Google.
Đây là tài liệu tham khảo
cho lớp AppCompatActivity.
Vì tôi có tiện ích mở rộng
được cài sẵn trên Chrome,
tôi có thể xem được mã nguồn.
Và đây là phần mã chỗ
lớp AppCompatActivity được định nghĩa.
Bạn có thể thấy
rất nhiều tính năng ở đây,
vấn đề là bạn không cần hiểu
chúng thực hiện như thế nào.
Bạn chỉ cần biết là
khi mở rộng AppCompatActivity,
bạn có tất cả
những tính năng này miễn phí.
Ở cấp độ cao, bạn có thể
hình tượng hóa thế này.
Đây là định nghĩa Lớp
cho MainActivity.
Và có vài Phương thức
được định nghĩa ở đây.
Khi bạn mở rộng AppCompatActivity,
ta có thể truy cập các trạng thái
và các Phương thức từ AppCompatActivity.
Giờ chúng chưa được tự thêm vào
lớp MainActivity, nhưng
bạn có thể hình dung là
chúng có ở đó,
vì bạn vẫn có thể tham chiếu
các trạng thái và phương thức.
Và đó là cách đoạn mã của ta có thể
chỉ tới những thứ như setContentView
hoặc findViewById.
Vì thừa hưởng các Phương thức này, ta không
thể định nghĩa chúng trong MainActivity.
MainActivity được trình diễn
trên màn hình của thiết bị, nhưng
chúng ta không viết mã đó trong
MainActivity, mà thừa hưởng chúng.
Ta không có trạng thái và phương thức
trực tiếp từ lớp AppCompatActivity,
nhưng giờ ta đã biết rằng
chúng ở đó và ta có thể chỉ dẫn đến.
Nói về những thứ được thừa hưởng,
trong việc này có cả mặt tốt và xấu.
Đôi khi ta sẽ muốn
thừa hưởng hành vi, nhưng
có lần khác ta lại chỉ muốn
chỉnh sửa một chút.
Nếu bạn muốn thay đổi vài hành vi
từ Lớp được thừa hưởng,
bạn có thể ghi đè lên
một số Phương thức nhất định.
Bạn có thể thêm chữ @override ở trên cùng
của Phương thức để máy tính biết rằng
bạn không muốn dùng phiên bản của
Phương thức từ lớp AppCompatActivity.
Thay vào đó, bạn muốn
tự định nghĩa phương thức này ở đây.
Đây là một chủ đề về mẹo,
và cần thực hành nhiều.
Nhưng ta đã xem một ví dụ về
ghi đè một Phương thức
từ lớp AppCompatActivity.
Và Phương thức đó là OnCreate.
Bằng cách ghi đè phương thức OnCreate
trong MainActivity, chúng ta chỉ rõ
những gì cần thực hiện khi
Phương thức đó được gọi.
Đừng lo nếu bạn không hiểu chỗ này ngay.
Tôi chỉ cho bạn một tóm tắt khái quát
về các khái niệm của
lập trình hướng đối tượng.
Tôi cũng mong rằng các bạn
vẫn còn nhiều câu hỏi.
Và vẫn cần đọc thêm những chủ đề này
để hiểu chúng
một cách đầy đủ.
Một cách khác để hình tượng hóa
quan hệ giữa các lớp MainActivity
và AppCompatActivity là vẽ
Sơ đồ Hệ thống Lớp.
Cái này khác với Sơ đồ Hệ thống Xem, vì
Sơ đồ Hệ thống Xem thể hiện một cây
những cảnh được thể hiện trên màn hình.
Sơ đồ Hệ thống Lớp
cho thấy mối quan hệ
giữa các lớp Java khác nhau.
Chúng ta có AppCompatActivity
là Siêu lớp.
Vì MainActivity mở rộng từ
AppCompatActivity,
nên nó là Phân lớp.
Nên khi nào bạn thấy định nghĩa lớp này
thì cái gốc mà nó mở rộng
được gọi là Siêu lớp.
Đây là Phân lớp.
Nếu bạn tạo thêm một activity khác
tên là DetailActivity và
bạn mở rộng AppCompatActivity,
nó sẽ là Phân lớp,
và đây là Siêu lớp.
Đây là một ví dụ khác
về thừa hưởng lớp Java.
Nếu bạn nghĩ về nó,
TextView, ImageView,
ButtonView, tất cả đều có
những khía cạnh chung.
Tất cả quang cảnh này đều có
chiều rộng và cao trên màn hình.
Ta vẫn chưa học chỗ này, nhưng chúng
cũng có trạng thái thấy được.
Chúng đều có thể ở trạng thái
thấy được hoặc không thấy.
Còn có vài thuộc tính khác
giống nhau giữa chúng.
Thay vì viết mã cho những thuộc tính này
trong lớp TextView,
rồi sao chép mã sang lớp
ImageView, ButtonView,
ta có thể làm thông minh hơn một chút.
Ta có thể tạo ra một lớp View.
Ta trích xuất những thuộc tính chung
giữa các lớp View này rồi
đặt chúng trong lớp View chung,
như vậy chỉ cần viết mã một lần.
Nhưng sau đó làm sao kết nối
giữa lớp TextView
và lớp View?
Nếu bạn nghĩ đến việc thừa hưởng,
bạn đã đúng.
Trong file TextView.java, ta sẽ
định nghĩa lớp TextView.
Như thế ta sẽ thừa hưởng tất cả dữ liệu
và Phương thức từ lớp View.
Ta sẽ không phải viết nhiều mã
trong lớp TextView
vì phần tính năng đó
đã được viết sẵn trong lớp View.
Điều tương tự có thể áp dụng
cho lớp ImageView
và Button, ta không cần phải
viết nhiều mã nữa.
Trong những file này, ta chỉ cần
viết những gì khác nhau
khi so giữa ImageView và View.
Tôi nghĩ có thể chỉ rõ một đoạn,
để lớp ImageView chỉ cần
chỉ ra những gì khác nhau
giữa ImageView và View.
Nếu ta không muốn thừa hưởng hành vi
nhất định từ lớp view,
ta có thể chỉ rõ hành vi cập nhật
trong lớp ImageView,
hoặc trong bất kỳ lớp nào ở đây.
Để nhắc cho các bạn nhớ về thuật ngữ,
trong trường hợp này,
TextView là Phân lớp,
và View là Siêu lớp.
Nếu ta quay lại tài liệu
phần về lớp TextView,
giờ ta sẽ hiểu được phần này.
Nó nói rằng TextView mở rộng cho View.
Giờ ta biết rằng nó nghĩa là
ta thừa hưởng trạng thái
và các Phương thức từ lớp View.
Và dưới đây là Sơ đồ Hệ thống Lớp.
Nó cho thấy lớp TextView
thừa hưởng từ lớp View.
Và đến lượt mình, lớp View
thừa hưởng từ lớp Object.
Nếu bạn xem thêm xung quanh,
bạn có thể thấy các lớp khác,
như lớp EditText,
mở rộng cho lớp TextView.
Nên nó nhận những hành vi
từ lớp TextView
và thêm vào một chút
tính năng riêng cho nó.
EditText mở rộng từ TextView.
TextView mở rộng từ View,
và View mở rộng từ Object.
Đây là Sơ đồ Hệ thống Lớp.
Có rất nhiều điều,
và bạn có thể xem lại trong nhiều giờ.
Nhưng để tôi cho bạn xem một thứ
trong trang tài liệu của TextView.
Tôi muốn cho các bạn xem
Phương thức SetVisibility.
Đây là Phương thức Java cho
SetVisibility trong lớp TextView.
Nó sẽ thay đổi nhằm
cho hiện hoặc không hiện cảnh.
Nếu tôi nhấn vào Phương thức này,
nó sẽ đưa tôi đến lớp View.
Và nó mô tả Phương thức này làm gì.
Bạn có thể thấy một đối tượng TextView
có phương thức cho nhìn thấy hoặc không.
Nhưng thật ra nó thừa hưởng
từ lớp View.
Chúng ta có tính năng này miễn phí,
từ lớp View.
Được rồi, ta vừa học
cả tấn khái niệm mới.
Thường thì những điều này sẽ rải ra trong
một học kỳ của môn khoa học máy tính.
Ta sẽ làm một chút thực hành
và hy vọng là nó bắt đầu
liên kết kiến thức lại cho các bạn.
Nhưng hãy biết là
sẽ tốn nhiều thời gian
và thực hành, đến khi bạn hoàn toàn
nắm chắc những khái niệm này.
Bài tập đầu tiên, tôi muốn các bạn
tạo một ứng dụng Android mới,
vì chúng ta không muốn
làm hỏng ứng dụng Java.
Khi đã tạo xong project, hãy chạy app.
Khi đã tạo xong app,
các bạn sẽ thấy file MainActivity.
File MainActivity đó sẽ là
mở rộng từ AppCompatActivity.
Trong phiên bản Android Studio của bạn,
nếu MainActivity là mở rộng
từ ActionBarActivity thì cũng không sao.
Đó chỉ là phiên bản cũ của
AppCompatActivity.
Bằng cách bỏ ghi đè của Phương thức này,
ta sẽ quay lại
như cách Phương thức onCreate xuất hiện
trong lớp AppCompatActivity.
Sự hiện diện của Phương thức này cho biết
ta muốn hành vi khác từ MainActivity
cho onCreate.
Nên bỏ nó đi sẽ đưa ta quay lại
với hành vi gốc
trong lớp AppCompatActivity.
Khi bạn chạy ứng dụng,
bạn chú ý thấy điều gì khác
so với lần đầu chạy?
Viết câu trả lời vào khung này.
让我们先回到 Just Java 应用
看一下 MainActivity 类下的 displayMessage 方法
从这里开始更好理解了
我们认识到我们已经创建了一个叫做 orderSummaryTextView 的变量
变量的数据类型是 TextView
但我们到现在还不理解这一部分
在下一行 在我们在这个 TextView 对象上调用方法
我们使用在上面声明的相同的变量名
调用 orderSummaryTextView.setText 方法
然后我们传入一个字符串作为这个方法的输入
这个字符串类型的 message 其实是 displayMessage
方法的输入参数
现在我们深入了解一下这部分我们不理解的代码
虽然 findViewById 像是一个方法调用
因为它在看起来像输入参数的括号前面
但是 令人感到奇怪的是这个方法没有在类中任何地方定义
如果我在名字上双击并且按住 Cmd+F 或者
如果你是 Windows 按住 Ctrl+F 然后我们就能尝试在这个文件中搜索
我只看到两个 findViewById
并且它们使用的方式相同
但是我没有看到叫做 findViewById的方法
说到这 早先在 MainActivity 类中
我们调用了 setContentView 方法 但是你在文件中搜索的话
MainActivity 中也没有定义
那么这些方法在哪里定义的呢?
MainActivity 实际上是一个相当短的文件
它只有 90 行代码
但这个类比我们看到的拥有更多的内容
代码显示 extends AppCompatActivity
这意味着 MainActivity 类是
AppCompatActivity 类的功能上的一个扩展
在你的电脑上 如果你看到 ActionBarActive 没关系
那是一个旧版本
你应该使用的最新版本是 AppCompatActivity
而且 AppCompatActivity 是在旧 Android 设备上是
支持向下兼容的
AppCompatActivity 是 Android Support Library 的一部分
它允许我们在旧 Android 设备上
使用 Android最新的 UI 特征
通过继承 AppCompatActivity 类
MainActivity 免费获得了这里的所有
的函数 属性和方法
我们不需要从这里复制粘贴代码
我们只需要简单的继承这个类就可以
如果你感兴趣
你可以通过 Google 搜索更多关于 AppCompatActivity 的信息
这里是 AppCompatActivity 类的参考文档
因为我安装了 Chrome 扩展
所以我可以查看代码
这就是 AppCompatActivity 类定义的地方
你可以看到这里有很多的函数
但是你不需要理解它们是怎样实现的
你需要知道的是当你继承 AppCompatActivity 时
你就免费获得了这些函数
在更高层次中 你可以这样简化
这是 MainActivity 类的定义
在这里你定义了一些方法
当你继承 AppCompatActivity 后 我们能够从
AppCompatActivity 中获得属性和方法
现在它们并没有真正地添加到 MainActivity 类中
但是你可以想象它们在这
因为你也可以引用这些属性和方法
这就是为什么我们的代码能够引用 setContentView或
findViewById 方法的原因
因为我们继承了这些方法 所以我们没有在 MainActivity 中定义它们
MainActivity 是在设备上作为屏幕显示用的
但是我们没有在 MainActivity 中写这部分代码 这也是继承来的
在类中 我们没有直接拥有 AppCompatActivity 类的属性和方法
现在我们知道 它们一直在那 我们可以引用它们
说到继承 有好也有坏
有时我们想要继承行为 但是
有时我们只是想稍作修改
如果你想从继承的类中改变一些行为
你可以重载这个方法
你可以在方法上面加上 @override 这样的话电脑
就知道你不想要从 AppCompatActivity 继承来的方法
而是想要你自己定义的方法
这是一个棘手的问题 它需要很多练习
我们看一个 关于 AppCompatActivity 类的
重载方法的例子
这个方法是 onCreate 方法
通过在 MainActivity 类中重载 oncreate 方法 我们指定
当这个类调用时 使用的是我们自己的实现
如果你不理解 不要担心
我正要给你一个关于面向对象编程概念
的简短介绍
你绝对还有一些其他问题
而且需要阅读很多关于这个的话题 才能充分
理解它们
另一个简化 MainActivity 类和 AppCompatActivity 类之间的
关系的方法是画一个类层次图
这与视图层次图是不一样的 因为
视层次图显示的是视图树 就像之前屏幕上显示的那样
类层次图显示的是不同
Java 类之间的关系
我们有作为父类的 AppCompatActivity 类
因为 MainActivity 继承 AppCompatActivity
它被称为子类
所以当你看到此种类型定义时 不管继承什么
它都被称作父类
这个被称作子类
如果你创建另一个叫做 DetailActivity 的 activity
它继承 AppCompatActivity 那么它就是子类
这个是父类
这是另一个 Java 继承的例子
如果你想一下 会发现 TextView ImageView 和
按钮有一些共同之处
这些 View 在屏幕上都有宽度和高度
虽然我们还没学到 但它们都有一个可见属性
所以它们可以设置成可见或不可见
还有一些其他的属性 它们是相同的
除了把这些属性代码写到 TextView 类中
然后复制到 ImageView 类和按钮类中
我们有更聪明的做法
我们可以创建一个 View 类
提取这些 View 的相同属性 然后把它们放到
View 类中 那样的话代码就可以只写一次
但是我们怎样把 TextView 类和 view 类
联系起来呢?
如果你想到继承 那就对了
在 TextView.java 文件中 我们将要定义 TextView 类
然后从 View 类中继承所有的数据和方法
在 TextView 类中 我们不会有太多的代码
因为 一部分功能已经在 View 类中实现了
同样可以应用到 ImageView 类和按钮类
我们不需要写太多代码
在这些文件中 我们只需要写 ImageView 与 View
不同的代码即可
我认为这里要指明区别 所以 ImageView 类必须指明
ImageView 与 View 类的不同之处
如果我们不想从 View 类中继承某个行为
我们只需要在 ImageView 类中指定更新的方法就可以
或者其他任何类中
提醒一下在这个例子中的术语
TextView 是子类 View 是父类
如果我们回到关于 TextView 类的文档说明
我们实际上已经明白了这部分
TextView 继承 View
现在我们明白它意味着 我们从 View 类
继承了所有属性和方法
下面是类层次图
它表明 TextView 类继承 View 类
依次向上 View 类继承 Object 类
如果你浏览周围 你会发现其他类
EditText 类实质上继承 TextView 类
所以它从 TextView 类获得行为
然后添加了一些自己的功能
所以 EditText 继承 TextView
TextView 继承 View View 继承 Object
这是类继承图
这样的例子还有很多 你可以浏览好几个小时
但是我在 TextView 文档页面只给你看一项
我只给你演示一下设置可见性的方法
这是 TextView 类中设置可见性的方法
它决定 View 是可见还是不可见
如果我点击这个方法 它实际上把我带到了 View 类
这里描述了这个方法是做什么的
你可以看到 TextView 对象有一个设置可见性的方法
它是继承自 View 类
所以我们从 View 类免费获得这些功能
我们刚刚讲了很多新概念
正常情况下 它会贯穿计算机科学课程的整个学期
我们将要做一些练习
希望它能贯穿这些知识点
但是你要花费很多的时间和练习才能
掌握这些概念
第一个练习 我想让你创建一个新的 Android 应用
因为我们不想弄乱 Just Java 应用
如果你创建了这个工程 然后运行应用
如果你创建了你自己的应用 你会看见一个 MainActivity 文件
MainActivity 文件继承自 AppCompatActivity
在你的 Android Studio 版本中 如果你的 MainActivity
继承自 ActionBarActivity 也是可以的
那只是 ActionBarActivity 的一个旧版本
通过删除这个方法的重载 我们会使用
AppCompatActivity 类中出现的 onCreate 方法
这个方法的出现表明我们想要在 MainActivity 中
使 onCreate 有不同的行为
所以删除它就会回到 AppCompatActivity 类
中的原始方法
当你运行应用的时候
你注意到它与你第一次运行的时候不一样了吗?
在这个文本框中写下你的答案
讓我們回到JustJava軟體一下子
看看MainActivity等級\displayMessage方法
事情在這裡開始有頭緒
我們已經知道在創造叫
orderSummaryTextView的變數
這個變數的資料類型是TextView
這部份我們還不了解
在下一行,我們呼叫
這個文字檢視目標的方法
我們使用上述相同的變數名稱
所以稱為
orderSummaryTextView.setText
然後通過一個字串
作為方法的輸入
字串訊息原本是輸入參數
顯示訊息方法
現在讓我們深入了解這個編碼
那是我們還不了解的
看來findViewById是個方法呼叫
因為是在這些括號之前
看起來像個輸入自變數
但奇怪的是,這個方法
沒有在這等級中定義
若我點兩下名稱
然後點command F
或Windows上的control-F
我們可以試著搜尋檔案
我只有看到findViewById兩個事件
用法都很類似
但我沒看到叫findViewById的方法
講到這裡,稍早在主要活動等級
我們看到呼叫setContentView
但若你搜尋
這個檔案,並沒有在
主要活動裡定義
因此,這些方法在哪裡定義?
主要活動其實是個很短的檔案
只有大概90行
但這個等級比眼睛看到的還多
編碼說延伸AppCompatActivity
這表示主要活動是一個
AppCompatActivity
等級功能的延伸
若你在電腦看到活動列活動
那沒關係
那只是較舊的版本
你應該要用的最新版本是
AppCompatActivity
AppCompatActivity給我們
倒退相容支援
較舊的Android裝置
AppCompatActivity是
Android支援圖書館的一部分
讓我們能在較舊的Android裝置
使用Android的最新UI功能
透過延伸AppCompatActivity等級
我們會得到所有的功能
所有的狀態以及
MainActivity裡免費的方法
我們不需要複製貼上編碼
我們只要延伸等級
若你有興趣
你能搜尋AppCompatActivity
找到更多訊息
這是AppCompatActivity等級的參考文件
因為我安裝Chrome延伸
我也可以檢視來源
這是AppCompatActivity等級
定義的編碼
你可以看到這裡有很多功能
但是主要訊息是
你不需要了解如何執行
你所要知道的是
當你延伸AppCompatActivity
你會免費得到這個功能
在高等級你可以看到這樣
這是MainActivity的等級定義
假設你有些方法定義
當你延伸AppCompatActivity
我們則可以進入狀態
以及從AppCompatActivity的方法
現在,他們還沒有真正
加到主要活動等級
但你可以想像他們在那裡
因為你還是可以參考
狀態以及方法
這是我們的編碼如何
參照向setContentView或
findViewById的方法
因為我們承襲這些方法
我們沒有在MainActivity定義他們
MainActivity出現在裝置螢幕
但我們沒有寫MainActivity的編碼
我們也是承襲使用
我們沒有直接從
AppCompatActivity的狀態與方法
但我們知道他們在那裡
並且可以參照他們
講到承襲
這部分有好有壞
有時候我們想承襲行為
但有時候我們想要稍微修改
若你想要從承襲等級
改變一些行為
你可以複寫特定方法
你可以在方法上方加
@override,電腦就會知道
你不想要AppCompatActivity
的方法版本
而是要你定義的版本
這是個要小心的主題
並且需要很多練習
但我們已經看過從AppCompatActivity
複寫的一個例子
這個方法是on create method
透過在MainActivity複寫
on create method,我們明訂
這個方法被呼叫時
要發生的事
若你並沒有馬上了解,別擔心
我只是給你一些目標導向程式概念的
簡短概要
你仍有問題是絕對在預期內的
還需要閱讀更多這個主題
來完全了解
另一個方式來看
MainActivity
與AppCompatActivity等級
是畫一個等級階級圖
這與檢視階級圖不同
因為檢視階級圖顯示
螢幕出現的項目樹狀圖
等級階級圖顯示不同Java等級的
關係
有AppCompatActivity為總綱
由於MainActivity
從AppCompatActivity延伸
這是子等級
當你看到這個等級定義
你延伸的東西叫做
總綱
這會是子等級
若你建立另一個叫
detail activity的活動
你延伸AppCompatActivity
這會是子等級
這會是總綱
這裡有另一個Java等級承襲的例子
若你去思考
文字檢視、影像檢視
與按鍵檢視都有共通點
這些檢視在螢幕上都有寬與高
我們還沒學到
但他們也有可見度狀態
所以他們可以隱藏或顯示
還有一些其他特性
都是很常見的
除了在文字檢視等級
寫出這些編碼
然後複製到影像檢視
然後按鍵檢視
我們可以做些聰明的動作
我們可以建立檢視等級
我們可以從這些檢視
擷取共通的特性
然後放到檢視等級
如此一來,只要寫一次編碼
但我們如何讓文字檢視等級
與檢視等級
有相關聯性?
若你想到承襲,你就對了
在TextView java檔案
我們要定義文字檢視等級
如此一來我們會從檢視等級
承襲所有的數據與方法
則不需要在TextView等級
有很多編碼
因為部分的功能已經寫在檢視等級
同樣適用ImageView
與按鍵等級
我們不用寫那麼多編碼
在這些檔案裡,我們只要寫
ImageView與檢視等級不同的地方
我把這想成定義變量
所以ImageView等級只要
定義ImageView與檢視等級的差別
若我們不想要從檢視等級
承襲特定行為
我們可以在ImageView等級
與任何等級
指定更新的行為
提醒你用詞,在這等級裡
TextView會是子等級
檢視會是總綱
若我們回到TextView的文件
我們可以了解這個部分
這是TextView延伸檢視
現在我們知道這表示
我們從ViewClass承襲
狀態與方法
下面這裡是等級階級圖
顯示TextView等級
從ViewClass承襲
依次,檢視等級從目標等級承襲
若你探索,你可以發現其他等級
像是EditText等級
是從TextView等級的延伸
從TextView等級採用行為
然後增加一些特定的功能
因此EditText從TextView延伸
然後TextView從View延伸
View從Object延伸
這就是等級階級圖
這裡有很多內容
你可以看上很久
但讓我說明TextView文件頁另一件事
我要說明SetVisibility的方法
這是TextView等級中
SetVisibility的Java方法
讓文字顯示或隱藏
若我點這個方法
會帶我到View等級
然後說明這個方法的用途
因此你可以看到TextView目標
有設定可見度方法
但這其實是從View等級承襲而來
因此這個功能是免費的
從View等級來
好,我們剛說了很多新概念
通常這是電腦科學
一學期的課程
我們現在要做點練習
希望可以讓你連貫起來
但要知道這需要很多時間
以及練習來完全了解這些概念
好,第一個習題
我要你建立另一個新Android軟體
因為我們不要把just Java軟體搞砸
當你建立案子之後
執行軟體
當你建立軟體後
你會看到MainActivity檔案
MainActivity檔案會從
AppCompatActivity延伸
在你的Android工作室版本
若MainActivity從
ActionBarActivity延伸
那也沒關係
那是AppCompatActivity的舊版本
透過移除方法複寫
我們要回去
onCreate方法出現在
AppCompatActivity的方法
這個方法的出現
說我們onCreate
要不同的MainActivity行為
因此移除這個
帶我們回到
AppCompatActivity等級的原始狀態
當你執行軟體
跟第一次執行軟體相比
你發現什麼不同?
在文字框格寫下你的答案