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 を押すと ファイル内を検索できます
２つだけ findViewById を見つけました
２つとも同じように使われています
他に 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 クラスから タダで得たものです
さて 新しい概念をたくさん見てきましたね
これは通常ならコンピューター科学の コースで １学期間かけて行うものです
これから 少し練習をします
あなたにとって 点と点を つなぐことになると良いのですが
しかし これらの概念を 完全に把握するには
より多くの時間と練習が必要なことは 知っておいてください
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等級的原始狀態
當你執行軟體
跟第一次執行軟體相比 你發現什麼不同？
在文字框格寫下你的答案