Hello, everyone, and welcome to the complete
Android app development masterclass. My name is Mason. I'm a professional Android app developer.
And I'm going to be your instructor for this course. Before starting the course, let's
talk about it for a few minutes. This course is about 15 hours. And by watching it, you're
going to learn a lot about Android app development. But it is impossible to cover everything in
just 15 hours. For that I recorded an extended version of this course, which is about 60
hours. And in that you're going to learn everything that you need for a successful career in Android
app development. You can find the extended course by clicking on the link down below
this video. Let's see what we are going to cover in this video. In this 15 hours, you
will start from the very beginning. That means that even if you don't have any prior experience
in programming, you're going to do just fine. We will cover everything in the course in
the first section of the course he will set up the environment that you need for Android
app development. That includes installing Java Development Kit, Android Studio software
development kit for Android app development, and emulator for testing your applications.
Besides setting up the environment. In the first section, you will create a small application
to get familiar with Android app development, and each piece in an Android application.
In the second section of this course you will learn Java language Java is the most popular
language for making Android applications and in this section, we will take a deep look
at that you will learn about different variables and operators, loops and conditional statements,
different collections in Java concurrency and trading, handling exceptions Singleton
pattern and a lot more. You will also learn about object oriented programming in Java.
That includes things like classes and interfaces, inner classes and abstract classes, inheritance
and polymorphism. And a lot more, we will end this section with a challenge. So to make
sure that you have learned everything we have talked about. In the next section, you will
learn about user interfaces, you will learn about how to design modern layouts for your
applications. In this section, we will talk about things like buttons and text views,
different layouts, working with images and fonts showing a list of items with ListView
and recycler view. We will talk about snack bars and card views, adding animations to
your applications. And last but not least, we will talk about material design in Android.
Once again, we will end this section with a challenge so to make sure that you have
learned everything. After learning Java and designing user interfaces, you have the ability
to create a lot of applications. In the final section of this course we will create one
real world application from scratch. We will combine all of our knowledge about Android
app development and we will create this application together in this section beside practicing
everything we have learned so far, you will learn about a lot more topics. For instance,
you will learn about persisting your data with shared preferences. And also you will
learn how to show different websites in your application. And of course a lot more. You
can also include this application in your portfolio if you want. We are going to set
up the environment that we need in order to create Android applications. We are going
to install few things. First of all, we are going to install Java Development Kit or as
some might call it JDK. After that we are going to install Android Studio. And after
everything we are going to create a virtual device in order to test our Android applications.
As you can see, I have already downloaded JDK and Android Studio. Let's also see where
we can get them from. For JDK, you can simply search for Java JDK, and a link from Oracle
website should pop up. The first link from the Oracle web page is probably our needed
link. As you can see, we are going to download and install JDK version eight, it's going
to be enough for our purposes in this course, down in here. First of all we need to agree
to the license agreement. And after that, depending on your operating system, you can
download one of these versions. I'm on Windows, so I'm going to download and install this
windows x 64 version. If you're not sure about this x86 or x 64, you can right click on your
my computer on your desktop in properties. In here you can see the architecture of your
CPU minus 64 bit for you it might be x86. Depending on that select one of these two
files, just click on this download and the download should be started. Sometimes like
here, it might ask you to log into your Oracle account. Let's do that creating an Oracle
account is free and you won't be charged. Okay, let's select Sign in. And as you can
see the download has begun. I'm going to select the canceling here because I have downloaded
the JDK previously. Let's select that. It's going to be a really simple installation process.
Let's select Next. Once again next. Once again, let's click on
Next. And as you can see, we have successfully installed JDK. Let's click on this plus, if
you want to make sure that you have installed Java JDK successfully, you can always go to
your command prompt by going to start menu and typing cmd. In here, you can type Java
dash version. As you can see, we are seeing some information about the version of Java
installed on our system. As long as it's 1.8. and higher, we are good to go. Let's close
our command prompt. Next, we are going to download Android Studio. For that we can go
to developer.android.com. Let's see developer.android.com. During the course, we will come back to this
website a lot because this is the official website for Android developers. Okay, for
downloading Android Studio, just go to this Andrew the studio tab. And from here, you
can download one of the versions. If you don't see your version of operating system, you
can click on this download options. But in here, I'm just going to click on the download,
let's say download Android Studio, we need to agree to the terms and conditions. And
as you can see, the download has started. Once again, I'm going to select to cancel
in here because I have already downloaded Android Studio. After the download is finished,
just click on that. Once again, this is going to be a simple installation process. Let's
select Next in here, make sure to check this Android virtual device. Let's select Next
in here you need to select a path to install Android Studio. Notice that installing Android
Studio and all of its SDKs. And also emulators sometimes might take something like 20 or
even 40 gigabytes. So make sure to have at least 20 gigabytes on the drive that you are
going to install your Android Studio. After that. Let's select Next, and install. After
the installation is finished, just click on this next. And let's start our Android Studio.
Don't worry about these three projects that I have in here. Basically, these are the recent
projects that I was working on. I have Android Studio installed on my system previously,
and I uninstalled it for this video. But for you this list would be empty. Also along the
way of installing Android Studio you might see some windows is about selecting a theme
or other preferences. I didn't see them because I have installed Android Studio previously
on my system. Those are not important depending on your preferences, select one just if you
see something like installing SDK on check that because we are going to install everything
here together. In order to install SDK, you can come to this configuring here. And you
can select this SDK Manager SDK stands for software development kit. And for developing
Android applications, you need to install at least one SDK. Once again, as you can see,
I have installed two SDKs in here and return an Android nine API's both for you this list
should be empty and none of these should be checked. First of all, let's check this show
package details in order to see the package details for every SDK. By the time I'm recording
this video, the latest version of Android is Android 10 or aka level 29. To be precise,
I suggest that you always install the latest version. But sometimes there might be some
preview versions in here, I don't suggest installing those because those can be buggy.
And those are not yet released on a stable channel. So make sure to install the latest
stable version. If you want, you can install the complete SDK. But I don't suggest that
because these can be memory and hard drive consuming. And these can occupy a lot of the
storage on your device. But the necessary things in here is first of all Android SDK
versions, whatever the version of your API is. So the first one, also the sources for
that version of SDK. The second option, also I suggest that depending on the architecture
of your system, select one of these two version of atom mine was 64 architecture. So I'm going
to select this one. If you are going to work with different Google API's. For example,
if you are going to work with Google map or YouTube API's, check one of these, for example,
this Google API's for atom 64 and also check one of these two Google API versions. This
is going to install at least one SDK on my system, and return or API level 29. But if
you want, you can select and install multiple SDK versions. Basically, this SDK versions
and API's means that in what version of Android Are you going to run and test your applications
later on. We will see that when we are going to run our application On a virtual device,
you're going to need at least one SDK, installing multiple SDKs can be memory consuming and
also harddrive consuming. But if you have the resources, I suggest that you at least
install the latest version after that, install this API level 29. Because there were a lot
of changes specifically in the data storage structure also installed API level 28, down
in here installed API level 26. And after that, level, 21, and also 19. Because in this
version of SDKs, there were a lot of changes. And I'm just saying this because of my experience
in Android app development. But if you don't have the proper resources, selecting one of
these is going to be just fine. After selecting what you need in here, just click on this
apply, make sure to have a stable internet connection because it's going to download
some stuff. Let's click on this apply. In here you can see a dialog that will show you
some information about the stuff that are going to be downloaded and also the size of
the download file. Next, select OK in here, and our download should be started. I'm going
to skip the video in here until the download is finished. After the downloading and installing
all of the components that you have selected. Before it's finished, just click on this finish.
And let's see what else do we have in here. Okay, we have successfully installed at least
one SDK, let's switch to this SDK tools. And let's see what we need from here. First of
all, once again, check this show package details, install one of these Android SDK build tools,
I suggest that installed the latest version. As you can see, mine is installed in here
29.0 point two at the time is the latest version. Also down in here, you need to install Android
emulator mine is not updated. So I'm going to update that. The next two things that are
mandatory are these SDK platform tools and SDK tools, make sure to select those two.
Also down in here we have this documentation for Android SDK. This option is not necessary,
but it's going to help us a lot during our journey in Android app development. Later
on, we will see that these documentations will help us a lot when we want to debug something
or when we faced some errors. So I strongly suggest to install these documentations as
well. The other thing that is not necessary, but I suggest to install is this hexam installer,
it is going to be an accelerator for the speed of your emulator. The native emulator in Android
Studio can be various low, especially if you have a low memory Ram. For that reason, I
suggest you to install this hex installer. But there is one thing that I need to mention
in here. I've seen a lot of students having problem with this hexam installer, I've seen
them that they cannot install these hacks them successfully. This hex m cannot be installed
on all of the CPUs. And depending on the structure of your CPU, this XM might not be installed.
But there are some CPUs, especially Intel CPUs that they have a special option in the
devices bias is specifically for this emulator accelerator. If that's not enabled, you may
want to enable that in the BIOS settings as well. And also if for any reason you couldn't
install this handsome installer, this emulator accelerator. And also for that matter, the
Android emulator itself, there is no need to worry there is another way as well. Besides
the native Android emulator, you can install external emulators as well for example, the
one that I know that is working very well is called genymotion. In here, I'm not going
to install that but I will put a link to download genymotion in the description of this video.
And also besides all of these, you can always install and test your applications on the
real device that you have. Later on in the course we will see that how we can install
and test our applications on our mobile phones. Okay, after selecting everything from here,
just click on Apply once again. Once again we are seeing the download the information
like Select OK and that the download begin. Once again. I'm going to skip the video in
here until the download is finished. Once again When the download and installing is
finished, just click on this finish. And we have successfully installed SDK platforms
and SDK tools just before I close this window, let's switch to this appearance in here. From
here you can change all of the preferences that you want. For example, you can change
the theme Dracula is the dark theme. Also we have this high contrast theme. The intelligent
theme is the light theme. I'm going to stay with that because it's good for recording
purposes. If you want you can use custom fonts for the fonts of your Windows is from here.
You can also change the size of your font. I'm not going to do that. Also then in here,
you can change The font size. Also for the presentation mode. If you want to change the
size of your codes, you can search for fonts in here, I believe it's in this editor tab
in here in this font, you can see that mine is 18, you can increase or decrease that if
you want. Let's delete this one. And also, let's minimize this editor. I have another
suggestion for you in here as well, in this appearance inside the system settings inside
the updates, make sure that your updates are being checked from a stable channel. We have
other channels like developer channels and betha channels as well make sure that you
have the stable channel. Others can be buggy. Okay, that's it for installing SDK, we will
be coming back to this setting menu later on. Let's select OK. OK, now it's time to
install at least one emulator. For that we can once again select this configure this
time, we can click on this AV manager AV D stands for Android virtual device. As you
can see, once again, I have two devices installed in here pixel two and pixel three, this list
should be empty for you. But because I had Android Studio installed on my system, I can
see them let's select this create visual device in order to create a new virtual device. First
of all, you can create your own and customize the hardware by selecting this new hardware
profile. From here you can name your device, you can select that if it's a phone or tablet,
you can set the screen size and resolution. Also then in here you can specify some ram
to it and all sorts of sensors and hardwares. I'm not going to create my customized device.
Instead, I'm going to install one of the predefined devices. As you can see, I have pixel two
and pixel three in here. Let's select another device from here. Also from this left panel,
you can see all sorts of devices like TV viewers and tablets. Let's select one device from
here. I don't even know all of these devices. Let's just select this pixel Excel, select
Next. Okay, from here, you need to specify the Android version that is going to be installed
on this device. I'm going to install Android q or API level 29 on this device, so we need
to download that first, let's select Download once again, I think it's going to be a large
five. So I'm going to skip the downloading here until the download is finished. Yes,
it's 1.1 gigabytes. Okay, the download and installing is finished just click on Finish.
Now we can select the downloaded API, sometimes you might not see the version of API that
you're looking for. For that, first of all, you can always refer to this list. After that,
you can check the second tab and also the third tab. But we are going to install Android
q on our device. Let's select Next in here we can customize our device. For example,
we can change the name of our device, we can also change the default orientation. For example,
the landscape and portrait I'm going to save its portrait. In this Show advanced settings,
we can do some more customization, for example, you can change the camera, the network. Also
down in here, you can change the size of RAM, and SD card and all sorts of customization.
I'm not going to change any of these. I'm just going to click on this finish. And as
simple as that we have installed a new emulator on our device. Okay, let's close this window.
Okay, I think it's a good point. To finish off this video. In this video, we have installed
JDK eight we have installed Android Studio. After that we have installed SDK and we have
done some customization on the appearance. And after everything we have installed a new
virtual device. We are going to create our first application
we can do so by opening Android Studio and selecting this start a new Android Studio
project. First of all, in this window, we can see some templates. These templates are
just some small applications that have some codes written to some level. For example,
in this basic activity, you can see that we have a small button and also a menu above
in here. We can see other templates in here, for example, a template for Google Maps, we
have a template for navigation drawer. Don't worry about all of these because we will learn
how to create all of these elements ourselves later on. Even we select this ad no activity
template. But the Android team are nice guys, and they have provided us these templates.
In a lot of these templates. You can see the word activity Don't worry about this activity
yet. If you remember from the content videos, I said that we are going to have an entire
session which we will talk about activities and fragments. But for now you can think of
activities as different parts of your app. application. For example, if your application
has different pages and activity is one of those pages, this definition is not accurate,
it might not even be correct. But for now we can think of an activity as a page of our
application. In our first application, I'm going to save it this empty activity, which
has no element, it's just going to create some files for us. But if you want to save
it, at no activity, you can do so as well. Once again, later on, we will see that how
we can create all of these templates ourselves. Okay, let's select empty activity. And let's
hit next. In here, we need to provide some information about our application. For example,
the name of our application, I'm going to change the name of my application to let's
say, Hello world. As it's a cost among developers to name their first project, I level just
for no reason. The second part, you will define the package name for your application. This
package name should be unique to every application that is being released into the world. later
on. When you want to publish your application to play store, your application will be identified
with this package name. The convention in here is to provide the name of your website
in backwards. For example, My website is called maker.org. So my package name is or dot maker
dot the name of my project. Don't worry if you don't have any website, if you don't,
you can use something like conduct example. Let's say comm dot example dot the name of
my project. But since I have a website, I'm going to use that in here, I'm going to say
port that. Once again, this package name should be unique to every application. After that,
you need to define the path that you want to save your project. If you want, you can
change this path by selecting this folder in here and select the path but in here, I'm
not going to change that. After that you can select the language that you're going to work
with. Android applications can be written with Java language, and also kotlin language.
In this course, we are going to stay with Java. But if you want, I am currently recording
a new course about developing Android applications with kotlin. Feel free to check that if you
want, but let's select Java in here. After that, you need to define a minimum API level.
This minimum API level in here means that how many older Android devices can install
your application. For example, if you click on this drop down in here, you can see the
list of different API levels. Right now, the minimum API level that I can select these
14, but I can go off to API level 29, or Android 10. To be precise, there is a balance in here.
If you select your minimum API level very high, you can work with a lot of newer functionalities
in Android, but fewer devices will be able to install your Android applications. For
example, if I select API level 29, which is the latest version, only less than 1% of the
devices can install my application. If I select something like 19, we can see that 95% of
devices by this time can install my application, you as the developer should decide this balance
for this course, probably, we are going to stay with API level 19 for most of our projects,
because I think it's a good balance, and 95% is a good number. Leave this check empty for
now. Also, using Android x artifacts is mandatory since few months ago, we will talk about it
later on in the course Let's hit finish. And let's create our first project. If it's the
first time that you are creating your Android applications, this process can be very slow
because Android This video is going to download some stuff, for example, the gradle file from
internet so for that reason, this process can be slow if it's the first time that you
are creating your application. The first thing in here that is noticeable is that Android
Studio have created two files for us this activity main dot XML file, and this main
activity dot java file. These have been created because we have selected that empty activity
template when we have created our project. Inside each of these files. There are some
codes. Once again, we can create all of these codes if we don't select that empty activity.
But if you select that, you can have some codes written to some level. The other thing
in here is this view pane down in here. This build painting here will show the progress
of building your Android applications whenever you want to run your Android application,
whether that is in the debug mode, which we will be working in our entire course. Whether
it's in the production level, this building here will show the progress of building your
Android applications. I'm going to minimize it for now. And let's talk about all the other
stuff that we are seeing in here. First of all, let's talk about this project thing here,
I can minimize and maximize that. Also, talking here, we have multiple options. For example,
we have this project option. This project option view exactly shows the structure of
files on your system. For example, you can maximize every folder. If you want to have
access to this main activity dot java file, you can go to App folder inside the sources.
Inside the main folder inside the Java folder, you can see that we have a folder in here,
which contains the main activity java file. This is the exact hierarchy of files on our
system. If you want to make sure of that, you can right click on the name of your project
and select Show in Explorer. This option in here, it will open the Explorer on your Windows,
you can see that we have a Hello World project, don't worry about the others inside this project.
As you can see, in the hierarchy, we have this app folder. Inside this app folder, we
have a source folder, main folder, Java folder, org, may code HelloWorld. And this is the
Java file that we are seeing here. So this project view will show the exact hierarchy
of different files on your system. There is another view in here and that's called Android
view, we are going to stay with Android view for the most of this course, because it's
much more easy for eyes to follow. As you can see, we have this app folder. And inside
that we have this Java folder, we have this package name. And inside that we have this
main activity dot java file, it's much more easy for eyes to follow different files. Also,
besides this app folder, we have these Gradle scripts down in here as well. Before I talk
about these Gradle scripts, I need to talk about the structure of every Android application.
So in most Android applications, there are at least two different kinds of files, the
layout files, which will define the looks of your application. The layout files in Android
are called XML, you can see this activity main dot XML file. If you click on that, you
can see the layout of your application. Right now it has only one simple text. The other
part of every Android application is the Java file. If you are developing in kotlin language,
there are kotlin files. The Java or kotlin file in most cases will define the logic of
your application. For example, what happens if you click on a button, or what to do with
the user's input, all of those will be handled in the Java or kotlin files. Beside the layout
files and Java files. In every Android applications. There might be some other files, for example,
you may have some images, and also some audio files as well. Those will be inside this Resources
folder, for example, inside the meat map folders. Right now we have an icon for our application,
which is this simple Android icon. Either images or other files can be put inside this
Resources folder as well. Basically, this Resources folder is for the static variables
or static phones on your application. So these are the three main components of every Android
application. We have layouts, we have the Java file, and also we have the static files.
Beside these we have this manifest file inside the manifest folder. This manifest file Vila
is specify some general properties for your application. For example, you can see the
icon of your application in here also, you can see the name of your application, which
is HelloWorld, in this case, and some other properties or features about your application.
They will talk about this manifest file later on in the course. But for now, let's close
it. We have all of these different files in every Android application. But for example,
when you are going to download some application from the Play Store, you will see that we
have only one file, one apk file. That's the final application that will be released, how
are we going to generate that apk file? Well, in that case, this Gradle tooling here is
going to be useful. gradle is a build tool that will combine all of these files and other
files, and we will create an APK file. No matter if you want to release your application
or if you want to test your application on an emulator, you are going to need Gradle
for that reason we are going to work extensively with The other use of Gradle is that if you
want to use other people's code in your project as well, for example, if you want to use YouTube
player in your project, you will add its dependency inside this built up gradle file down in here,
just by writing one line of code Gradle will download the code for YouTube video player,
as simple as that Gradle will add the YouTube player code to your project. And after that,
you can use it. So Gradle is a build tool that will handle the combination of every
file, and also other codes and we will generate an APK file, we will talk about different
Gradle scripts later on in the course. Okay, let's close all of these extra files. Okay,
this was the project when we can minimize or maximize this pain from here. Let's minimize
that. And let's talk about other pains available in Android Studio. Then in here, you have
some useful pains as well, for example this to do is very helpful when you are creating
or when you're developing Android applications to those are some works that you don't want
to do at the time, but you don't want to forget those works. For example, inside this main
activity, I can add a to do as simple as that I can say to do, let's say complete this. It's just for the developers to remind
themselves or other colleagues to do something later on. As you can see this to do has been
added inside this to do pain as well. If you want, you can check that it says that it's
inside the main activity. Later on, we will talk about how we can define to dues and also
other kinds of comments. So this is one of the other pains. The other one is this terminal
dining here. This terminal is like the command prompt in Windows or let's say terminal in
Linux or Mac. And it's very helpful if you're working with something like ADB or Android
debug bridge. Later on, we will see the use of ADB in our projects. Also, it's very useful
for working with SQL lite databases, we have worked extensively with this terminal in the
database session. After that we have this new tool here we have seen it when we have
created our project, you can see the progress of every application when it's going to be
built. In a lot of cases, there might be some problem when we build our project. And from
here, you can exactly locate the problem. After that we have this logcat in here, it's
going to be very helpful when we are going to debug our Android applications. In fact,
we are going to work a lot with this look at Okay, let's minimize all of these for now.
Above. In here we have some menus, we have File, Edit view and all of these, we will
work with most of them, I believe in the course but it's impossible to work with all of them.
Also, there is one thing that I need to say in here. When you create your first application,
you may get some warnings, for example, a rendering warning or some other kind of warning,
if you get those probably there isn't something wrong with your application, you just need
to rebuild your project. For that you can come to this build option in here and make
your project once again, in case if you get some errors at the first time that you create
your application. Sometimes newer versions of Android Studio can be buggy. And creating
your project once again simply can solve your problem. Also, there is another option from
here from five, you can close your project and reopen it that can be useful or in some
cases, you may want to invalidate your cache and restart Android Studio. So if you get
those warnings or errors, we can try these three different ways in order to overcome
the problem. There is one very useful tool that has been added to Android Studio recently
in the past few months. And that's called Android profiler. Let's add that to this pane.
down in here as well. We can add that by going to this view to Windows and profiler, it's
going to be helpful for monitoring the resources that your application is using, for example,
the amount of RAM the CPU that your application is using, or even the amount of network that
your application is using. If you're on our application, we can track the live amount
of different resources that our application is going to use. Let's run our application
and see for ourselves. You can run your application by clicking on this green triangle from here,
but before that, make sure to select the current app that you're working. And also beside that
make sure to select the device. In the previous video we have created a virtual device and
we can see the list of different virtual devices available. I'm going to run my application
on these So through API level 29, for no reason, let's just run. If we click on this building
here, you can see the build progress, I said that even if you are going to debug your application,
or even if you are going to run your application at the production process, you can check the
progress of build as well. As you can see, this emulator has been opened. And we will
see our application in a few minutes. Also, from down in here, you can see the current
status of running your application. Right now it has created or built my application
successfully, and it's waiting for the device to turn on. Also, if you check this logcat
in here, you can see that there are a lot of things going on in here. We will be using
this logcat extensively later on in the course, for different debugging purposes. Let's minimize
that. Also, if you open this profiler, you will see the live tracks of different resources
that your application is using. Let's open our emulator. Right now we have this simple
application in which has a predefined text called hello world. And if you want, you can
check the amount of CPU or other kinds of resources that your application is using, it's going to be helpful when you're
not sure how much resources your application is using. Let's minimize that for now. If
you want, you can close your application with this red button here, you can stop it. And
also if you want, you can turn off your device. By long pressing this turn off button, you
can say power off and your device will be shut down. As you can see, we are getting
some warnings in here right now, these are not important. But if you want to check them,
you can click on this event log. And everything that happens since we click on this green
triangle, we will be logged in here. Okay, let's minimize that. And let's switch back
to our activity main dot XML file. And we have a lot of options in here as well. Right
now you can see two different views of your application. This white one is called the
design view. And this one in here is the blueprint view. There are some slight differences between
these two, for example, if you have some invisible item inside your activity that might not be
visible inside this design view. But you can keep track of that inside the blueprint view.
For now, I'm going to disable this blueprint view because we are not going to work with
that just for now. In order to disable that, you can click on this stack icon. And you
can see just design, we can also minimize and maximize that by pressing this plus button.
At the left panel in here, you can drag different elements different user interface or UI elements.
For example, if you want to add a button to your application, you can simply drag it like
this. And this button will be added to your application. As you can see right now because
this element is clicked, you can see different attributes. At the right panel, we have a
lot of attributes for every user interface element. The most important one is this ID
above in here. This ID is the unique ID of your element in which we will use it in order
to have access to this button, for example, from inside of Java file. Later on, we will
talk about that if we click on our text view, you can see that we have different attributes
as well. These are just a few attributes. If you want to check the list of all of the
available attributes, you can click on this all attributes. And you can see that there
are a lot of them. We are going to get familiar with different UI elements in the UI session
we have that I think in two sessions from now, after the Java session we will be talking
about user interface in a specific details. Also, when you are inside your XML file, you
have two views design view and text view design view is this view that we are working right
now. And if we switch back to text view, you can see the exact value of every UI element
in XML code. xml is a markup language. If you are a web developer, you know the concept
of a markup language. HTML is also a markup language. markup languages are just for defining
some elements that user is going to see, for example, a button or text view, you can see
that there are a lot of attributes in here but that the don't know anything about them
yet. We will be talking about them later on in the force. So there are two ways of defining
UI elements. One is that You drag simple items, for example, a button to your design view,
or from the text view, you can type it, you can see that we have a button in here, we
can select the whole button. And we can simply press Delete, and that button will be deleted,
you can see that we no longer can see that. Also, if you don't have this preview enabled,
you can enable it from here, let's just press Ctrl Z in order to get back our button. And
let's switch back to our design view. I'm going to define an ID for this Hello text
because later on inside my java file, I'm going to identify that and I'm going to work
with that. So by clicking on HelloWorld, you can see the list of attributes. At the top,
we have this ID, we can set an ID for our TextView. Also, if you don't know the difference
between a text view, edit text, and all of these don't be very TextView is just a fancy
way of saying a simple text, you can define the ID whatever you want. For example, in
here, I'm going to say txt message. But notice that there are some conventions in here, you
can't use a spaces when you are going to define an ID also beside that you can't use some
weird characters like $1 sign or a hashtag sign. The other convention in here is that
you type the first letter in lower cases. For example, this team here is learn cases.
And also after the first word, you type the first letter of the second word. in capital
letters. For example, we have this m here, there are some just basic conventions among
programmers by pressing Enter, we now have an ID for this hello world. If we switch back
to our TextView from down in here, we can see that for this TextView, an attribute has
been added the ID attributes. So no matter what you do inside your TextView or design
view, they are basically the same. But as you can see, right now we have some warning
for this button. The warning says that this button is not constrained to anywhere. That's
because we are using this constraint layout for this whole XML file. Don't worry about
this constraint layout yet we have other layouts like relative layout and linear layouts as
well. But for now, just know that when you are using constraint layout, which is the
default case, when you are creating an Android application, you need to concentrate or chain
your different elements to software. For example, if I don't constrain this button to anywhere,
it's going to be floating at the wrong time. Because of the different screen sizes, we
cannot know the exact position or exact place of this button. And right now if we run our
application, probably This button will be moved to the place zero and zero, which is
exactly this corner in our layout. In order to overcome this warning, we can simply add
some constraints by clicking and dragging. As simple as that I'm constraining this button
to the both edges of my screen. Also for the top and the bottom, I can constraint that
as well. For the top, I'm going to constrain that to this TextView. For the button, I'm
going to constrain that to the bottom of my screen. As you can see whenever I add a constraint,
and attributes will be added to this TextView in here as well. Now we don't have that red
one. Also, it's worth mentioning that by default, when we have created this button, when we
have dragged that into our design view, an ID has been added to it as well. The idea
of this button is just button, we can change that if you want. For example, I can say btn
let's say hello, or whatever you want. But in an XML file, the ID should be a specific
to every element. Right now this button doesn't do anything.
In this video, we are going to make our application a little bit more interactive. For example,
we are going to change the text of this TextView by clicking on this button. For that we need
to define this TextView in our Java file so that we could have access to its attributes.
But before I go further to my java file, I'm going to switch to full screen so that you
won't be distracted with all of my icons down in here. If you go to this view option in
here, down here at the bottom, you can see that we have few options. I'm going to go
to full screen. For the rest of the course i'm going to stay with full screen. Okay,
let's switch to our main activity dot java file. As I said in the previous video, you
can see that we have some code written in here. And that's because when we created our
project we have selected the empty activity project for that now we have an empty activity
which has an activity main dot XML file and also main activity dot java file. In future
we will see that we can create All of these folds if we select no activity at the time
of creating our project, but in here we have these codes returned to this level. Also,
we have this plus sign in here beside this import. If you click on that, you can see
that we have imported some packages to this class. If you want, you can always minimize
and maximize that input. And for that matter, you can minimize and maximize all of your
methods. For now, I'm going to leave these imports like this so that we can see what
we are importing into our Java file. Don't be worried about all of the new keywords that
you're seeing in here, for example, this probably class extends protected void. We will talk
about all of them later on in the course. But for now, just know that this onCreate
method is going to be the start point of our application, it means that when we run our
application, the code inside these two curly braces is going to be the code that will run
first, once again, don't worry about the term method that we used. We will talk about that
later on in the course. So inside this onCreate method, two things are happening, we have
this super.on create, we are not going to talk about that right now. And after that
we are setting some content views by setting content views we are accessing to the activity
main file, you can see that we have this activity main in here. Basically it means that this
Java class is somehow related to this activity main layout file. We will talk in more depth
about this later on in the course. But for now just know that up until this point in
our code, we have said that this java file is related to this layout file. After that,
we can write the quotes that we need. For example, in here, I'm going to access to that
TextView that we have created in the previous video for that I can say text view. As you
can see, when I type something intelligent, the idea behind the Android Studio is suggesting
some options. There are a lot of options in here, but the one that I need is going to
come from Android dot widget package. So in Java, we have classes equivalent to the UI
elements or user interface elements in our layout file. If we are going to define a button
we have that class in java file as well. In here we are going to use text view. So we
can import that in our project as well. As you can see, a new line of code has been added
to our imports. This line of code is importing the TextView from the widget package into
our Java file. Next, I need to name my TextView The name is optional, and you can name it
whatever you want. For example, in here, I'm going to say txt Hello, this is just the basic
convention you can name your class, whatever you want, but we will talk about conventions
later on in the course, after naming your TextView you need to locate the TextView from
inside the layout file. And the way to do that is like this, you can say is equal to
there is a helpful method in every activity that is useful for finding different views
by their IDs. And that method is named find view by ID. Once again, this method is useful
to find different views different user interface elements from your layout files by date ID
inside the parentheses of this method, we need to pass the ID of our TextView from inside
our layout file. And the way to do that is like this, we can type r r is a special class
in Java, which will give us the access to all of our resources, our static files in
our project. Once again, it stands for resources, let's select that, you can say r.id dot after
that, we need to add the ID of our tapes we have which was txt message, I believe this
ID in here should be the exact ID that you have put inside your layout file for this
TextView you can see that the ID is txt message. And we are using that to have access to our
text view. So this way by using this fine view by ID method, and after that passing
the ID in this shape. Now we have access to our text view. But you can see that there
is one more error in here. And that's because in Java, every time you write a sentence,
you need to finish your sentences with a semicolon. That's just syntactical and it really doesn't
matter some languages does not require the semicolon, but in Java, you need to put a
semicolon at the end of every sentence. Okay, now up to this point, we have our TextView
in our Java file. Now we can use it for example, if we want to change the text of our TextView
we can say something like this, we can type the name of our TextView which is txt Hello.
After that we can say dot Don't worry about this dot operator. We will talk about it in
the next section in the Java section. But for now just know that when you are typing.on
an object, you have access to all of its methods and attributes. For example in here I can
see set text once again you can see that we have multiple options. Let's import the first
one inside the parentheses of this method. You need to pass a text. And whenever you're
going to pass a text statically, whenever you're going to hard code the text, you need
to pass it inside double quotations. Let's pass a double quotation inside this double
quotation, I'm going to say hello, this way. Now we have changed the text of our TextView.
Let's run the application and see if it's going to work. Remember that inside our activity
main layout file, the text is HelloWorld. Inside our Java file, we are changing it to
Hello, let's run the application. As you can see, in here, the text of our TextView has
been changed to Hello. Still, our application is not interactive, we want to change the
text when we click on this button, not when we run the application. For that we need to
define an event listener to be precise, an onClick listener for this button so that when
we click on this button to take off our TextView changes, there are multiple ways of defining
an onclicklistener. For our button, the simplest one is to do that inside your main activity
layout file. If you come down in here inside your button element inside the anchor brackets
of your button, if you type on click, you can see that we have an option in here. Let's
pass a name in here, for example, I'm going to say on btn clique, this name in here is
going to be the name of a method in our Java file. As you can see, right now we are getting
a red warning, it says that there is no such method in your Java file. Let's copy the name
from here. And let's go to our main activity and create that method. So in order to create
a method, we need to do that outside of the scope of this onCreate method. And inside
the curly braces of this class and talking about this, we need to define our method inside
this class. And the way to do that is like this, we can say public void after that the
name of our methods, which is on btn. Click a pair of parentheses, because it's going
to be the onclicklistener. For our button, we need to accept a viewing here, don't worry
about this viewing here, we will talk about all of these in Java session. Let's name this
view. After that, we need a pair of curly braces for our method. And in here, we need
to put the code that we need to execute when the user clicks on our button. If you switch
back to your activity main dot XML file. Now you can see that the red error has been disappeared.
Okay, let's go to main activity dot java file, I'm going to change the text of our TextView
to Hello when the user clicks on our button. So for that method, I'm going to move these
two line of code to inside this method, you can probably guess the behavior of our application
right now. Let's try it once again and see how is it going to work. You can see that
the text is still says hello world. If we click on our button, the text will change
to Hello, this is okay. But this is not entirely what we want. It's just saying hello right
now we want to say hello to the exact user. For example, we are going to get the name
of our user. And by clicking a button we are going to say for example Hello may sound Hello
Tom and something like that we are going to get the user's input, the way to get the user's
input is by using some element in our UI called edit text. Let's switch to design view. You
can add an edit text into your project by going to this text option in here, you can
see that we have multiple options. The first one is for text view, we have seen the text
view it's this hello world text. After that we have other options, plaintext, password,
email, and all of these, these are all helpful for when you want to get different kinds of
users inputs. But for our purpose in here, we are going to use plain text. Plain Text
is just a simple text that we are going to get from the user. Let's drag that into our
view. If you take a look at the attributes in here, you can see that it's ID is edit
text. Let's quickly change that. Let's say EDT. txt name. Because we are inside the constraint
layout, we also need to constraint this edit text as well. But before that, I'm going to
change the top constraint of this button, I am going to change its constraint from the
bottom of this TextView to the bottom of these editors. For that I am going to direct the
top constraint of this button to the bottom of this edit text. Now let's add some other
constraints for this edit text as well. For example, for the top, I'm going to constrain
it to the bottom of my text view. And also for the edges. I'm going to go to the edges
of the screen. Right now it's too close to our text view. If you want we can add some
margins. For example in here, I'm going to say 70. That seems to be better. The other
attribute that every edit text has is this text in here. I'm talking about this attribute
in here. You can see that right now it says name if you want you can change that but in
here, I'm going to completely delete that, instead, I'm going to define some hints. You
can see this hint attribute in here. The difference between hint and text is that when you click
on your edit text, the hint will be deleted. It's just a hint for the user to know that
what he or she is going to enter inside this edit text. For example, in here, I'm going
to say me, you can see that it's somehow grayed out. Okay, now we have an edit text inside
our layout file inside our Java file, we need to have access to this edit text so that we
could get the user's input once again, the start point of our activity. And our application
is this onCreate method. So we can do that inside this onCreate method, we can have access
to our edit text like we did for this TextView. We can say Edit Text. Once again, you can
see that we have an equivalent class for this edit text as well. Also, if you take a look
at in here, you can see that this line of code has been added to our class as well.
Let's say Edit Text, edit GTX. The name, like before, we can say is equal to find view by
ID. And once again, we need to pass the ID of our edit text which I can say r.id dot
EDTA. txt name. To this point, we have defined our edit text. Now, we need to get the text
of our edit text for that we can say Edit Text name, dot get text, you can see that we have this
option. But this is not enough, you also need to do another level of conversion. And we
do that by saying.to string. Don't worry about this two string method yet, we will talk about
that later on in the course. It's just for converting whatever the text is inside our
edit text to a text that we can use in our Java file. Don't worry about that. We will
talk about it later on. But there is a problem with our code in here, we are going to get
the user's name and we are going to say hello to the user. When we click on the button.
For that we need to have access to this edit text inside our on button click method. But
if you try to do that, for example, if you say Edit Text name, you can see that everything
is in red, it means that you don't have access to that edit text inside this method. And
that's because something called a scope in Java. The scope of this edit text is this
onCreate method within the curly braces of this onCreate method, we can have access to
these elements from inside are on button click method. In order to solve that problem, we
need to move these two line of code to inside our on button click method. Let's quickly
do that. Inside our on button click method, let's paste them. But right now we are not
doing anything with the users input we are getting the user's input, but you're not doing
anything with that, we need to pass this line of code to the set text method. Let's quickly
delete this line of code. And inside the parentheses of the set text method. I'm going to pass
that I'm going to say Edit Text name, dot get text.to string. This way, we are setting
the text of our TextView to whatever the text is inside our edit text. Let's quickly run
the application and see if it's going to work. This is how our application and this edit
text looks right now. If we click on that, you can see that we can type something for
example, let's type my name. And if we click on our button, the text of our text view changes
to Mesa, this is not entirely what we wanted, we want to say hello to myself. In order to
do that we need to make some changes to our code. Also notice that I didn't put any double
quotation in here. And that's because we are passing this text dynamically to our set text
method. If we wanted to pass our text statically we need to put that inside double quotation
but in here we don't need to double quotation if we want to say hello to the user, we can
say something like this, we can say double quotation, let's add a plus in here. And inside
these level quotations, let's say hello. Also let's add a space so that we could see everything
better. This in here is called concatenation in programming, adding the two texts together,
let's run the application once again. And let's type something in here. Let's say Mesa
by pressing button. This time, you can see that the text has been changed to allow Mesa
our application is now much more interactive. Okay, this is our challenge, we are going
to create a registration form like this, we are going to get the user's first name, last
name and email. And by pressing this register button, we are going to show them inside these
text views. Let me quickly show what I'm talking about. So if we have a first name, last name,
and also an email. If we click on this register button, we are going to show them inside these
text views to the user. It's just a simple application so that we can practice everything
that we have learned so far. Okay, I want you to pause the video in here and create
the simple application After you have created it, come back to the video and we are going
to create this exact application together. I hope you solve the challenge but if not,
that's totally okay, we are going to create that in here together. Also notice that whenever
you run Android Studio, you can see a list of recent projects in the left panel in here.
Okay, let's move on. And let's create our project we can say start a new Android Studio
project. Once again, we are going to select this empty activity. Let's name our project
in here. I'm going to name it the first challenge or Let's name it registration for you need
to specify a package name, mine is fine. Change the Save location if you want. And also I'm
going to stay with API level 19. Okay, let's create our project. Let's start by creating
our layout file. I'm going to close these jellified for now. And let's also minimize
this project name. First of all, let's delete this HelloWorld text, you can click on it
and by pressing Delete, you can delete that in our registration form, we needed to edit
texts, let's add them quickly. In text, we need to add three plain texts in here. Let's
quickly add them, we will constrain them later on. Don't worry about that right now through
edit texts. And also we need a button. Let's add that as well. We also needed three text
views. For the Edit texts. Let's also change the IDs. For the first one,
I'm going to say Edit Text first name. Let's also delete this text and also add something.
That's the first thing. Let's do the same thing for the other two edit texts. Sometimes
when you're defining a hint, or maybe a text attribute for your elements, you can see some
annoying dialogue like this in here, you can avoid that by pressing the Escape key on your
keyboard. Okay for the button. First of all, let's change its ID to let's say btn register.
You can name it whatever you want. Let's also delete this text. And let's say register.
Also, you can see that we have this onClick attribute in here, we can define an onClick
attribute for our button from here or like we did in the previous video in our TextView.
I'm going to define that right now in here, let's say on Register btn. Click later on,
we will create this method for the text views. First of all, let's change their IDs. For
example, for the first one, let's say txt first name. Also, let's change the text to
Firstly, similarly for the other two. Okay, and let's greatly constraint all of these
elements, we can click on them. For the first one, I'm going to constraint it to the top
edge of my screen. And also both sides of my screen. Let's also add a margin top of
maybe 100. That seems to be better. For the next one, I'm going to constraint it to the
both edges of the first name edit text, and also to the bottom of my first name edit text,
add a margin top of 24. I'm going to do the same thing for this email. For the button,
I'm going to do the same thing, but I will probably change the top constraint. Also,
if you did a mistake, when you're constraining your elements, you can click on the constraint
by pressing Delete key you can delete the constraint, let's change the top constraint
to maybe something like 90 db. For the first name, I'm going to constraint it to the both
edges of my button. Sometimes it may not work just try once again. And also the top constraint
to the bottom of my button. For the top constraint once again, let's say 90, I think 90 is fine.
Let's delete its top constraint because right now we are not seeing our last name TextView.
And let's add it once again. For the last name, I'm going to do the same thing. Let's
change the top constraint margin to let's say 24. Same thing for the email. Okay, this
is going to be the look of our application. And now that we have defined our layout file,
let's switch to our Java file. And to find the behavior of our application, I'm going
to close this activity main dot XML just before everything, let's just copy this onClick attribute
so that we don't make any mistake when we define this method in our Java file. In our
projects being inside Java folder inside our package folder inside our main activity dot
java file, I need to create my onClick method. Once again, I can say public void the name
of my method, which I've copied from my layout file, inside the parentheses, I need to say
view with capital V after that view with the Lord v. And now I have created my own button
click listener. Once again, don't be worried about the syntax of this method. We will talk
about it later on when we have talked about Java in here. First of all I'm going to define
my text views. If you remember we can do something like this. We can say TextView for the first
one. Let's say txt first name is Call to find view by ID r.id dot txt. Firstly, I'm going
to do the same thing for email. And lastly, after you have defined your text views, it's
time to define your edit texts. You can do that like this, we can say Edit Text. For
the first one, let's name it edit text first name is equal to find view by ID r.id dot
edit text first name. Once again, I'm going to do the same thing for edit text, email
and also edit text last name. Okay, now we have access to all of the UI elements that
we wanted. Now let's change the text of our text views. For example, for the txt first
name, I can say something like this, let's say txt first name. That's a text. We have
seen this in the previous video. Nothing new in here. Let's say first name, plus the text
of our edit text. Firstly, we can say Edit Text first name, dot get text.to string. As
simple as that. Now, we are setting the text of our text view to the text of our edit text.
Let's do the same thing for last name and email. Edit Text last name, that's a text.
Let's say last name, first of all, was edit text last name dot get text.to string, edit
text email. That's a text. Sorry, I have put the wrong element in here. This should be
an txt. Last name, not edit text last name. Same thing for the email, txt email. That's it text. Let's say email plus edit
text email dot get text.to string. That's all we need from our application. Let's just
run it. Okay, it seems like we have done a good job with the layout of our application.
I think it's just better to decrease the margin top of this register button and also these
first name edit text so that we could see all of them better. Let's also test its behavior
for the first name, let's say Emma. For the last name, let's say Watson for the email,
Mr. watson@gmail.com. Let's click on this register button. And as you can see, we are
seeing the text that we wanted. It seems like our application is working perfectly. In this
section of the course we are going to talk about Java for writing Java applications,
we are going to need an ID ID stands for integrated development environment. Android Studio has
been built upon an ID called IntelliJ. Until few months ago, you could have right and drawn
Java applications on Android Studio bought I think it was around July 2019, that you
can no longer do that. And that was because of a new release in Gradle. I have recorded
a video on that exact problem at the time. And it's on my YouTube channel. If you want
to take a look at that just search for makeup on YouTube and you will probably find a video
let me quickly show that this is the video that I'm talking about. Andrew the sudo does
not support plain Java code anymore What to do now. And you can also see my channel name,
so make sure to check that if you need. But basically what I was talking about in that
video was that instead of Android Studio, you need to use another ID. The most famous
IDs that are available for writing Java applications are Eclipse and IntelliJ. In this course,
we are going to use intelligent because it's a lot like Android Studio. And also it's free.
In that video I have talked about how to install intelligent Id make sure to check that if
you need but it's a lot like installing Android Studio beside intelligent, you're going to
need JDK Java Development Kit, which we have already installed on our system, you can get
intelligent ID from JetBrains website, let's say intelligent ID. The first link from the
JetBrains website probably is our needed link. Just one thing that was mentioning here is
that there are two versions, the community version and also an ultimate version, the
community version is free. And also it's enough for our needs in this course. So make sure
to download that and after you have downloaded it and also installed it come back to this
video to write Java applications. I have intelligent installed on my system and I'm going to open
it right now you can create a new project in here by saying create new project. As you
can see, the process is a lot like Android Studio, I have the ultimate version of intelligence
ID and for that I can see all of these options. These might not be available for you if you're
using community version, but no matter what version you're using, you should see this
Java option in here select that in here you need to specify the path to your JDK. If you
have installed JDK with me at the beginning of this course you should be good in here
you can just select the version of your JDK my version in here is 13. But we are not going
to use All of the features of Java 13. Because Oracle does not support this version of Java
for long term, we are going to stay with all of the features of Java eight. Okay, After
you have selected the Java and your JDK, let's click next, we are not going to create our
project from template, so make sure to uncheck this option. After that, click Next. In here,
we need to name our project and also specify a location for the name of this project. I'm
going to say hello world. Also, if you don't see these settings in here, you have this
more Settings option down in here, make sure that your module name is exactly your project
name. Also feel free to change the project location if you need, I'm not going to change
that in here. Let's just click Finish. And let's create our project. As you can see,
intelligent ID is a lot like Android Studio. And the reason for that once again is that
Android Studio has been built upon this ID. Let's just close this tip dialog. And let's
switch to full screen mode. And let's go to full screen mode. Once again, in IntelliJ
ID, you can see this project pane you can minimize and maximize that you can also move
through the folders right now because we didn't use any template our folders are empty, we
can create our project like this by clicking on the source folder by right clicking on
that selecting new package, you can specify a package for our application. In this case,
I'm going to say for the maker dot let's say hello world. And inside this
package, we can create our Java classes Don't worry about the term class that are used.
We are going to talk about that in object oriented session. But for now just know that
we are going to need at least one Java class in order to run our Java applications. By
right clicking on our package and selecting new Java class we can create our class Let's
name this class. Hello. As you can see, a new Java class has been created in our package.
And also we have few lines of code. Let's minimize our project pane. Let's focus on
this Hello dot java class. Basically what we have in here is the package that we are
currently in which is orb dot maker dot HelloWorld. And also we have the declaration of a class
once again, we are going to talk about classes later on in future videos. In order to have
a start point for our application, we are going to need at least one method and that
method is called the main method. In order to create that method we can type p SVM. By
pressing tab or enter, we can have that method. As you can see, this green triangle has been
added in here it means that now we can run our application from this point, we will talk
about the meaning of all of these new keywords later on in the course. But for now, just
know that in order to run your Java applications, you need at least one Java class in which
has one method called main this main method is like the onCreate method of our activities.
Now we can write our codes inside this main method. For example, in order to print something
to the console, we can say something like this we can say s o UT or south and by pressing
tab or enter you can see this line of code System dot out dot print line. Or alternatively,
you can type this manually. Instead of using the shortcut, you can say system, notice that
the s should be in other cases, make sure to use the upper case for us. Let's say system
dot out. Basically this out means output in here it means that we are going to add 14
something in this case we are going to print something later on we will see that we have
an in as well in which we will get the user's input. Let's say System dot out dot print
line, you can see that we have print and print line. For now we are going to use the print
one we will talk about the difference later on. In order to print something to the console,
you need to pass it inside the double quotation, you can say something like this. For example,
let's say hello world. Now if you have the simplest Java application that can be written,
let's quickly run our application. In order to run our Java application for the first
time, we need to right click inside the curly braces of our main method and select Run hello.me.
Let's do that. As you can see, we are printing hello world into our console. Sometimes if
it's the first time that you're running Java applications, you may get some errors in here.
In the most cases those error would be gone by rebuilding your project, you can come to
this built up above in here and rebuild your project. After the rebuild is finished, you
can run your application once again by right clicking and selecting run. Hello, that's
me. In most cases, the error should be gone. But if you had any other problem, please ask
them in the q&a section of the course also notice that for the rest of this section,
we are not going to have any user interface it is possible to have a graphical user interface
GUI for your Java applications but because this is an Android course and later We've
talked about user interface in Android applications, we are not going to use any user interface
for our Java applications, we are just going to understand the language. Okay, now let's
minimize our round pain from here. And let's talk about the difference between print and
print line. The difference between print and print line is that when you are using print
line, after printing your text, the cursor will move to the next line. That is not the
case with print. In order to see the difference, let's say System dot out dot print. Once again,
let's pass our hello world text. And let's run our application to see the difference.
Also, if it's the first time that you're going to run your application, you can right click
inside the main method and click on this run Hello dot main. Or if it's not the first time,
you can click on this green triangle at the left or the green triangle. On the top of
your screen, you can also see the shortcut for Windows is shift plus fn. If you're using
Mac or Linux, we can hover over this green triangle and see the shortcut. Let's run the
application and see the difference between print and print line, you can see that the
text has been printed, but the cursor never moved to the next line. If we switch these
two lines of code, we can see the difference. But let's switch now. Now print line is the first
line and print is the second line. Let's run the application once again. This time, you
can see that the two text has been printed in two separate lines. Okay, now that we know
the difference between print and print line, let's talk about variables in Java. But before
I do that, I'm going to comment these two lines of code, you can comment them by pressing
Ctrl plus slash when you comment some code in Java, it means that you are telling the
compiler to ignore these two line of code. The use of comment is for developers to remind
themselves or other colleagues of something important. For example, in here I can say
slash slash, let's say do something, this line of code will be completely ignored. The
other kind of comments in here is like this, we can say slash slash to do after that we
can say do something. If we use this kind of comment with to do at the beginning of
your comment, you can see that first of all the color will be changed to blue. And also
if you click on the to do tab in here, you can see that you have one to do in your file.
It's very helpful when you're working with multiple programmers. By clicking on this
to do everyone can see the list of different tools. There are more to comments, we will
talk about them later on in the course. But for now just know that when you're commenting
something that line will be completely ignored. Okay, now let's talk about variables. Variables
are useful for when you want to store simple data in your job application. For example,
if you want to store a number or a text variables are useful for when you want to store some
small data in your Java application. For example, if you want to store a number or a text, if
you want to store a number, you will do that like this. You can say int int stands for
integer basically inside an integer, you can store whole numbers for example, negative
and positive numbers plus zero. And the way to define them is like this. First of all,
you type int after that, you need to name your variable. For example, in here, I can
say number this name in here is optional. And you can use whatever you want. After that
you can assign a value to your variable. For example, I can say five in here, this is the
data type of my variable, this number is the name of my variable. And this five is the
value of my variable beside positive numbers, you can also have negative numbers. After
you have stored your variables, you can do some operation on them, for example, you can
print them and the way to do that is like this, you can say System dot out dot print
line. And after that you can pass your number or whatever is the name of your variable.
Notice that in here I haven't used double quotation. Basically, whenever you are passing
some text explicitly, you need to pass the devil quotation but whenever you're passing
your variable, you shouldn't pass any double quotation, let's run the application and see
if we can see our number. You can see that the value of our number is negative five in
this case, but inside integers, you cannot have decimal values. For example, in here,
I can say 5.3 previoulsy, other kinds of variables in which you can use in order to store decimal
numbers, but more on that in a few minutes. The other kind of variable that you can use
in order to store whole numbers is long. Let's see that as well. We can see a long, you can
name it my long is equal to once again, let's say five. Let's also print that, let's say
System dot out dot print line and let's pass our log. If we run the application, you can
see five down in here. The difference between long and integer is that you can store larger
numbers inside a lung. And also a long variable will store more spaces in your device's memory
ram to be exact inside an integer you can't store numbers as large as the number of two
to the power of 31. But inside a long, you can store numbers as long as the number of
two to the power of 63. That's the difference between long and integer. But what if you
want to store decimal numbers floating point numbers for that you have other kinds of variables,
the first one is a double, let's see that we can say double, let's name it my double.
Let's assign it the value of 4.5. Like before we can print it, let's pass our data. If we run the application,
we should see the number of 4.5 printed, you can see that down in here. So double is one
kind of variable in which you can use in order to store floating point numbers. The other
option is to use float. Let's see that as well. We can say float, let's name it my float.
Once again, the names are optional, you can name your variables, whatever you want, we
can say 4.5 in here once again. But right now you can see that we are getting a read
error in here. And that's because floating point numbers by default are double in Java,
it means that if you want to define a float number, you need to cast your number to float,
the way to cast your number is like this. After the equal, we can open and close a parentheses
and inside the parentheses you can say float by casting, you will explicitly tell the ID
that this is going to be a float number and not a double number. Okay, let's quickly print
this as well. Let's pass our float. And let's run the application, you can see that once
again 4.5 has been printed. Once again, the difference between float and double is that
inside a float, you can store smaller numbers. And also the other difference is in the space
that each one of these are going to occupy in the device's memory. Basically double view
occupying more space, we won't be using floats that much in this course, I just wanted to
show you that float does exist in Java. Okay, now we have seen numbers. But what if we want
to store different characters in Java, for that we have a special kind of variable which
is char, for example, we can see char, my char is equal to, let's say M. Notice that
when I've assigned this character to my char variable, I have used this single quotation
that wasn't the case when we have worked with different numbers. When you're assigning a
character, you need to use the single quotation like before we can print our character. Let's
pass our character. And let's run the application. You can see em printed in here. When you're
using char variable, you can't have multiple characters. For example, in here, I can't
have ma you can see that we are getting an error. In order to store multiple characters,
we have another kind of variable in which we will talk about that in a minute. But before
I do that, I'm going to show you just one more thing. You can also store something like
this in your character, you can say backslash u 00. A, this is a special Unicode value for
registered symbol. Let's run the application and see what would be the result, you can
see that the Registered Trademark has been printed into our console. When you're using
a char variable. You can also assign Unicode values as well. You can search for different
Unicode values. For example, if we want to show the copyright symbol, we can say something
like this, we can say backslash use 00 a nine. If you've run the application, we should see
the copyright symbol Feel free to search for other Unicode values on the internet. Okay,
now let's talk about the string. If we want to restore multiple characters, we can use
a string, we can say a string with capital S. After that, like before, we can name our
string, let's say my string or Let's name it name is equal to Mesa meaning like before,
if we want, we can print our string. Let's fascinate and let's run the application, we
can see that Mesa has been printed into our console. But you may have noticed that there
is a difference in here, the color of this string is not blue, like the other kinds of
variables. That's because of a very important difference between a string and other kinds
of variables. The other kind of variables that we have talked about so far are primitive
data types. But a string is a class in Java, do we have talked about classes and objects
in Java, but for now, just know that when you are using a class, you can have some operations
on that. For example, if you type name, you can say dot and you can see a list of different
available methods. We will talk about few of them later on in the course. But you can
see that there are a lot of them. So the difference in here is that the string is a class, but
others are primitive data types. There is one more kind of variables that I'm going
to talk about in here, and that's called Boolean. Let's see that as well. We can say Boolean,
my Boolean, let's say is equal to true when you're using a Boolean, that Boolean can have
only true or false values. These are the only two values that a Boolean can have. Once again,
like before, we can print our Boolean. Let's pass my Boolean in here. And let's run our
application, you can see that true has been printed. As I said, Our Boolean can have false
values as well, let's run the application. False has been printed Boolean is very helpful
when you are working with conditional statements. We will talk about conditional statements
in the next video. Okay, this was our talk about different variables in Java, there are
a few more of these in which you can check out the Oracle documentation, but probably
you're not going to need the others. These are all that we are going to use in this course.
Okay, now that we have talked about variables, let's quickly talk about arithmetic operators
as well. But before that, I'm going to comment all of these lines of code, because these
can be distracting. The reason that I'm commenting these lines of code and not deleting them
is that I'm going to upload the source code so that if you need, you can check the source
code. Okay, let's move on down in here, let's quickly define two new integers, I can say
int a is equal to six. After that, let's say int b is equal to let's say two. You can use
operators in Java, in order to perform some kind of operation on your variable. We have
different kinds of operators. The first one that we're going to talk about in here is
called arithmetic operators. Let's quickly see them. For example, here I can say, answer
is equal to a plus b. This plus is the first arithmetic operator that we are going to talk
about thinking, this is going to add the value of B to A, let's quickly print our answer. And let's
run our application, you can see that the answer is eight, it has added B to A. The
other kind of arithmetic operator that I'm going to talk about in here is minus which
you can guess its value, it's going to deduct B from a, the answer in here should be four,
we can see that four has been printed. The other one is the star, which is used for multiplying
the two values together in here, the answer should be six times two, which is going to
be 12. Let's run the application. And you can see 12 in here, the other one is slash,
which is used for division, we are going to divide six by two, let's run the application,
we can see that the answer is three. The thing that you need to be extra careful with this
a slash operator in here is that the second number V in this case should never be zero.
Let's quickly change the value of b to zero. And let's see what will be the result. Let's
run the application, you can see that we are getting a read error in here we are getting
an arithmetic exception. We will talk about exceptions later on in the course. But for
now just know that whenever an exception occurs, our application crashes. Certainly we don't
want that behavior in our application. So be careful about the second number. Or alternatively,
you need to catch the exception that you think that might occur. We will talk about exceptions
later on in the course we have one more kind of arithmetic operator in Java, and that's
called remainder. Let's see that as well. It's the person so the remainder operator
is going to give us the remainder of a divided by b. In this case, if we divide six by two,
the answer is three. And its remainder is zero. So right now if I run the application,
I should see zero. You can see that zero has been printed down in here. But if I change
the value of a to, let's say five. Now the remainder of five divided by two is one. Let's
see that if we can see one. Yes, it has been printed from time to time this remainder operator
can be useful as well. There is one more thing that I need to talk about the slash operator
the division operator right now we can expect that if we divide five by two, we should see
2.5. Let's run the application and see if we can see that we can see that we are getting
two as the answer. And that's because we have saved the answer inside an integer. If you
remember at the beginning of this video, I said that integers can only contain whole
numbers. If you want to have floating point numbers, you can use something like double.
But this in here is not going to work as well, because the answer itself is an integer. If
you hover over the highlight, you can see that a divided by b is an integer. If you
want to cast your number to a double after the equal sign, you can open and close parentheses
and inside the parentheses you can say Java, this way you have cast an integer to a double.
Now if we run our application, you can see that we are seeing 2.5 so if you want to see
the exact value of division use doubles. Let's just talk a bit more about the plus operator.
After that finish off this video. So right now if I use plus in here, you can guess the
answer, five plus two is seven. Let's run the application. We can see seven down in
here, we can also use this plus with different texts. For example, if I have to text in here,
let's say string first name is equal to, let's say, Emma. Let's also define another text.
Let's say last name is equal to Watson, we can use the plus operator to add these two
text together. For example, let's say a string. Full Name is the call to first name, plus
our last name. If we print our full name, you can guess what would be the result. In
here we can see Mr. Watson. Let's also add a spacing here in order to see everything
better. Mr. Watson has been printed. This in here is called concatenating in Java, adding
two text together. So you can see that this plus operator have two usages, it can be used
to concatenate two text together or whenever we use it with different numbers, it will
act as the addition operator. We are going to talk about more operators in Java. Specifically,
we will talk about relational and logical operators. Before doing that, let's quickly
create our project by selecting create new project by selecting Java and clicking on
next. And next once again, we can name our project. Let's name this project operators.
Let's create our project. And inside the source folder, let's create our package. Let's say
new package. Let's name it orc. That's my code dot operators. Inside our package, let's
create our main class. Let's name this class main. Inside our main class, we are going
to need our main method. Let's type PS VM. By pressing tab, we have our main method.
Before I talk about relational and logical operators. Let's quickly talk a bit more about
arithmetic operators. If you remember from the previous video, when we have to find a
new integer, for example, a and we assign a value to that we could have say something
like this, we could have said in answer is equal to a plus two. Or instead of defining
a new integer, we can say a is equal to a plus two, it means that increase the value
of i by two, let's print a and see what would be its result. Let's run our application because
it's the first time I'm going to say run main dot Hello, you can see that the value of a
is seven, we can simplify this line of code, we can say something like this, I'm going
to comment that, and in here, I can say a plus equal to let's also add some spaces,
these two lines of code are exactly the same, you can use plus equal in order to simplify
the line six, let's run our application. Once again, you can see that the result is the
same. Also, if we want to increase a by one, for example, if you want to say a is equal
to a plus one, we can do something like this, we can say a plus equal one. Or alternatively,
we can say a plus plus, that is possible as well, this a plus plus is going to increase
the value of A by one. If we run our application, we should see six as the value of a you can
see six down in here. Alternatively, we can use minus as well, we can say a minus minus
it will deduct one from the value of a, if you're on our application, we can see four
in the console. Similar to that we can say a minus equal to let's say two. For example.
In this case, if we run our application, we should see three as the value of a like minus
equal You can also have multiplied equal and also divided by equal it means that divide
a by two and store the value or a store the answer inside a this sentence in here is the
simplified version of this line of code that I'm going to write we can say a is equal to
A divided by two, both of these lines are the same. If you want to make sure of that
you can delete this line and you can run your application. five divided by two is 2.5. Because
we are saving that inside an integer, the answer should be two. So we should see two
as the value of our a and you can see two down in here. Before talking about logical
and relational operator. I just wanted to talk about these simplifications. Okay, now
let's talk about relational and to be specific comparison operators in Java comparison operators
are useful for when you want to compare two things. For example, two numbers. Before that,
let's quickly define two numbers. I'm going to say int a is equal to five After that,
let's say int b is equal to, let's say three. After that we can say Boolean answer is equal
to the first comparison operator that I'm going to talk about in here is greater than
operator. And the way to define that is like this, we can say, a greater than B, I have
saved the result of this comparison inside a Boolean, this left anchor bracket in here
means greater than operator, it means that if a is greater than B, assigned the value
of true to this answer, right now, if we print our answer we should see through, let's quickly
do that. Let's see answer. And let's run our application, you can see that answer is true,
because A is five and five is greater than three, the other kind of comparison operator
is less than, and that's this right angle bracket, right now, a is not less than b,
so the answer should be false. If we run our application, we should see false in the console.
And we can see that the other kind of comparison operator that I'm going to talk about in here
is useful for when you want to compare the equality between two integers. And that operator
is these two equal signs, right now, a is not equal to b. So if we run our application,
we should see falls into our console. Let's run our application. And here we can see false.
Remember that when we are using two equal signs, it means that we are checking for the
equality of two number. But when we are using a single equal sign like in here and above,
in here, we are assigning a value to our variable. Let's change the value of b to five. To see
that if this is going to be true, let's run the application. Now you can see
that the answer is true. We have other kinds of comparison operators as well. One of them
is greater than equal. When we use this left anchor bracket. And also this equal sign,
it means that check if a is greater than B, or if a is equal to b, right now, a is equal
to b. So this answer should be true. If we run our application we should see through,
you can see that down here we see true. Also, if A is five, and B would be something like
three, if you run the application, we should see through once again, we can see through.
But if we change the value of a from five to something like two, because none of these
condition is true, right now, we should see false, let's run our application. And we can
see false, the other comparison operator is less than equal. And we use that like this,
we can use this right angle bracket and equal sign this in here means that check if a is
less than b, or if a is equal to b, right now, a is less than b. So the answer should
be true if we run our application we should see through. But if we change the value of
a to something like five, we should see false. And we can see false. Beside these, we also
have another kind of comparison operator. And that's this explanation Mark plus the
equal sign this in here means that check if A is not equal to b, this exclamation mark
in here as a negative meaning to our equal operator right now, a is not equal to b. So
the answer should be true. If we run our application we should see through and through has been
presented. Okay, these were the comparison operators that I was going to talk about,
feel free to practice them because we are going to use them a lot in our course. Next
I'm going to talk about logical operators in Java. But before that, let's quickly comment
these two line of code down in here, let's define a new Boolean, let's say Boolean answer
is equal to let me write the syntax and I will talk about it, we can say a is equal
to five, or let's say B is equal to something like two. This is our first logical operator
this in here means or you can add these two pipelines by using shift plus backslash backslash
is somewhere above the enter in English keyboard. So in here, this OR operator means that if
a is equal to five, or if b is equal to two, assign through to this answer, if none of
this condition is true, so assigned false to this answer, right now, a is equal to five
at least one of our conditions are true. So the answer should be true. So if we print
our answer, we should see through, let's run the application. And you can see through down
in here, if we change the value of a for example to six, because none of these conditions are
true, we should see false. Let's run the application. And then here we can see false. The other
kind of logical operator that I'm going to talk about is to add science. Let's quickly
see that as well. This in here is an operator it means that assign through to answer if
both of these conditions are true, if A is equal to five and also if B is equal to two
if one of these conditions is not true, so assign false the answer right now, none of
these conditions is true. So we should see false as our answer. Let's run the application.
And as you can guess, we see false. If we change the value of a to five, and run our
application, once again, we should see false, because the second condition is not true.
But if we change the value of v2, and run our application, this time we should see through
and we can see through them here. And these were the two kinds of logical operators that
I was going to talk about or and and now that we have talked about operators that we wanted,
let's talk about conditional statements, I'm going to comment these two lines of code.
The first kind of conditional statements that I'm going to talk about is called if statements,
we can type something like that we can say if a pair of parentheses inside the parentheses
we need to provide our condition. For example, we can say if a is greater than three, after
the parentheses we need a pair of curly braces inside the curly braces, we can put our code
for example, let's say a is greater than three. So in here, we are saying that if our condition
is true, execute the code inside the curly braces. If it's not true, jump to after the
curly braces. For example, in here, let's say continue. Right now a is five, and it's
greater than three. So we should see this text printed, let's run our application, you
can see that a is greater than three. But if we change the value of a to something like
two and run our application, you can see that
we are no longer seeing this text in if statements we can also have multiple conditions. For
example, in here, I can say else, I can provide another pair of curly braces inside these
curly braces, I can say something like this, I can say a is less than three. Right now
a is two, a is less than two. So we should see only this text printed, let's run our
application, you can see that a is less than three. As for the condition, you can provide
your condition like this directly inside your if statement parentheses or you can define
your Boolean before your if statement. For example, in here, if I say Boolean answer
is equal to a greater than three. Now I can pass my answer. inside these parentheses,
I can say if answer is equal to true, let's minimize this ramping for now. This is going
to work the same path. If you hover over the highlighting here, the intelligent ID is warning
me about something the first one is that answer equals equals to true can be simplified to
answer it means that I can delete this part, this is going to work exactly the same. If
we run our application, we should see the same result a is less than three. Let's run
our application. And you can see a is less than three. If we want to negate this answer,
we can add an exclamation mark before our variable. For example, in here we can say
if answer is not equal to true, if we run our application, we should see the first line,
we can see that a is greater than three. This is not true because A is true. But in here
we have changed the meaning of this brilliant, we have added a negative meaning. Let's delete
this for now. And let's run our application once again. Besides else, you can also have
an else if as well. Let's briefly comment this if statement. And let's write another
one. down in here I'm going to see if inside this if statement. Let's check that if a is
positive or negative, I can say if a is greater than zero, inside the curly braces, let's
print as positive. In here instead of else, I can use something like this, I can say else
if now we need to put another condition in here we can say if a is less than zero. Once
again, we need a pair of curly braces. Inside the curly braces, we can say a is negative.
You can have as many elsif cases as you want. For example, I can add another one in here.
But of course in here, I don't think this if statement would mean anything. But you
can have as many as you want. But in every if statement you can have at most one else
case, let's delete all of these. For example, I can have only one l space this else is going
to be the default case. In this case if we use this else, it means that a is not greater
than zero. And also it's not less than zero. So it is zero. In here we can safely say a
is zero. This is going to be the default case for our if statement right now A is true.
So we should see a is positive. Let's run our application. And as you can see a is positive.
Let's change a to minus two. If we run our application, you can guess it, we should see
a is negative. And we can see that down in here. If we change the value of oil to zero,
we should see a zero. And as you can see, we can see that down in here. So if statements
are one kind of conditional statements, we have another one as well, let's comment all
of these, the other one is called switch statements. Let's see that as well, we can say switch
inside the parentheses of the switch statement, we need to provide the variable that we want
to switch on. For example, I can pass a in here, after the parentheses, I can provide
a pair of curly braces inside the curly braces, I can define different cases. For example,
I can say in case a is equal to one after that we need a column. And in case a is one,
we can print something for example, we can see a is one. Also, it's very important to
provide a break after every case, let's do that. I will talk about this break in a minute.
But for now, just know that after every case, you are going to need a break, we can define
as many case as we want. For example, in here, I can say in case a is to screen something,
let's say a is two. After that we need a break, we can define another case. For example, for
three, let's say a is three. In every switch statement, we are going to need a default
case as well. And we can pass that like this we can say default. And we can print something
like a is not one two, or three. In the default case, we need the break as well. Let's quickly
add that, right now the value of a is zero. Let's change that to two. And you can guess
it we should see a is two, let's run the application. And you can see a is two, if we change the
value of a two once again zero and run our application. You can see a is not one, two
or three. Let's also talk about this break in here. But before that, let's quickly change
the value of eight to one. This break in here will cause our switch statement to break.
For example, if we don't have this break in here at the first days, which is a is equal
to one. And if we run our application, you can see that even though a is one we can
see both sentences, we can see a is one plus a is two in here. Because we don't have any
break, we didn't break out of the switch statement. And we have jumped to the second statement.
So don't forget to have a break after each case in your switch statement. We are going
to talk about loops in Java. But before that, let me just say that I have created my project,
I have added this package inside my source folder. Inside this package we have only one
main class in which has this one main method, I hope that you can come to this point by
yourself. If not, please watch the previous videos on how to create a project and create
your main class and your main method. In programming loops are useful for when you want to do a
repetitive job. For example, if you want to print something 10 times like this in here.
If you want to print this Hello 10 times you can just copy and paste it 10 times what in
general, it's a bad idea that you copy and paste yourself whenever in programming you're
copying and pasting know that you're doing something wrong. Instead of copy and pasting
we are going to use loops in this video. The first kind of loops that I'm going to talk
about are for loops. Let me write it and we will talk about its syntax. This is the general
syntax of a for loop first of all we write for. After that we have a pair of parentheses
inside the parentheses we have three statements in the first statement we are defining a new
integer called oil you can name your integer whatever you want, and also we are initializing
our AI to have a value of zero. The second statement is the condition of our for loop
we are going to continue this loop until this condition is not met. And the third statement
is just a statement for changing the value of i every time that we look PVC inaction
what all of these mean after the parentheses we have a pair of curly braces in which we
can contain our code inside them. For example, if we want to print something like hello here,
we can include that inside this pair of curly braces. So what this for loop is going to
do is that first of all we are defining a new integer called AI and we are assigning
the value of zero to that integer. After that we are checking our condition we are checking
that if i is less than 10 in the first time that we are going to look i is Hello So this
condition is met. If this condition is true, we are going to execute the code inside the
curly braces. In this case we are going to print hello. After printing Hello, we are
going to execute the third statement. In this case, we are going to increase the value of
i by one. For the next time that we are going to loop first of all we are going to check
our condition we are checking that if I is still less than 10 or not. For the second
time I is one, I still is less than 10. So, we are going to execute our code. This circling
here is going to continue and continue until our condition is false. When it's false, we
are going to break out of the photo. So in this case, we are going to print hello 10
times, let's run our application. And let's see if we can see Hello 10 times, you can
see that we have printed Hello 10 times it seems to be perfect. Instead of 10. You can
put any number that you want in here, for example, you can say five, if you execute
your program, we will see that Hello would be printed five times, instead of this five
in here, you can pass a variable for example, if you had a variable before this for loop,
if we had int a is equal to five in here, later on, we can pass a instead of five to
this photo. For example in here instead of five, we can say if you run the application,
we should see the same result. Inside our for loop we can also have access to the eye
itself. For example, instead of printing Hello, we can print by, let's quickly paint that
as well. And let's run the application, you can see that we are printing the numbers zero
to four. Okay for loop is one kind of loops in Java. The other point is my loop. Let's
briefly see that as well. Once again, I'm going to write the syntax of while loop and
we will talk about it after that. This is the general syntax of a wild loop.
First of all, we type void. After that we have a pair of parentheses inside the parentheses
we have our condition, in this case, a less than 10. After that we have a pair of curly
braces and inside the curly braces we have our code. In this case we are going to print
hello, notice that we are not changing the value of a so this condition is always true.
And if I run my application right now, we are going to stuck in an infinite loop. Let
me quickly run the application and see what an infinite loop looks like. But before that,
let me comment this for loop, you can see that no matter what happens, we are inside
an infinite loop we are printing Hello indefinitely. In some cases, this might be our desired behavior.
But in most cases, we probably do not want that we can exit our application by pressing
on this red button, we can also check our exit code which is negative one in a normal
application, we would get zero. Okay, but how can we exit a wild? There are multiple
ways for that the simplest way is to change the value of a inside the void loop. For example,
after printing Hello, I can say a plus plus, in order to increase the value of a so that
it won't be the same every time that we are going to loop through this while loop. So
for example, for the first time a is five, so our condition is true. So we are going
to execute these two line of code, we are going to loop through the cycle until a is
10. when that's the case, this condition is no longer met. And we are going to break out
of the Void loop. Let's run the application one more time. This time you can see that
we have only printed Hello five time. And also this exit code is zero which means that
we have exited our application successfully without any error. The other way that break
out of avoid loop is to add a break. Let me quickly add that this time after the first
loop we are going to break out of the while loop it means that we are going to print hello
only once. Let's run the application. And in here you can see that we have printed Hello
only once inside while loops we have another keyword called continue. Let's quickly see
that as well. I'm going to delete this break and before this print statement, I'm going
to put an if statement. Let's say if A is equal to eight. Then let's continue. This
continuing here means that go to the next record of your while loop go to the next round
of looping. It means that no matter what is the rest of the code inside the viable break
out of the while loop and go to the next record, so for example in this case, if A is five,
six or seven we are going to print hello. But if a is eight you're not going to print
hello. After that we are going to print hello in case if a is nice. If you don't want to
stuck in an infinite loop, you also need to change the value of a software inside the
while loop. For example before this if statement, I can say a plus was right now if I run my
application, I should say hello only four times, because if a is eight, we are going
to continue the loop, it means that we are going to jump to the next record and we are
not going to print hello, let's run the application and see if we can see Hello four times. And
as you can see, we are seeing Hello four times. So continue is a useful keyword for when you
want to jump to the next record. Okay, now that we have talked about why loop let's also
talk about another kind of loops in Java, the value of A in here is five. If we change
our condition to let's say a less than five, we know that this condition is no longer true.
So we are not going to go inside the violin, it means that we are not going to run the
code inside the void loop. Let's run the application, we shouldn't see any Hello printed into our
console. And as you can see, we can't see any Hello. But in some cases, you may want
to go inside the while loop at least once no matter what the condition is. For those
situations, you can use do while loops. Let me comment this while loop and let's create
a divide loop. It's a lot like via loops, you need to type do inside the curly braces,
you need to put your court for example, we can say System dot out dot print line. And
you can print hello, after the curly brace, we need to say why. And inside the parentheses
you need to specify your condition for example, we need to say a less than five, after the
parenthesis you need a semicolon, of course, in this case, because A is equal to five,
this condition here is not true. But even with that condition, we should see this Hello
at least once because we are using two wild loops. Let's run the application. And let's
see if we can see Hello. As you can see, we can see Hello only once. So do while loops
are useful for when you want to execute your code, at least one no matter what the condition
is. We also have another kind of loops in Java called for each loops. But I'm not going
to talk about that in here. Because I think that if we know about different arrays and
collections, and in regard to that if we know about object oriented programming, we will
understand it much better. So I'm going to talk about for each loops after we have learned
about all those stuff. Okay, I think that's enough for loops. Now we are going to have
a quick challenge. But before we have our challenge, we need to know about two more
things, we need to know how to get the user's input. And also we need to know how to generate
a random number. Later on, we will see that how these two are going to be useful. In order
to get the users input, you can use something called a scanner. The syntax in here might
not be familiar to you because we haven't talked about object oriented programming.
But we are going to need that in our challenge. Because we want to have an interactive challenge.
If you don't understand the syntax, just copy and paste the code that I'm writing in here.
In order to define a scanner, you can type something like this, you can see the scanner
with capital S, notice that it's coming from Java dot util package. After that, you need
to name your scanner, which I'm going to say a scanner, after that you can say is equal
to new scanner. Once again, with capital S inside the parentheses you need to say system.in
we have seen system dot out which was useful for outputting something system that is useful
for when you want to get the user's input. Now you have a scanner, you can get a number
from user like this. You can say int answer is equal to a scanner, dot next int this one
down here by saying a scanner dot next int our scanner is going to wait for the user's
input until the user enter some number. We will see that in action in a minute. But before
that, let's quickly output something. For example, let's say answer was plus the value
of answer. Also, let's type something before our scanner. Let's say please enter a number.
Let's run our application. And let's see what these few lines of code are going to do. You
can see that we are saying please enter a number text. And in here console is waiting
for the user to enter a number. For example, I can say five by pressing Enter. You can
see that answer was five. And we have exited our application successfully. So by using
a scanner, you can get the user's input. Besides integers beside number, you can also get a
text from user if you want. Let's quickly see that as well. First of all, let's go Something,
let's say enter your name. After that, I can say something like this, I can say the string
name is equal to scanner dot next, you can see
that this next method is going to return a string. Don't worry about all of these new
stuff, method, scanner classes, object oriented programming. We will talk about all of these
later on. But for now, because we are going to need the user's input, we are going to
figure out a way to receive that. So by using scanner dot, Next, you're going to get the
user's name. And after that, let's create something. Let's say hello, close the name
of the user. Let's run our application once again. In here, first of all, we need to enter
a number. Let's add four. After that the scanner is waiting for my name, let's say Mesa. And
we can say hello Mesa message. So this way we can get the user's input. Let's also see
how we can generate a random number. I'm going to comment these lines of code for now, in
order to generate a random number, you can say something like this, you can say random
with capital R, let's name it random, is equal to new random. And we don't need to provide
anything inside the parentheses. After that, in order to generate a random number, we can
say something like int number is equal to random dot next int, this method in here is
going to generate a random number. let's print that number. That's the number plus the number.
Let's run our application. Once again, you can see that we have this random number. It's
also useful to specify a domain for your random number. Right now, our random number is this
weird negative number, it might not be useful, it's good to define a domain. In order to
define that domain, you can pass a number to this next int method. For example, if I
put 20 in here, and if I run my application, once again, the number should be somewhere
between zero and 19. If you want your random number to be somewhere between one to 20,
you can simply add one in here, we can say plus, but let's run the application. Once
again, we can see mine this time. This numbering here is completely random. It means that every
time that we were on our application, we should see a different number, you can see that we
are generating different numbers. Okay, now that we know how to get a random number and
also how to get the user's input, it's time for our challenge. Here is our challenge we
are going to create again, the concept behind this game is to generate a random number and
ask the user to guess that number. continue asking the user until you receive the correct
number. Also, to make everything more fun. After five times of guessing gronke show a
game over message to the user. Here is how our game is going to work. First of all, we
are going to show a welcome message. After that we are going to ask for the user's name.
And we are going to say hello to the user. After that, we are going to ask for the user's
permission to start the game. If you received a positive answer, we are going to generate
a random number and we are going to ask for the users guests. If the guest is correct,
we are going to show a congratulation message and quit the game. If the guest is wrong,
we are going to ask again until we receive the correct number. Also, as a hint to the
user beside the first time, every time that you're asking for a number tell the user to
guess higher or lower. For example, if the random number is 10. If the user has guessed
seven for the first time, tell him to guess higher if the user failed after five times,
show a game over message and quit the game. This challenging here is the combination of
everything that we have learned so far. So make sure to practice before watching the
next video, it's going to help you a lot. Okay, go solve the challenge. And after that,
come back to the next video so that you see my solution for this challenge. See you in
the next video. I hope you solve the challenge but if not, that's totally okay. After all,
it's your first encounter with Java. And it's the first application that you're writing.
In this video, we are going to solve the challenge together. Let's start by creating a new project.
Like before, I'm going to select Java next. Once again next, let's name this project gets
me going. Let's create our project. And inside our source folder, let's create our package
and Java file. Let's name this package or that may code that gives me a new Java class. Let's name
it main. Inside our main class, let's type p SVM and now we have our main method. Okay,
first of all, we are going to show some welcome message to the user. So let's say System dot
out dot print line, let's say welcome to Wonderland. After that, we are going to ask for the user's
name. So let's say Please enter your name, or marry have your name. After that, we need
to receive the user's name, in which we need a scanner for that. Let's create our scanner.
Let's say scanner is equal to new scanner system.me. After that, let's say string name
is the call to the scanner dot next, and let's say hello to the user. Let's say hello, plus
the name. After that, let's ask for the user's permission to start the game. Let's say Shall
we start? in here? I'm going to give the user two option. And here are my two options. Let's
say one, yes. And the other, let's say no. But in order to format my text a little bit
better, I'm going to add a special syntax in here in which you haven't seen so far.
By adding backslash T. I'm adding a tab before this. Yes. So this will be formatted with
a tab. Let's add one in here as well. Nothing is special Just for formatting my text a little
bit better. After that, I'm going to save the user's answer. Let's say eight, begin
answer is equal to the scanner dot next int. And after that, I'm going to create a while
loop. Let's say vine begin answer is not equal to one, we are going to continue asking our
question. So let's copy these three line of code and paste them inside our while loop.
After that inside the void loop, we also need to store the new users answer for that we
can say begin answer is equal to the scanner dot next int. This way, if you are not going
to break out of this while loop until the users answer is valid, when it's fun, we have
the permission to start the game. After the void loop, it's time to generate a random
number, let's say random, random is equal to a new random. After death, let's say int
x is equal to random dot next int for the domain, I'm going to say 20. Because I want
my number to be from one to 20. So I need to add a plus one in here. After that, it's
time to ask the user to guess a number. So let's say please get a number. And in here, we need
to save the user's answer. Let's say int, user input is equal to a scanner
dot next int. In here, I'm going to define three new variables and their usage as will
be clear in a minute. Let's quickly define them. First of all, I'm going to save the
times that user has tried the game. So let's say eight times tried is equal to zero initially,
after that, let's define a Boolean, let's say Boolean. As well, initially, it's false.
And after that, a Boolean indicating if we should finish the game. So let's say should
finish. Once again, it's going to be false. Initially, After defining these three new
variables, I'm going to create another vial of let's say, why should finish is not equal
to two. Then, inside the while loop, first of all, I'm going
to increase the times that user has right. So let's say times three plus plus, after
that, I'm going to create an if statement. Let's say if times three is less than five,
then we have the permission to continue. If it's more than five, in the else case, we
need to break out of this while loop. For that, I'm just going to say short finish is
equal to true. This is going to be the last line of our while loop. So if we look once
again, because this condition is no longer met, we are going to break out of the while
loop. But in case the time stride is less than five, we are going to check that if the
users input is equal to the randomly generated number for that I can say if user input is
equal to x, then we need to change the value of husband to true because user has won the
game. And also we need to break out of this while loop let's say short finish is equal
to true. Let's add an else if case to this if statement. Let's say else. if let's say
if users input is greater than r x, which is our randomly generated number, we are going
to tell the user to guess lower for that we can say, guessed lower. And of course, we
need to wait for the new users inputs for that we can say user input is equal to a scanner
dot next int. We also need another case in here in case the number is less than x. If
that's the case, we are going to tell the user to guess higher. And also if you're going
to wait for the new user input, let's say user input is equal to scanner dot next int.
We are done with this void loop, we will review what we are doing in here. But after the void
loop, we need another if statement, we can say if the user has won the game. If that's
true, then we are going to show a message, let's say congratulation. And also let's say
to the user, in which try he or she has won the game. Let's say you have guessed in your
plus times tried plus guess. But in the else case, first level, we are going to show a
game over message. Let's say game over. And after that, we are going to say what was the
number, let's say the number was plus x. This is our
entire application. Let's review what we are doing in here. First of all, we are showing
a welcome message to the user. After that we are asking for the user's name, we are
creating a scanner and after that we are waiting for the user to enter his or her name. After
we received the name, we are waiting for the user's permission to start the game, we are
saving the user's input in here, inside the while loop we are making sure that we have
the permission. If we don't have the permission, we are going to ask again and again until
we have the permission. After that, we made sure that we have the permission, we are creating
a random number, the random number is between one to 20. And after that, we are asking the
user to guess a number. We are saving the user's input in here, we have defined three
new variables in here times through it has one and short finish. Next, we are creating
this viral loop. It starts from here and ends in here. The condition of this viral loop
is vile, we shouldn't finish the game continue the loop. First thing inside this while loop
we are increasing the time stride. So if it's the first time because the time stride is
initially zero, we are changing that to Vaughn. After that we are checking that if times three
is less than five, we are comparing the user's input with the randomly generated number.
If that's equal to a random number, we are changing the value of this husband to true
and also we need to break out of this loop. So we are changing the value of this short
finish to true. But in case the user input is greater than our random number, we are
telling the user to guess lower and also we are waiting for the user's input. But in case
the user's input is less than our random number, we are telling the user to guess higher once
again, we are waiting for the users input in case the time strike is greater than five,
we are just waiting out of the loop. If that's the case, the husband is still false. So we
are checking that in here. If has one is equal to true it means that user has won the game.
So we are showing this congratulation message. Also we are showing that English try the user
has guessed the number correctly. But in case if the user didn't want the game, we are showing
this game over message and also we are showing the random number. Let's run the game and
see if everything is working fine. We are seeing the welcome message. After that it's
asking for our name. Let's put Mesa we are seeing Hello Mesa after that we are seeing
the message for our permission, shall we start or it was better to say Shall we begin? Let's
say to know once again, we are seeing the message. This is our first wide look. Also
this formatting here is because of that backslash t that I have used when I have created this
text I'm talking about this one, this backslash t in here. Also beside one and two. If you
enter any other number, we should see this message once again. So let's say three for
example. You can see that we are seeing the message. Okay, let's say Yes to continue.
The console is waiting for us to get a number. Let's say 10 it says gets lower, let's say
five. It seems like I have won the game in my second Troy. Okay, let's run the game once
again. May I have your name? Let's say Mason. Yes. Let's begin. That's guess another number.
It says that gets lower, I'm going to guess higher in order to debug all the features
of the game, let's say 1112 1315. You can see that after five Troy, I can see the gameover
message. And I can see that the number was nine. Okay, it seems like our application
is working perfect. Just before I finish off this video, let's change this message in here
too. Shall we begin? I think that's better. Okay, this was our challenge. I hope you solved
it if you did do celebrate, but if not, that's okay. Later on in the course, we are going
to practice all of these many more times so that we make sure that we have learned everything
that we see in the course. Okay, I think that's a good point to stop the video in here. Just
before I do that, I'm going to say that in the next video, we are going to talk about
arrays in Java. See you in the next video. In this video,
we are going to talk about arrays in Java. Up until now if we wanted to store some simple
data, for example, a number or maybe a text, we could have used variables. For example,
we could have said int a is equal to five. But what if we want to store a list of different
variables for example, a list of names or a list of students. for storing a list of
variables, we have multiple options in Java. The first one that we are going to talk about
in this video is called array, let's see how we can have an array of for example strings.
For that we can say for string. After that, we need a pair of square brackets. After that,
we need the name of our array. For example, I can say students, next I can say new string
once again with a pair of square brackets. This new keyboard in here is simple English,
it means that we are defining a new array of strings inside this square bracket, we
can define the size of our array. For example, if we want to serve five different student
names, I can say five in here, as simple as that now we have an array of size five. After
defining your array, you can put some values into it. For example, I can say the students
with an index of let's say, Vaughn is equal to let's put my name in here It may sound
this way, we are assigning this value to the element in which has the index of one in our
array, there is a very important point in here and that indexes in Java starts from
zero. So in here, when I said the students with an index of one, it means that we are
referring to the second element in our array. If you want to assign some value to your first
element in your array, you can say students with an index of zero. Let's see that as well,
let's say is equal to, for example, so we can keep doing this for all of our elements
inside our array. Besides assigning values to your array elements, you can also get the
value of those elements as well. For example, in here, we can say print the value of a student
with an index of two. You can guess it in this case, it should be Tom. Let's
run the application and see if we can see Tom. As you can see, Tom has been printed.
This is one way of assigning different values to your array elements. The other way is like
this, you can assign different values at the time of creating your area. For example, in
here I can see a string array, let's name it employees is equal to instead of saying
new string array, I can pass a pair of curly brace. And inside that curly brace, I can
pass my values. For example, I can say Mesa, or every other value that I want. So these
are the two ways of assigning values to your array elements, like a string array, you can
also have other kinds of arrays as well. For example, if I want to put some numbers inside
an array, I can say int with a pair of square brackets, let's say numbers is equal to, let's
say a pair of curly braces. And inside those curly braces, I can pass my values, let's
say one, two, through six. When you're working with different arrays, for loops can be very
helpful to access all of the elements inside your array. For example, if I want to print
all of the values inside this numbers array, I can say something like this, I can create
a folder. Let's say for int i is equal to zero, i less than in this case, the size of
my numbers array is six. So let's say six. After that, let's say i plus plus. Inside
the for loop, I can say print the value of numbers with an index of I. This way, I am
going to print all of the numbers inside my numbers array before running the application.
I'm going to comment this line of code so that we Have a clean console. As you can see
numbers from one to six have been printed into our console. So for loops are very helpful
when you're working with different kinds of arrays. In here, we have hard coded these
six. But what if we don't know the size of our array? For example, if we get some values
from our database or from our server in that case, it might be possible that we don't know
the size of our array. How can we use for loops with arrays, if you don't know the size
of our array for that, we can use a helpful property of different areas. For example,
in this case, I can say numbers, dot length. This way, we don't need to be worried about
the size of our array, we can just use it like this. Let's run the application once
again. And as before, we have printed numbers from one to six. Later on, we will see that
beside primitive data types and strings, we can also have different kinds of arrays for
different objects, for example, for different classes in Java, but more on that later on.
So using arrays is one way of having a list of different items. But there are some limitations
to arrays. For example, the size of our array after the definition is immutable. Let me
show you what I'm talking about. In here. When we define our students array, we have
set the size to be five. But what if we want to change the size of our array, for example,
what if we want to define a sixth element? For example, if you say the students with
an index of five, let's say Brian, if you hover over these five, you can see that array
index is out of bounds, it means that these elements in here cannot fit in our array.
For example, if we try to reach to that element, you should see a problem, let's say print
the students with an index of five. Before that, let's comment this line of code. Let's
run our application. As you can see, we are getting an exception in here. Once again,
when we get exceptions, it means that our application crashes. And the exception type
in here is array index out of bounds exception, which means that the sixth element does not
exist in our array. So arrays are immutable after you define them, you cannot change their
size. This is one of the limitations of simple arrays in Java, there are others as well.
For example, you cannot do that much with your arrays. later on. When we use other kinds
of collections in Java, we will see that we have all kinds of operations on our array
elements. But I'm not going to talk about other kinds of collections in here because
I think that it's better to talk about them after we know about object oriented programming.
Later on in the course, we will talk about other kinds of collections like array lists
and maps. Just before I finish off this video, I'm going to write a simple application in
which will help us to practice what we have learned about arrays. Before that, let me
comment all of these lines of codes. And let's start creating our application down in here.
In this application, I'm going to simulate the contacts application on the phone, I'm
going to show a list of different contacts names on a phone for to the user. And after
that by typing the contacts name, we are going to give the user that contacts number. In
order to simulate that first of all, we are going to need a string array, let's say a
string array names is equal to let's pass our names directly. Let's say Mesa. After
that, we need a list of different numbers for that I'm going to create that integer
array. Let's see numbers is equal to and let's initialize our array. After that, I'm going
to show the name of all of the available contacts on the phone. So let's create a for loop.
For int i is equal to zero, i less than names that length, and i plus plus. let's print
the names inside our names array. Let's say print names with an index of I. After the
for loop, I'm going to ask the user to enter a name. So let's say print. Let's say please
enter a name. After that we need our scanner. So let's create that is equal to new scanner
system that mean after that, let's get the contacts name. Let's say the string name is equal to a scanner dot next. Then I'm going
to create a for loop and inside that loop I'm going to find the index of the contact.
So let's say for int i is equal to zero. i less than names, dot length, i plus plus.
Let's write an if statement in here. Let's say if name is equal to names with an index
of joy. Then inside this if statement we are going to print the contacts number for that
I can see print numbers with an index of pi. But right now there is a problem with my code,
I'm not sure that if it's going to work fine or not, and that's because of these two equal
signs in here. Let's run the application and see if it's going to work. Let's enter our
name in here. Let's say Sarah. And as you can see, nothing has been printed. Let's talk
about these two equal signs in here. If you hover over the warning in here, it says that
the string values are compared using two equal signs not equal with a pair of parentheses.
The problem in here is that when you're using two equal signs, you are checking for the
equality of two strings by a reference, I'm talking about the reference inside the devices
memory Ram. Whenever you are storing a variable, that variable allocates some space inside
the device's memory RAM, and that allocated a space has some address. And that allocated
the space has some reference in which we are comparing those two references in here together.
So even if the value of two strings in here can be the same, but the reference might not
be for that reason, it's not a good way to compare two strings by using these two equal
signs. Instead of using these two equal signs, there is a better option for comparing two
strings, and that's the equals method. Let's see that as well. In here, I can say name,
dot equals, and inside the parentheses, I can pass the other string. For example, I
can say names with an index of I. If you remember from the previous videos, I said that the
strings are not primitive data type, and they are objects in Java. And because they are
objects, we have some properties on our strings. For example, this equals method. Once again,
we are going to talk about methods later on in the course when we talk about object oriented
programming. But for now, just know that there is a method called equals in our string class,
in which we can use to check the equality of two strings by the values. So now, if you're
on our application, we should get Sarah's number. Let's run the application. In here,
once again, let's see Sarah. And as you can see, we are getting the number. Let's also
check that if you're getting the correct number, Sarah is the second contact in our array.
And the second element in our numbers array is this number in which we have printed into
our console, it seems like our application is working fine. Okay, I think that's enough
talking about arrays in Java. In the next video. Finally, we are going to start talking
about object oriented programming. That's a very important topic, and it's going to
help you a lot to understand Java, so make sure to Don't miss the next two or three videos.
See you in the next video. As I said at the end of the previous video,
in this video, finally we are going to start talking about object oriented programming.
Up until this point with the help of variables, we could have defined simple data types. For
example, if we wanted to have numbers, we could have say int number is equal to five,
four. Similarly, we could have defined characters, texts, and all sorts of variables that we
have talked about in previous videos. But what if we want to have a more complex data?
For example, how can we define a car in Java or a phone or every other object that you
can think of? Well, that is possible with the concept of object oriented programming.
In object oriented programming, you define your own objects, the core component of object
oriented programming our classes. Right now you can see that we are inside the class,
this class is named main. But if we want, we can create our own class as well. Let me
quickly delete this line of code. And let's create a new class. For example, inside my
source folder, inside my package on the package, I can right click and by selecting new Java
class, I can create my class. In here I need to name my class. For example, I can say phone,
notice that there is a convention, you need to use upper cases for the first letter of
the name of your class. Also, you cannot have spaces or some strange characters as the name
of your classes. So in here, I'm just going to simply name my class form. Notice that
there are other options in here as well for example interface and you know, later on we
will talk about them but for now, let's just create a class the one that has the CI con.
By pressing Enter, we can create our class. This is how a class looks like it lives inside
the package right now its package is altered. maker.org is section one. Also if you take
a look at the left pane here you can see that a new class has been added into our package.
Every class has the keyword class in its declaration. Also every class has a name and besides This
too has an access modifier. We will talk about access modifiers in few minutes. But for now
let's continue on. Every class has a pair of curly braces in which we can put our code
inside them. A class is going to represent an object. In this case, we are going to represent
a phone. If you think of different objects, objects can have different properties. For
example, in the case of a phone, a phone can have some amount of memory RAM, it can have
a screen size. Beside that it has a name, and all sorts of other properties that you
can think of. When you define a class, you can have properties for your classes as well.
For example, in this case, if we want to give some properties to our phone class, we can
say something like this, we can say the string name. Now we define a property called name
for our phone. Notice that I'm not initializing the property of my class in here, I'm not
giving a name to my phone. And that's because when we declare a class, we can reuse that
class, we can create multiple instance of that class with different properties. For
example, if we define a new iPhone, the name would be iPhone, if we define another phone,
the name of that phone might be different. So for that reason, I'm not initializing the
properties of my class, let's add a few more properties to our phone object, let's say
in screen size. Beside that, let's say in memory Ram. After that, let's say int camera.
So now that we have created this simple class, we can instantiate it, we know for sure that
the starting point of our application is this main method inside our main class. So if I
need to instantiate my class, I need to do it in here. And here is how you can create
an instance of your class you type the name of your class, you can see that when I typed
the name of my class, I'm getting some suggestions from IntelliJ. Sometimes you may get multiple
options. And that's because different classes with different names can live in different
packages. For that reason, always take a look at the package that your object lives in.
In this case, I am going to just import this class. After that you need to name your instance
for example, I can say iPhone, next I can say is equal to new phone. This way with the
help of this new keyword, we can create a new instance of our object. Now that we have
created an instance of our class, we can have access to the properties of our objects our
class, for example, if you want to define some property for our class, we can say something
like this, we can say iPhone dot, let's say name is equal to let's name it iPhone 11. With the help of this dot operator, you can
have access to all of the properties or to be precise all of the fields of your class.
Similar to assigning a value to your classes, properties or fields, you can also get those
properties or fields. And here is how you can get them. For example, if you want to
print the name of our iPhone, we can say something like this, we can say print, iPhone dot name.
If you run our application, we should see iPhone 11 printed into our console. And here
is iPhone 11. Similar to that you can have access to all of the fields of your class.
For example, I can say iPhone, let's say memory RAM is equal to eight. Beside properties,
your classes can also have some behaviors. For example, in the case of a phone, you can
play some music with your phone, or you can call somebody. If you want to define some
behavior for your class, you can use methods, let's see them as built. Let's switch back
to our phone class. Here is how you can define a method I'm going to write the syntax and
after that we will talk about it. First of all, our method has a name in this case its
name is play music. After that a method can have an access modifier like we did for the
declaration of our class, we will talk about this public in a minute. After that every
method can have some inputs. For example, in this case, we are getting a string called
trackman. Later on, when we use this method, we need to pass some input to this method.
If you don't want to have any inputs for your method, you can just pass a pair of empty
parentheses. But if you want, you can have one or more inputs. If you want to have multiple
inputs for your method, you can separate those inputs with a comma. For example in here I
can say is drink album name. But I'm not going to do that in here. But you can have as many
inputs as you want. beside a name, an input and also an access modifier. Every method
can return something in this case, it's void, but if you want you can change it. For example,
we can say a string as the return type of your method. You can also have integers or
other kinds of primitive data types. Even you can return another class with your method.
But more on that later on. If you don't want to return any From your method, you can use
the keyword void. Like we did before, we will talk more about the return type of every method
later on. But for now, we are not going to return anything from this method. So we are
going to pass void inside the curly braces of my method, I can put my code for example,
in this case, I'm going to play some music, or at least I'm going to print something.
In this case, I'm just going to say, playing plus the track me. Now that I have created this method, I can
use it in my main class where I have instantiated my object. For example, in here I can see
iPhone dot play music. Once again, you can see that by typing dots, I can have access
to my methods as well. Right now, I'm getting error error in here. And that's because when
I have created my method, I have set an input for it. So when I'm going to use my method,
I need to pass a tracking. For example, let's say our beings are bearing the name of a track.
Let's run the application and see what would happen, you can see that we are playing some
music. So by defining methods, you can have behaviors for your classes, there are a few
reasons for using methods. The first one is that you can reuse your method. For example,
in here, after this line of code, I can say iPhone dot play music, and I can pass a different
track name, let's pass lamenting case this time. If we run our application, you can see
that our methods are being executed one at a time. So the first benefit of using methods
is that you can reuse them. The next one is for organizing our code. For example, imagine
that you want to have some sort of calculation, you can pass all the codes for that calculation
into a method. And by calling that method, you can pass all of those calculations to
a method and later on, you can just call that method in order to do the calculation, it's
going to help us a lot for organizing our code. Also, by using methods, you can encapsulate
things we will talk about encapsulation in later videos. But in here inside your class,
you can define your methods as private, and that method will be accessible only from your
class and not from outside of your class. If you go back to main class, you can see
that we are getting red warning. If you hover over there, it says that this method has private
access. So by using private methods, you can encapsulate different behaviors for your own
class. Okay, now let's talk about this access modifier. You can have access modifiers, for
your methods for your classes. And also for the fields of your classes, I can make this
name private, if I want as well. Basically, we have three kind of access modifiers, we
have private we have public. And also we have protected if you don't use anything as the
access modifier. It's equal to when you use public. So there is no difference between
public string name or just a string name. When you use public as the access modifier.
For example, if I use public in here, it means that this field is going to be accessible
from other classes as well. But if I use private in here, let's say private, if I go back to
my main class, you can see that we are getting a red warning, it means that we can no longer
use this property. So by setting the access modifier of our field or method, that field
or method is only accessible from inside our class, beside public and private we also have
projects that we've been talking about protected later on in the course both private and public
are the most access modifiers that we are going to use in the course for the access
modifier of your class. You can also have private admin group inside there. But usually
you wouldn't do that right now you can see that we are getting a red warning in here.
And the warning says that modifier private not allowed in here. Do you use private mostly
when you use inner classes we will talk about inner classes later on in future videos. But
basically, they are some nested classes inside other classes. When you define them as private
classes, you can have access to those nested classes from the parent class. We will talk
about that later on when we talk about inner classes. For now let's just change this one
to public. There are a few reasons for using private as the access modifier of your fields
or methods. The first one is that you may want to limit the access of your fields or
methods to the class itself and not other classes. For example, imagine that you are
writing some code that you are going to publish for other developers. In that case, you may
want to protect your classes against changes. For that reason, you may want to change the
access modifiers of your fields and also methods to private but now that we have defined the
access modifier of this field, as Private, how can we have access to this name from outside
of this class, there is a way to that, let's quickly talk about it, we can create public
methods. For example, down in here, I can say public as the return type of this method,
I'm going to say void. For the name of this method, I'm going to say set name. As you
can see, when I use the keyword set, I am getting some suggestions from IntelliJ. Basically,
there is a convention among programmers to set the name of the setter methods like this,
an intelligent is smart enough to know the convention. But of course, you can name them
whatever you want. In this case, I'm going to follow the convention. So I'm going to
say certainly, inside the parentheses as the input of this method, I'm going to say, the string, let's say name. Inside this method,
I'm going to change the value of this name to whatever the name that I'm going to receive
via this method. For that I can say this dot name is equal to name, the keyword, this is
referring to the current object that we are in. For example, right now we are inside our
phone object, our phone class. So by using this dot name, we are accessing the property
of this class called name. The second naming here is the input of our method. So we are
setting the value of this name to whatever we receive, we are the input of this method.
Now because the access modifier of this method is public, we can use it inside other classes.
For example, from inside the main class, if we want to set the name of our iPhone, we
can say something like this before that, let's delete this line of code. We can say iPhone
dot, let's say set name. Inside the parentheses of this method, I need to pass the name of
my phone, let's say iPhone 11. So this way, I don't have access to the field directly.
But by using the method, I can change the value of that field. But what if we want to
get the value of this field? Well, we can write another method. And here is how we can
create that method. We can say public as the return type of this method, I'm not going
to say void because I'm going to return this name. So I'm going to say a string. Once again,
there is a convention in here, we can say get name, we don't need anything as the input.
Inside this method, we are going to return something. And here is how you can return
something from a method you type return. After that, whatever you are going to return. In
this case, I am going to return this name. So I'm going to say this dot name. Once again,
this refers to the current object, this dot names means the name inside our phone object.
Now that we have created this method, inside our main class, instead of saying iPhone dot
name, I can say something like this, I can say, iPhone dot get name. If we run our application,
once again, we should see the name of our form. Let's run the application. You can see
that iPhone 11 has been printed. Beside creating these kinds of methods ourselves, we have
another option. If we come down in here, we can use the help of our ID, we can right click
in here, we can go to this generate method. Similarly, we can press ALT plus insert, you
can see that in here we have a list of options. We have getter, we have surfer, and also we
have getter and setter, if we want to create getters and setters, we can select that. After
that we can create the field that we want to create getters and setters for for example,
if we select a camera, and press OK, you can see that Id has created some codes for us,
you can see that these methods are almost identical to the methods that we created above
in here. Because creating getters and setter methods are very usual, Id can help us with
the creating of them. But why are we using getters and setters? Well, there are a few
reasons for that. The first reason is encapsulation. Let's quickly talk about that a bit. For example,
if you don't want to give others the permission to change the value of our fields, we can
delete the setters. In that case, we only give them the permission to get the value
of objects but not set the value of objects or vice versa, we can create setter methods
for our class. In that case, we can set the value of our properties from other classes,
but we cannot get the value of this properties. The first reason is encapsulation. The other
reason is that sometimes in your setter and getter methods, you may want to do some other
operations as well. For example, if you're setting a name for your phone, you may want
to validate that name before setting it. In that case, you can have some validation before
assigning the value to your property. Okay, that's enough talking about getters and setters.
That's greatly changed the access modifiers of have these two private, and let's create
getters and setters for the ones that we didn't create any. down in here after everything,
I'm going to press ALT plus insert, let's say getters and setters. And let's select
both of them, you can see that IntelliJ has created these codes for us. But because we
have changed the access modifier of this memory ram to private, now we have an error inside
our main class in here, instead of saying iPhone dot memory is equal to eight, I can
say something like this, I can say iPhone dot cert memory. And I can pass eight. What
we did in here is one way of instantiating objects, we have defined our object. After
that we have set different values for our object, there is another way of instantiating
your objects, let's quickly see that as well. So if I switch back to my phone class, above
the play music method, I can create something called constructor. Let's use the help of
ID for creating that constructor. Once again, I'm going to go to generate menu. The first
item in here is constructor in here, I'm going to select all of the fields. And I'm going
to press OK. And as you can see, this code has been generated for us this is called a
constructor in object oriented programming. Our constructor needs to have public as its
access modifier, it cannot be private. After that the return type of this constructor is
a phone the exact item that we are in our constructor does not have any name. And as
the input of this constructor we are receiving all of the fields of our class we are receiving
name a screen size, memory and camera inside our constructor we are assigning different
values that we have get for your the input to the fields of our class. Now that we have
created a constructor if we switch back to our main class, we can see that we are getting
a red warning in here. The warning says that expected four arguments both found zero, it
means that now that we have created the constructor, we need to pass the values directly to the
parentheses of this new form. And here is how you can pass them. The first one was the
name of our phone, let's say iPhone 11. I don't remember the
order of things. But the next one was a screen size, let's say five, I believe the next one
was memory RAM, let's say eight, and the other one was camera, let's say eight as well. Now
that we have instantiated our object like this, we don't need to directly set fields
of our class, we can safely delete this also, let's delete this as well. In this line, we
are printing the name of our iPhone. Let's run the application and see if we can print
the name correctly. As you can see, iPhone 11 has been printed. So when you are using
constructors, you need to pass the values of different properties at the time of instantiating
your objects your class can have multiple constructors as well. For example, if I come
down in here, and once again, right click and go to the Generate menu. If I select konstruktor,
this time, I can select different items. For example, in this case, I'm going to select
only name and memory. Now if I press OK, you can see that we have another constructor which
will only receive name and memory run. But if you hover over this phone, you can see
that this constructor is never used. If we switch back to our main class, we can create
another phone and we can use the second constructor. Let's quickly do that. I'm going to do that
after these two line of code. Let's say phone. And this is the beauty of object oriented
programming. When you create a class, you can reuse that class as many times as you
want. For example, in here, I'm going to define an entirely new font. Let's name this one
pizza, let's say is equal to new phone. This time I'm going to use the second constructor
for the name I'm going to save pixel three, and four the memory, I'm going to say 16 you
can see that the ID is happy with this way of defining a new phone. Now we have two different
instances of our phone class having two different kinds of constructors for a class is called
polymorphism in Java polymorphism has other types as well. We will talk about it later
on. Okay, I think that's a good point to stop the video in here. In the next video we are
going to continue our talk about object oriented programming. There are many more things left
that we need to talk about. See you in the next video. In the previous video, we have
talked briefly about classes what those are, how can we create them and also what are the
most usages of a class in this video we are going to talk about some important concepts
regarding to object oriented programming. The first of those concepts is inheritance.
I'm going to talk about inheritance with an example because I think that would make everything
easier to understand First of all, I'm going to create a class called doc. For this doc
class, I'm going to define some properties. For example, I'm going to define a name, let's
say private string name. After that, I'm going to define a color, let's say private string
color. Let's also define the number of legs, let's say private int, legs. And also I'm
going to define a Boolean indicating that if a dog has a tail or not, so let's say private
Boolean, let's name it as tail. Let's also create a constructor for our class by pressing
ALT plus insert, you can see the dialog in here. Let's select all of the fields. Let's
also create some getters and setters for our class as well, once again, by pressing ALT
plus insert. By selecting this getter and setter, we can create getters and setters.
Let's also define a method for our class as well. I'm going to say public void, let's
name this method eat, I'm going to indicate the eating behavior of a dog. As the input
of this method, I'm going to receive a food. So let's say let's drink food. And inside
this method, I'm just going to print something, let's say eating class our food. Okay, nothing
special is in this class. First of all, we have created these four fields. After that
we have created the constructor, we have created our getters and setters. And we have created
this eat method, or we have talked about why I'm doing all of this, let's also create another
class called bird. Let's say bird. For this bird class, let's also have a name. Also,
let's have a color. Let's define two more fields, one for the number of legs, private
int legs, and also another one indicating that if our bird has a tail or not, so let's
say private Boolean, let's say has, for this bird class, let's
also create a constructor, and some getters and setters. I'm going to create my eath method
for this bird class as well, let's say public void, eat. Let's get the name of our food. And inside
this method, let's create something. Let's say eating that food. You probably can see
the pattern in here, there are a lot of similarities between our bird and dog class. Both of those
classes have four fields, they have a constructor, they have all of these getters and setters.
And both of them have this eat method. In programming, this is not efficient, you basically
are copying and pasting yourself. Instead of defining our bird and dot class like this,
we are going to use another concept in object oriented programming called inheritance. For
that, first of all, I'm going to create an animal class. And after that, I will extend
the animal class to the spirit and dog. Let's see how we can do that inside my package,
I'm going to create my animal class, let's say animal. First of all, let's add some fields,
I'm going to use the four previous fields. Let's also copy them from here. And after
that, let's create a constructor and getters and setters and our eat method. Don't worry,
we will reduce the amount of copying and pasting in a minute, let's say public, void eat string
food as the input. And let's print the name of our foot. Now that we have created this
animal class, creating bird and dot class is going to be much simpler. For that I'm
going to delete all of the quotes inside this bird class. Let's delete all of them. This
time, instead of defining all of the fields and constructors and methods, I'm going to
say extends animal. This way we are saying that our bird is an animal, we are extending
the animal class and later on if we want, we can customize our birth class as well.
But right now you can see that we are getting a red warning. And the warning in here it
says that there is no default constructor available in this package. Basically, it says
that you need the constructor, let's press ALT plus insert in here. And let's select
constructor. And as you can see, the ID has generated this constructor you can also see
that even though we don't have any fields in our birth class, we are receiving some
arguments in the constructor. But this constructor has rather a strange syntax. We haven't seen
this super keyword so far. Basically, this super keyword means that do whatever you're
doing with these parameters in the parent class. In this case, our parent class is animal.
So this super is passing all of these arguments to the constructor of our animal class. It
means that It setting all of the values to the fields of our animal. Now that I have
created my bird class like this, if I want to instantiate it, for example, inside the
main class, I can do as before, let's say bird. Let's name it Phoenix, let's say is
equal to new bird. And as you can see, the constructor is waiting for our arguments.
First of all, we need a name. That's past Nina, we need the color, let's say golden.
After that, we need the number of legs, which I'm going to pass to, and a Boolean indicating
if our bird has a tail or not, that's passed through. Once again, remember that in our
bird class, we didn't have any extra methods. But in my main class, if I want, I can use
some of the getter methods of our parent class, in this case, animal. For example, if I want
to get the name of my bird, I can say something like this, I can say Phoenix dot get name,
you can see that we have all of the getter methods. Let's run the application. And let's
see if we can print the name of our birth, you can see that the name has been printed
successfully. Beside getter and setter methods, you can also have access to all of the other
methods that we have created. For example, if you remember inside the animal class, we
have created this each method, let's see if we can use it in our bird instance. For example,
in here, if I say Pheonix, that it, I don't know what Phoenix
is, its birth, let's just pass meat. And let's run our application. And let's see if we can
successfully execute the eat method. And as you can see in here, Nina is eating meat.
Now that you have created your birth class, you can also change the dog class as well.
For example, in here, I'm going to delete all of these codes once again. Instead, I'm
going to extend the animal plus, once again, let's say extends animal, you can see the
red warning. And that's because we need the constructor, you can see that the amount of
similar codes that you were copying and pasting is a lot less right now, the bird and dog
class are basically the same. But we know for sure that a dog and a bird are not the
same, they may have other fields. And also other behaviors as well. If you want, you
can customize your child classes as well. For example, inside my birth class, I want
to add another field, I'm going to say private, let's say ain't veins, we know that dogs do
not have wings. In here. I'm going to delete this constructor and I'm going to create it
once again, because I'm going to use the help of my ID, let's press ALT plus insert. In
here, I'm going to select Winx. And this time, as you can see, the constructor has been changed
a little bit, the super statement is as the same it means that do whatever you're doing
with all of these four fields. But because inside our parent class inside the animal
class, we do not have a wings field, these wings hasn't been passed to this super statement.
So we are setting the value of wings directly inside the constructor of this bird class.
This way we can customize our child classes. Right now the duck does not have any wings
field, but our bird does what's right now if I switch back to my main class, I should
get a warning. And the warning in here says that you need to pass a wink that's also fascinating
here as well. For example, I'm going to say to we can also create getter and setter methods
for these wings as well. For example inside our bird class down in here, let's press up
plus insert and add select getter and setters. Now that we have created the getters and setters,
let's see if we can print the number of wings. For example, down in here, I'm going to say
Phoenix dot get wings. Let's run the application. And you can see that two has been printed
as the number of means beside getter and setter methods. You can also have other methods inside
your child class as well. For example, inside the spirit class, if I want, I can define
a fly method as well. Let's quickly see that let's say public void fly. I'm not going to receive anything as the input
let's just print something. Let's say this dot get name. Also if you remember from the
previous video, I said that this keyword refers to the current object that you are in. In
this case inside the bird class, we don't have any getname method. But because we are
extending the animal class, we can use the start getting, let's say is flying. So besides
using fields, you can also customize your child classes with different methods. Let's
see if we can call this method from inside our main class, let's say Phoenix dot fly.
As you can see, Nina is flying. Also beside the finding new methods inside your child
class. You can also change the behavior of methods of your parent class. For example,
if you were Remember, inside the animal class, we had this eat method, I'm talking about
this one, which inside this method we are saying eating food inside our bird class.
If we want, we can change that. For example right in here, I'm going to press Ctrl plus
Oh, you can see that we are seeing a list of different methods, I'm going to override
this eat method. So by overriding, you're going to say that I'm going to change the
behavior of this eat method from what is happening inside the parent class. Once again, we are
seeing this super keyword, it means that do whatever you're doing with this parameter
inside the parent class. If you want, you can delete this super statement completely,
but let it be for now we will delete that later on. After this super keyword. I'm going
to print another statement in here. Let's just say eating finished. So this way, we
have changed the eat method inside our child class from what it was inside
the animal class. Right now inside our main class, we have executed this line of code
for Unix that eat let's comment the lines after that, so that we can see what's going
to be the behavior of this eat method. Let's run the application, you can see that we are
saying eating meats. And after that eating finished, if you want to completely change
the behavior of your method inside the child class, you can simply delete this super that
eat method. For example, in here, I'm going to say chewing food instead of eating fruit.
So in both child and parent class, we have this eighth method, but their behavior is
different. Let's run the application and see if we can see the difference, we can see that
we are chewing meat. So what we did so far is called inheritance in object oriented programming.
We have inherited the birth class from the animal class. You can also continue this inheritance
multiple times. For example, if you want, you can inherit the dog object. Let's quickly
create another class in here. For example, let's say Shephard. Now in here, I can say
extends the dog class, you can see that once again, we are getting this red warning. Let's
create our constructor in order to overcome that problem, we can see that even though
inside the doc field, we do not have any field. But inside our Shephard class in the constructor,
we need all of those arguments, because the parent of this Shephard class, which is dog
is the child of another class, which is animal. So you can do this inheritance as many times
as you want, you can also create another class and extend the shefford class. But I don't
think that mean anything in here, I just wanted to say that you have that option. Okay, I
think that's enough talking about inheritance. The other concept that I'm going to talk about
is called polymorphism. We have talked a bit about polymorphism in the previous video,
but let's talk more about it in here. So in previous video, I said that one kind of polymorphism
is that for a class to have multiple constructors, for example, inside our animal class, if we
had another constructor in here, which will accept different number of fields. For example,
the first three now that we have two constructor, this is one kind of polymorphism. Now we can
create this animal class in two different ways. Basically, polymorphism means having
multiple forms. But there are two more kinds of polymorphism. But before we talk about
that, let's delete this constructor, I'm not sure that if you're going to need that the
other kind of polymorphism that we have used so far is about this eat method. So inside
this animal class, we had this eight method, but also we had it inside the child class,
which is birth. But these two eight methods have different forms, it means that we are
doing different things inside each one of these methods. This is another kind of polymorphism
two methods inside a parent and child class that are doing the same job differently. We
also have another kind of polymorphism. And that's with the methods themselves. We don't
have this following method inside our animal class. But in here, we can also have another
method called fly as well, let's quickly see how we can create another method called flight.
I'm going to say public void fly. But this time inside the parentheses, I'm going to
receive some arguments for example, I'm going to receive a speed as you can see, the compiler
is happy with this way of defining two different methods with the same name. Now, if I switch
back to my main class, you can see that we are not getting an error but before that,
I think I should uncomment this line of code. Even though we are not getting error warning
this in here it means that we are using the first flow method Let me close all of the
unnecessary classes. Inside the bird class we are using the first method, but if we want
to use the second method, we just need to pass some arguments in here. For example,
let's pass 100 we can have methods with the same name when we have different number of
arguments, or alternatively, when we have different kinds of arguments, for example,
in this case, we are passing an integer. But if we had another method, for example, in
which we pass a string, that method can have the fly name as well. Let's see that briefly,
let's say public void fly. And inside the parentheses, I don't know, let's pass a string.
Let's just say name, you can see that the compiler is happy with this way of defining
a method with the same name. So besides the difference in the number of parameters, the
kind of parameter is also important. This in here is also called polymorphism. using
methods with the same name in different ways, okay, let's delete these two, I don't think
we are going to need them. And I think it's a good point to stop the video in here. In
the next video, first thing we are going to start talking about composition in object
oriented programming. See you in the next video. In the previous video, we have talked
about inheritance and polymorphism. In this video, we are going to talk about composition
in object oriented programming. In previous videos, I said that classes are useful for
when you want to define your customized data type. For example, imagine that you are going
to create a car in that car you have multiple systems, for example, you have a system for
a stereotype, your car also may have some engine, it can also have a fuel system. If
you want to simulate a car. In programming, you can create different classes, for example,
for engine for a stereo system, and also for field system. And after that inside your car
class, you can compose all of those classes to have a car, let's see how we can use composition
in Java. In my package, I'm going to create a class called engine. For this engine, I'm
going to have two fields. First of all, I'm going to define a model. So let's say private
string model. And after that, let's have an integer, private int. I'm going to name this
integer, rpm, rpm stands for round per minute, it's just a property of different engines.
I'm going to keep it really simple. So I think these two would be enough. After that, let's
quickly create our constructor and getters and setters. Let's create a car class. And
let's see how we can use this engine inside that, let's say new Java class. Let's name
it car. For this car class, I'm going to define four fields. First of all, let's pass a name, private string name. After that, let's have
an integer for the number of doors. After that, let's define the color of our car private
string color. And after that, I'm going to include or compose an engine in here. For
that I can simply say private engine with capital E. And in here, you can see that in
my package, I have an engine class, I can import that into this class. Let's name it
engine. For the sake of simplicity, I have composed only one class inside this class.
But if you want, you can create another class for a stereo system and your system and everything
else that you want. But I think you will get my point. If I use only one class after death
like other classes, I can create my constructor, you can see that this engine has been passed
to our constructor the same way that we have passed other data types like integers and
strings, we can also have getters and setters the same way that we had for previous classes.
Now that we have created this car, we can instantiate it. For example, inside our main
class. For example, if I want to have a car object in here, I can say car, let's name
it Mercedes, is equal to new car. As you can see, the constructor in here requires four
fields and name doors color, and also an engine for the name. I'm going to pass Mercedes AMG
for the number of doors that's passed to for the color, let's say silver. What What should
we pass as the engine here? Well, we can pass our engine in two ways. First of all, we can
create our engine before this court class. For example, in here I can say engine, let's
name it engine is equal to new engine. And I can pass a model and RPM for this engine
to instantiated for example, I'm going to say three note for the RPM, let's say 8000.
After creating our engine objects, we can pass it to the constructor of our car for
example, in here I can say engine and like that we can create our car but the other way
is to pass your engine directly to the constructor of your car. For example, I can see a new
engine in here. And I can't instantiate my engine objects directly inside the constructor.
Let's say Renault Let's fast 1000. Now that we have passed it directly, we don't need
the first line. Of course, we know that Mercedes, we don't use Renault engine, but I think it
doesn't matter in here. Now that we have instantiated our car objects, we can have access to all
of the fields like we did before. For example, if you want to print the name of our car,
we can say something like this, we can say Mercedes dot name, or that gets named to riversides.
But what if we want to get the model of the engine of this car? Well, for that, we can
say something like this, let's print engine model. Plus, we can say Mercedes dot get engine, this method in here. After that,
we can once again say dot get model. So this get engine method will return an engine object
in which we can perform another dot operator on that, let's run the application and see
what would be the result. First of all, we can see the name of our car, and after that,
you can see the engine model, which is renamed. Also instead of using the methods of your
engine, you can get the engine object directly. For example, in here before the printer statement,
I'm going to say engine, let's name it engine is equal to let's say Mercedes dot get engine.
You can see the return type in here. But whenever you are not sure about the return type, you
can press down the control key. And by hover over in your method, you can see the return
type, you can see the declaration of your method which says public engine get engine,
it means that this method is going to return an engine object. Now that you have your instance
of engine, you can perform all kinds of operations on that, instead of pressing down the control
key and hover over your method, there is another option to get the return type and for that
matter the declaration of your method. And here is how you can do that, you can click
on the name of your method, and you can press down the control key. This way, you can see
some information about the declaration of your method. These kinds of documentation
are especially useful for when you are using a third party library or some built in methods.
For example, if we click on this print line method and press Ctrl Q, you can see that
the documentation is giving us much more information. For example, in this case, it says that this
method is printing a string and then terminate the line, you can see some information about
the method itself. Also, if you want, you can have this kind of information on the methods
that you yourself create. For example, on this get engine method. If we switch to our
car class, we can create some sort of documentation. Let's find that method. And here is how you
can do that you need to add a comment in here. In previous videos, we have seen how to create
a new comment by using two slashes we could have create our comment. But these kinds of
comments are not useful in here. Instead, we can use a single slash. And after that,
we can have to start by pressing and enter. You can see that we have these sorts of comments
as well. These kinds of comments are useful for when you have multiple lines. And in here
you can have some sort of information in which later on will be shown when you press Ctrl
q on the name of your method. For example, in here, let's say returns the engine of our
car. Now that we have provided this information in here, if we switch back to our main class
on the declaration of our method on the main, if we press Ctrl plus Q, you can see that
in here we can see that information. Sometimes these kinds of commenting can be useful as
well. But there are more to these kinds of comments. For example, we can provide some
links, but more on that later on in future videos. So this way of using different classes
inside other classes is called composition in object oriented programming. Once again,
if you have created some other classes, for example, a stereo system class and also a
fuel system class, you could have add them one by one in here as well. But for the sake
of simplicity, I've just included this engine, this way we can compose different objects
inside one class. Okay, I think that's enough talking about composition. Let's talk about
a keyword in Java called nom. Before that, let's close this car class. And let's comment
all of these lines of codes. There are some times that you don't want to instantiate your
objects immediately. For example, down in here I can say car Mercedes is equal to I
don't want to instantiate my car object in here like we did before. Instead, I want to
post one that too few lines after this for that you can pass null values for your objects.
Let's see now in here as well. This null keyword in Java means nothing. It means that this
car Mercedes is nothing when the value of an object is now You cannot perform any kind
of operation on that. For example, in here, I cannot say Mercedes dot get name, for example,
we are not getting a compile time error, it means that our application is going to be
created. But if you take a look at the highlighting here, it says that this method is going to
produce no pointer exception. If you remember from previous videos, I said that whenever
nullpointerexception happens, your application is going to crash. So the error in here is
going to be a runtime error and not a compile time error. Let's run our application. And
let's see what would happen. You can see that in here we are getting a red warning in our
console says Java dot Lang dot nullpointerexception. In general, we should always avoid exceptions
in our application. Later on, we will talk about how can we do that, but for now, let's
just assume that we know whenever an object is now we cannot perform any operation on
that, for example, we cannot use the methods inside that object. So whenever you're not
sure about null values, for example, whenever you are retrieving some data from a web server,
or from your local database, first of all, you need to check that if your object is null
or not. And here is how you can do that. For example, you can create an if statement before
this Mercedes dot get name, I can say if let's say Mercedes, is not equal to Now, I'm going to put an if
statement in here in case our object is not now we are going to call this method but in
the else case, I'm going to print something. Let's say the car was now let's run the application
once again, this time, you can see that we are not seeing the exception, which is good.
But right now, we are not doing anything helpful. With our value being now we are just printing
something, sometimes this is the desired behavior. But sometimes you may want to check that what
was the cause of your objects to be no, so not means nothing in Java? Okay, let's comment
all of these. And let's talk about another keyword in Java called final. So up to this
point when we want to instantiate our object or variable, because I've said something like
this, because I said int a is equal to five. For example, later on, we could have changed
this a for example, because I have said, A is equal to five plus five for a plus fun.
This way, we could have changed the value of our variable. But there are some times
that you need to be sure that the value of your variable wouldn't change. In those cases,
you can use the final keyword. And here is how you can do that before the type of your
variable you can say final final int a is equal to five. Now if I try to change the
value of my variable, for example, like before, if I say a is equal to a plus one, you can
see that we are getting a warning in here the warning says that cannot assign a value
to a final variable. So whenever you are declaring your variables and classes as final, you cannot
change the value of that variable or class. Let's also check the case when we define our
classes as final, I'm going to comment these two line of code. And then in here, I'm going
to say final, let's say engine, let's name it engine is equal to new engine. Let's pass
a model and rpm. Now if I try to change the value of this engine, for example, if I say
engine is equal to new engine, with other parameters, for example, let's change the
RPM, let's say 7000. Once again, you can see the error, the error says that cannot assign
a value to final variable. But there is a point in here. When you declare your objects
as final, you cannot change the whole instance of that object. But you can change the properties
of your object. For example, in here, if you remember, inside our engine class, we had
two setter methods which with the help of them, we could have changed the value of two
properties. For example, if we wanted to change the RPM, because I said something like engine
dot set RPM to let's say 10,000. You can see that even though we declared our engine as
final, we can change its properties, we just cannot change the whole instance we can change
its properties using Final keywords can be useful from time to time. Okay, I think that's
enough for this video. In the next video, we are going to have a quick challenge to
make sure that we have understand the concepts of object oriented programming. See you in
the next video. This is our challenge. Imagine that you are a doctor and you want to check
on your patient. In this application. First of all, you're showing the name and age of
the user to the doctor. And after that you can see a list of different organs in which
A doctor can select the first organ, his left eye. Let's select that. In here, you can see
that we are seeing some details about the organ, for example, the name, the medical
condition, and also the color of the oil. After that, we gave the doctor the option
to close the oil. And also if the eye is closed, we are going to open that let's select one
in here to close the eyes, you can see that left eye closed. Once again, we are seeing
the least of our organs. Let's select two in this case. This time, if I don't want to
close or open the eye, I can put any number beside one for example, if I put two in here,
you can see that once again, we are seeing the list of different organs. Let's select
three to see the heart. Once again, you can see that we are seeing some details about
the heart. After that we have the ability to change the heart rate. In a normal doctor
patient situation, this wouldn't be the available option. But in here, we just want to demonstrate
some behavior for our heart organ. So if we select Vani, here, the scanner is asking for
our new heart rate, which I can put 75. And you can see that heart rate change to 75. Let's select a stomach. Once again, you can
see the details of the stomach, we have one behavior in here, which is digest. If we select
that, we can see that digesting has begun. Once again, this is a hypothetical situation.
And in a normal situation, you cannot order the patient to digest the food. Let's also
select five in here to see the scheme. This time for the skin, you can see that we are
not seeing any behavior instead, you're just seeing some details. After that, once again,
we have our list, in which if we put six or for that matter any other number, we will
close the application. Let's put six in here. And as you can see application has been exited
successfully. by solving this challenge, I want you to practice the object oriented programming
concepts that we have talked about in the past three videos. So make sure to use them.
Okay, pause the video in here and go solve the challenge. After that, come back to the
video. And let's see my solution for the challenge as well. Here is my solution for the challenge.
First of all, I am going to create a package inside my source folder. Let's name it or
dot maker dot o p challenge. Inside this package, I am going to create my organ class. Inside
this organ class, I'm going to have two fields, let's say private string, name and also private
string medical condition. I'm going to keep it simple. So I think these two would be fine.
After that, let's create the constructor. And after that, let's create all of the getters
and setters. I'm not sure that we are going to use all of these getters and setters. later
on. If we didn't use them, we just simply delete them. Beside these, I'm going to have
another method inside this class. Named get details. Let's see that as well. Let's say
public void, get details. And let's print some details about this Oregon. First of all,
let's say name. Plus, this stuff gets named. After that, let's print a medical condition
of this organ as well. medical condition plus these that get medical condition. That's all
we need inside this organ class. Let's quickly create our organs one by one. First of all,
I'm going to create an organ called I. Let's say I inside this iclass I'm going to have
a string called color. And I after that let's have a Boolean indicating if the eye is open
or not. So let's say private Boolean is opened. After that, it's time to extend the Oregon
class, let's say extends Oregon. In here we are using inheritance. Now it's the time to
create our constructor. Let's select both of these two fields. And after that, let's
create all of the getters and setters. Once again, I'm not sure that we are going to use
all of these getters and setters. later on. If we didn't use them, we just simply delete
them. Okay, let's override the get details method. I can do that by pressing Ctrl plus
or by selecting get details method. Now we can change Use this method. For example, in
this case, let's also print the color of the eye. Let's say color. Plus this dot get color.
Inside this iclass, I'm going to have two other methods as well, let's see them, let's
say public void, open. Inside this open method, I'm going to change the value of this Boolean
to true. So let's say this dot set opened. And let's fast through. After that, let's
bring something indicating the AI has been opened. Let's say this that gets name, you
can see that we don't have any getname method. Inside this class, we are using the getname
from the parent class, which is Oregon, let's say plus opened. Let's have another method
called close. I'm going to save public void, close. Once again, first of all, I'm going
to change the value of the Boolean to false. Let's say this dot set opened, and let's pass
false. After that, let's print something. Let's say this dot get name, plus close. That's all we need inside this
iclass. Let's quickly create another class for the heart. Let's say heart. For this heart
class, I'm going to add another field called rate, let's say private int rate. It's time
to extend the Oregon class extends Oregon. And after that, we need to create our constructor.
After that, we need to create our getters and setters. I'm pressing ALT plus insert
to get that dialog. In case that's confusing for you. After that, it's time to override
the get details method by pressing Ctrl plus Oh, and by selecting get details method, we
have that in here, I'm just going to print the heart rate, let's say heart rate. Plus
this dot get heart rate, or get rate. That's all we need to do inside this heart class.
Let's quickly create a stomach class. Let's say stomache. Inside this Islamic class, I'm
going to have a Boolean that's a private Boolean, these empty indicating if the Islamic is empty
or not. After that, it's time to extend the Oregon class extends Oregon. And after that,
we need to create our constructor. Let's create our getters and setters. And after that, let's
override the get details method. Inside this get details method. First of all, I'm going
to check that if the stomach is empty or not. So let's say if this.is empty, I'm going to
use the method in here. If the stomach is empty, I'm going to print something I'm going
to say need to be fat. But in the else case, let's just print the stomach is full. Let's
also create another method for this class called digest. Let's say public void digest.
Let's just print something let's say digesting begin. Okay, we are done with our stomach
class. Let's quickly create the skin class as well. For this Scan Class, I'm going to
define two more fields. First of all, I'm going to define a string for the color of
the skin. After that, I'm going to define an integer for the softness of their skin,
let's say private int softness. This integer is going to be some number from zero to 100,
indicating the softness of the skin. After that it's time to extend the organic class.
After that, we need to create our constructor. Next, we need to create our getters and setters.
And after that, let's override the get details method. Inside this method, let's also print
a skin color. Let's say skin color. Plus this dot get color. That's all of our organs. Now
we can create our patient class. Inside my package. Let's create a patient class. For
this patient, first of all, I'm going to have a string for its name. After that, we are
going to have an integer for the age of the patient. After that we can create our organs.
For example, I'm going To save private eye, let's say left eye. Let's do the same for
the right eye. Let's also have a heart. After that may be a stomach and a skin. Okay, that's
all of our fields for the patient. Let's create the constructor. And let's create all of the getters and setters.
We don't need any special method inside this patient class, inside our main class, which
we need to create, we can instantiate it. Let's create our main class. First of all
in here, we are going to create our main method. After that, we can create our patient object.
But before that, let's minimize this project main. Let's say patient, let's name the patient
is equal to new patient. First of all, we need a naming here, let's say Brad. After
that, we need the age, let's say 28. After that, we need the left eye which I can say
new I. For this, I first of all, we need a name, let's say left eye. After that, we need
the medical condition, which I'm going to say short sighted. For the color, let's say
blue. For the is open Boolean, let's say true, we need the same thing for the right I knew
I let's just change the name to right i. Also, let's change the medical condition to normal.
After that, we need the heart, let's say new heart. For the medical condition, let's say
normal. And for the rate of the heart, let's just say 65. I think the next organ was a
stomach. So let's say new stomach, the main would be Islamic. The medical condition, I'm
just going to enter a name of some medical condition, I'm going to say p UD public services
in case if you're wondering. And for the ease empty, let's say false. After that, we need
a skin let's say new skin for the color of their skin. Or First of all, we need the name,
let's say a skin for the medical condition, let's say burnt. After that, what do we need,
we need the color and also softness for the color, let's say right? For the softness,
let's say 40 out of 100. Okay, that's our patient object. Now we need to create the
logic for our application. First of all, I'm going to print the name and age of the patient.
So let's say print name. Plus patients that gets me after that do the same thing for the
age. We are going to receive the user's input. So we need a scanner. Let's say a scanner
scanner is equal to new scanner. Let's fast system that. Also, now that we know about
object oriented programming, we know how this scanner is working. This is just the class
with this new keyword we are instantiating it inside the constructor of this scanner,
we need this system.in whatever that is. So this way we have created an instance of this
scanner. After that I'm going to define a Boolean, let's say Boolean. Let's name it
short finish. And initially I'm going to set it to false. Later on, we will see that how
it This one is going to be useful. After that I'm going to create a while loop let's say
while should finish is not equal to true, continue looping. Inside the while loop, I'm
going to show a list of different organs. For that I can say choose an organ. In here
I have two options. I can use this system dot out dot print lines line after line. Or
the better option is to use backslash n. Let's see that as well. First of all, let's go to
the next line in order to have a cleaner code. In here I can say backslash n, this backslash
n moves the cursor to the next line. The other one that I'm going to use in here is called
backslash t. This backslash T will add a tab to our text. Later on we will see exactly
what these two are doing. Okay, the first organ is left eye The next one is right I
After showing this list to the user, I'm going to receive the user's input. So I'm going
to say int choice is equal to a scanner dot next int. We have seen this in previous videos.
So I'm not going to explain in here, you're just going to receive the user's input. After
that, depending on this choice, I'm going to create a switch statement, let's say switch
on choice. And let's create our different cases. In case the user's choice is one, first
of all, we are going to print the details about the left eye. So let's say patient that
gets left I don't get details. Next, I'm going to give the user the option to open or close
the eye. For that, I need to check that if the eye is opened or closed. So let's say
if patient that get left eye that is opened, we need to close it, or at least we need to
give the option to close by, let's bring something in here. Let's say backslash, D, backslash
D in order to have two tabs. After that, let's say close or close the next we need to get
the user's input in case if it's one, we are going to close the eyes. So let's say if a
scanner dot next int is equal to one, then we need to say patient dot get left eye dot,
close the eyes or close. But in the else case, we are just going to continue to the next
record. In the else case of the first if statement, this finding here in case the eye is not opened,
we are going to show the option to open the eyes. So let's say else, we need the same
logic, we can print something backslash t backslash t Vaughn opened it. Next, we need
to get the user's input. Let's say if scanner dot next int is equal to one, we are going
to save patients that get left eye dot open. In the else case, we are just going to continue.
By continue I mean, once again, we are going to show the list of different organs. Okay,
that's our first case. We also need a break in here. But let's write the second case.
The second case is the right eye. We basically can copy and paste all of these logic. But
we just need to change the left eye to right. So for example, in here, let's say get right.
Okay, we are done with our second case. Let's also write the case for the heart. Let's say
case three. First of all, let's show the details of the heart, let's say patient that get heart
dot get details. After that, we are going to give the user to change the heart rate.
for that. Let's say backslash t backslash T one, change the heart rate. Once again,
we need to listen for the user's input. So let's say if the scanner dot next int is equal
to one, we need to ask for the new heart rate. So let's say enter a new heart rate. After
that, we need to save that heart rate. So let's say int is equal to a scanner dot next.
After that, we can say patients that get heart dot, let's say set rate. And let's pass our
new heart rate. But in the else case, like before, we are going to continue. We also
need a break in here. Let's quickly add that and also after changing the heart rate, it's
better to show some message. Let's say heart rate change to plus patients that get heart
dot get rate. Okay, that's our third case. The fourth one was for the stomach. So let's
say case four. First of all, we need to print the details of the stomach patients that get
the stomach that get details. For the stomach, we had the digest option. So in here, let's
show that option. backslash D, backslash D. Let's see digest. Let's see if the scanner
dot next int is equal to one. If that's the case, let's say patient dot
get stomach dot digest. But in the else case, let's just continue. We also need a break
in here. Let's quickly add that the fifth case is for the scheme. Let's say case five
For the scheme, we didn't have any option, we just need to print the details, let's say
patient dot get scheme, dot get details. Of course after that we need to add a break.
In here, I'm going to add a default case. And if the user enters any other number than
these five, we are going to create the application. For that we are going to change the value
of this short finish Boolean to true. After that, we need a break. Okay, I think our application
is ready to test let's see how did we do. In here, we can see the name and age of the
patient which is good, we can also see the list of our organs. Once again, it's good.
Let's select left eye, we can see the details of the left eye. And also we have this close
the eye option. Let's put another number beside this one, let's say to once again, we can
see the list of our organs. Let's see if we can close the left eye. Let's put one in here.
And as you can see, the left eye has been closed. Okay, let's check the right eye. It's
working the same. Let's enter two in here in order to show the list of organs. And let's
select our heart, we can see the hearts details, which is good. Let's see if we can change
the heart rate. Let's select one in here, the console is waiting for the new heart rates,
let's say 75. And as you can see, heart rate has been changed to 75. Let's check it once
again, in order to make sure of that, let's say three. And as you can see, the heart rate
is 75. Let's go to in order to show the list of organs. And let's select four in order
to see their stomach, we can see all of the details of the stomach. Let's digest some
food. And as you can see digesting has begun. Let's check the skin which is five, you can
see that we are getting the details of the skin. But we don't have any option. That seems
to be good. And if you enter any other number, then these five we should create the application.
Let's enter seven in here, for example. And as you can see application has been finished
successfully. Okay, it seems like our application is working fine. Let's just delete the getter
and setter methods that we said that we will delete if we didn't use them. Let's check
the classes one by one. First of all inside the iclass. Everything that is grayed out
It means that we never used that, for example, we never used this set color method. Okay,
it seems to be good. Inside the heart class. I think we have used all of them. Okay, that's
fine. Inside the organ class, we didn't need this set medical condition method. And also
we didn't need this setname method inside the patient class. Let's see what do we have
in there? And I think we didn't use any of the setters of this patient class. Let's just
delete them. Okay, that seems to be good. Let's see, what do you have inside a scheme
class. And in here, we never use these setters and this get softness method. Let's delete
them inside the stomach class. Let's delete this set empty method. And in order to make
sure of everything, let's just run our application one more time. Okay, it seems like we don't
have any compile time error, which seems to be fine. Okay, that was our challenge about
object oriented programming concepts. I will upload the source code at the links that you
can see on the screen, feel free to check them and also, I'm more than happy to see
your feedback about the code. In the next video, we will talk about collections in Java.
See you in the next video. In previous videos, we have seen simple arrays in Java. For example,
if we wanted to store a list of different names, we could have said something like this
because I've set a string with a pair of a square bracket. After that, we could have
named our array. And after that we could have initialized our string array like this inside
a square bracket in here, we needed to pass the size of our array for example five. The
other way was to pass our elements at the time of instantiating our array for example,
we could have said a pair of curly braces and inside those curly braces because I've
passed our elements. Let's pass few names in here. After that, if we wanted to have access to
these elements, we could have say something like this, we could have said print, let's
say names with an index of let's say two for the third element, which is Brad in this case,
if you're on our application right now we should see Brad. Let's run it. You can see
that Brad has been printed but if you remember I said that using these kinds of simple arrays
in Java has a lot of limitations. For example, the first limitation is that their size is
immutable, it means that their size cannot be changed. Right now we have five elements
inside our names array. If we want to add another item inside this array, we cannot
do that. For example, we cannot say something like names with an index of five, which indicates
the sixth element, we cannot assign a value to that, you can see that in here we have
a red warning. And if we try to run our application, we get an exception. Let's see the exception.
The exception in here is array index out of bounds exception. Also, when working with
simple arrays in Java, you don't have that much options. Later on, we will see that when
we use different kinds of collections, we can operate all sorts of operations on our
collections in which we do not have them in simple areas. If we want to add a sixth element
to our array, we can create a new array, and after that, we can copy all of the elements
from inside this array. Right now for the situation that we have in here. If we want
to add another item to our array, we can create another array with the size of six. After
that, we can copy all of these elements to that array. And after everything, we can add
this new item. For example, in here, I can say a string array. Let's name it new names,
is equal to new string array with the size of six. After that I can create a for loop
let's say for int i is equal to zero i less than names dot length, and i plus plus. And
inside that for loop, first of all, I need to add all of the names to this new names
array, I can say new names with an index of i is equal to names with an index of oil.
This way, we can copy all of the elements from inside this names array to this new names
array. After copying all of the elements. After the for loop, I can say new names with
an index of five is equal to Jerry. This way we can get around this problem. For example,
if I comment this line and run my application, maybe after that, print the six element inside
our new names, we have a solution. But as you can see, this solution is not that much
effective. Let's quickly print this. You can see Jerry has been printed in here. But as
you can see, there are a lot of codes involved. And beside that if your array has a lot of
elements, for example, a million elements, this process can be really time consuming.
Besides that it can be resource consuming if you are downloading this array from the
internet. So this solution in here is not effective. Instead of copy and pasting the
whole array, we are going to use collections. Let's delete all of these codes. In Java,
we have multiple kinds of collections. The first of which I'm going to talk about in
here is called ArrayList. Let's begin to see that so we type array list with capsule a.
After that inside a pair of anchor bracket, or as some might call them diamonds, we need
to define the type of our ArrayList object for example, I can say is string. After that
we need to name our ArrayList. For example, I can say names, is equal to new ArrayList.
As simple as that we have an ArrayList This is one way of defining your ArrayList. There
is also another way, let's quickly see that so instead of saying ArrayList string, we
can say list, you can see that the icon in here is different. It's an interface. We will
talk about interfaces later on in the course. But for now just know that there are two ways
of defining your ArrayList. Let's see how can we use this list to create an ArrayList
we can say list of strings for example. Once again, let's name our list. For example, let's
see students is equal to new ArrayList. There is a slight difference in here. But I just
wanted to show you both ways of defining your ArrayList. Okay, let's delete this line for
now. Right now our ArrayList is empty. And if we want to add some elements to this ArrayList,
we can simply say names.ad, we can use this add method in order to add
elements into our ArrayList. For example, let's add one. You can use this add method
as many times as you want. If I want to add another element, I can simply do that. So
the first benefit of using array list is clear. Now the size of array list is mutable, it
means that we can change the size of array list. After adding some elements to your array
list. You can get those elements by using the get method. Let's quickly say that, for
example, let's print the first element I can see names that get you can see that this get
method requires an index. Once again, indexes in Java start from zero so if I pass zero
in here, it means that I'm going to get the first element. Right now if I run my application,
I should see my Sam printed into the console, you can see that Mason has been printed. Also
when using array lists, you can also get the size of your array list. For example, if I
want to print the size of my ArrayList, I can say something like this, I can say names
dot size. Let's run the application and see what would be the result, you can see that
the size of our ArrayList is two, you have all sorts of options when using array lists,
you can also clear all of the elements inside your ArrayList. For example, I can say names
dot clear. This clear method removes all of the elements inside your ArrayList. After
clearing, if I once again get the size of my ArrayList this time the size should be
zero. And as you can see down in here, it's zero. If you want, you can also remove one
element from your ArrayList. Let's quickly see that I can say names dot remove this remove
method requires an object, it means that we need to pass the whole element. So let's say
may sound for example. But before that, let me quickly comment this line because we don't
want to clear our array list. And after removing my son, let's print the first element inside
our array list. Let's say names that get and let's pass zero as the index. As you can see,
the first element right now is Sarah, it means that my Sam has been removed successfully.
Let's see what other options do we have on our ArrayList. Let's like names by typing
dots, we can see the list of options, we can also check that if an option exists in our
ArrayList. For example, if I use this contains method, once again, it requires an object,
let's say Mesa, let's bring this whole line of code. This contains method returns a Boolean.
So right now if I run my application, because we have removed my sample we should see false,
we can see that that's good. But if we change this to Sarah, we should see through. And
through this, you can also check that if your ArrayList is empty or not. For that you can
print something for example, you can say names.is empty, we have this method once again, it's
returning a Boolean. Right now we have zero in our ArrayList. So it shouldn't be empty.
And as you can see we are receiving false. But if we remove Sara before this line of
code we should see through, let's quickly do that names dot remove. And let's pass this
time you can see that through has been printed, you can also get the index of some element
from inside your ArrayList as well. Let's quickly see that before everything I'm going
to comment all of these lines of code because I want to have a clear console. down in here. Let's say print names that index
of and in here I can pass my object for example, I can pass Mesa. Right now Mason is the first
element so we should see zero printed, you can see that it's zero. But if we don't have
that element inside our ArrayList. For example, if we pass Brad in here, we should see negative
one. And as you can see negative one has been printed. When you're using ArrayList you can
only have objects as the type of elements inside your ArrayList. For example, in here,
I cannot say integer, you cannot use primitive data types when you are creating a new ArrayList.
As you can see in the error in here, the error says that type argument cannot be primitive
type. If you want to have an ArrayList of different numbers, you can use the equivalence
Java class. For example, in here I can say integer with a capital I. And now I have an
ArrayList of integer. Right now I am getting an error because I'm trying to add some strings
to this integer array list. But you get the idea of we can use this integer class in order
to have an ArrayList. So in Java equivalent to every primitive data type, you have a class
as well, we have seen this integer. Let's also check others, we can say Boolean similar
to that we can say long, we can also say double. And you can check the others yourself. But
let's change this one to a string right now. The other option that you have when you're
using ArrayList is sorting different items. For example, if you want to sort different
elements inside your array list alphabetically, you have that option. And the way to do that
is like this. Let's see that down in here we can see names that sort you can see that
this sort method requires some comparateur later on in the course we will see this comparateur
In fact, we will use this sort method in order to source different elements in our array
list. But for now, I'm not going to talk about this I just wanted to say that you have this
option. Okay, let's delete this and let's move on from this part. Similar to simple
arrays in Java. If you want to eat To read through all of the elements in your
array list, you can use for loops. Let's quickly see that as well. You can say for int i is
equal to zero, i less than named that size, this time, i plus plus. Inside this for loop,
we can say, print names that get with the index of AI. This way, we can print all of
the elements in our array list. But before that, let's comment this line. And let's run
our application, you can see that we can see both of our elements printed. Okay, that's
enough talking about array lists. Let's also talk about another kind of collection in Java
called maps. maps are useful for when you have some key value pair data. Let's define
a map and we will talk about what I mean by key value pairs. You can define a map like
this, you can say map you can see that map is an interface. We will talk about interfaces
later on in the course I believe in the next video. But for now, let's move on. You can
also see that inside these anchor brackets inside these diamonds, we have these K and
V these two stands for key and values. So in here, if we say anchor bracket, for the
first element, we need to pass the kind of key the data type of our keys. For example,
I can say string. And after that, we need to provide the data type of our values. For
example, I can say a string once again, for the data type of my values. Right now I'm
getting a red warning. And that's because it seems like the ID hasn't imported maps
into my class, I can press ALT plus Enter. And if we take a look at above, in here, it
seems like we have imported maps into our class successfully. After defining the data
type of your keys and values inside your map, you need to name your map. For example, I
can say contacts. In here, I can say new maps. But if I do that, you will see that there
are a lot of methods that I need to be worried about, there is a better way of defining your
maps, let's press Ctrl Z in order to undo the change, I can say new hashmap. This time,
you can see that this hash map is a class. And if you want we can instantiate our map
this way, this time, we do not have all of those extra methods. I don't intend to talk
about hash maps in here, the topic is a bit technical, it's about the way that we are
going to iterate through our maps elements. It's way above the talk that we have in here,
I just wanted to say that you can instantiate your maps as different hash maps. Okay, now
you have an empty map, which the data type of different keys is a string. And the data
type of different values is a string as well. If you want to put some elements to this map,
you can say something like this, you can say contacts that put this is the method that
we are going to use in order to add some elements to our map, you can see that right now this
port method is waiting for a key and also a value for the key. For example, I can pass
a name, let's say me, Sam, and for the value, let's pass his email, let's say me sam@maker.org.
This way we can add elements to our map, I think if I change the name of my contacts
map to let's say email list, that would be much more better. In order to change the name
of some variable or class in Java, you have an option, you can select the whole name,
you can right click on the name of your variable, you can go to this refactor in here, and you
can use this rename or alternatively, you can use the shortcut, which is shift plus
f6. Let's select that. And in here, I'm going to delete this whole name, you can see that
once I'm deleting this, it's deleting the name in both places. So let's say email list.
And let's press enter. I think this name is much more suitable. Let's add another element
to our map. Let's say email list dot put, let's say Brad. And let's say brad@gmail.com.
Now that I have some elements in my map, if I want to have access to those elements, I
can say something like this. For example, let's print this statement. Let's say email
list dot. And once again, you can see that we have this get method which requires an
object for the object in here we need to pass the key. For example, if I pass Mesa, as the
result, I should see the value of Mesa. In this case, I should see the email. Let's run
the application. And let's see if we can print the email of maysa. You can see that the email
has been printed successfully, like array lists. When you are using maps, you have all
sorts of options. For example, if you want to get the size of your map, you can say something
like this you can say email list dot size. Let's run the application and let's see if
we can get to two has been printed. If you want to remove an item from your map you can
say email list that remove once again this remove required As an object, in this case,
we need to pass the key. Let's pass Brad. And let's print the size of our map once again.
This time after removing Brad, you can see that the size is one. You can also check that
if some key exists in your map or not. The way to do that is like this. Let's bring that
first of all, we can say email lists that contain keys. Similarly, we have contains
value, which you can guess it will check that if some value exists in your map. Let's try
the first one contains key. And let's pass Brad in here, because we have removed breath,
we should see faults. And as you can see, false has been printed. But if I change this
to Mesa, we should see through. Okay, that seems to work fine. We can do the same thing
for the values. Let's say email list dot contains value. Let's
pass the May Sam's email may sam@miko.org. Because it does exist in our map we should
see through and through it is you can check other options. yourself. If you want. We can
say email list dot once again, you can see that we have this clear option, it will clear
all of the elements of your map you have this is empty method, it will check that if your
map is empty or not. The other option that you have in here is this values, you can see
that this values method will return the collection. If you want to copy all of the values of your
map, you can use these values and you can save it inside a collection. But I'm not going
to do that in here. But to just show you I'm going to say that there is an interface in
Java called collection this morning here in which is the generic type of all of the collections
available in Java. But more on that later on when we source different items inside our
ArrayList like ArrayList, you cannot have a primitive data type as the data type of
your key or your values when you are using maps. For example, in here, I cannot say int
if you take a look at the warning, it says that type argument cannot be of primitive
data type. Similarly for the values, let's say int, once again, you can use the equivalent
Java class for these primitive data types. But you cannot just use primitive data types.
Okay, let's roll back everything. Besides maps and array lists, you have other kinds
of collections in Java as well, I don't want to talk about them in here, because I think
that for the Android course, these two are enough and you don't need to know about others.
But if you're curious, you can always check this Oracle webpage, you can see that we have
sets, lists and other kinds of collections. But honestly, these are not going to be helpful
for our Android course maps. And array lists are just fine. As the data type of key values
inside maps, and also values inside the ArrayList. You can also have different classes. Let's
quickly see that as well. In my source folder inside the package, I'm going to create a
new class called student. Let's quickly see that inside this student class, I'm going
to define two new fields, let's say private string name, and private integer ID. Let's have a constructor and some getters
and setters. Now that I have created this class, I can pass it as the data type of my
ArrayList. Let's quickly create another array list down in here. I can say ArrayList of
different students This time, let's name this ArrayList students, let's say is equal to
new ArrayList. Now you can put as many students as you want inside this ArrayList. For example,
let's say students that add let's say a new student, let's say may sound with the idea
of 15, maybe. So beside the strings, other kind of customized datatype is agreeable with
the collections in Java. Okay, just before I finish off this video I'm going to talk
about for each loops in here. If you remember when we talked about loops in Java, I said
that there is another kind of loops called for each loop, I said that we are going to
talk about for each loops when we know about object oriented programming and also collections
in Java. So I think now it's a good time to talk about that you can create a for each
loop like this, you can say for instead of saying int i is equal to zero, I'm going to
pass the datatype of the list that I'm going to iterate over. For example, in this case,
I'm going to say a student. After net I need a name. For example, I'm going to say s and
after the name, I need a column. After that I need the list or ArrayList that I'm going
to iterate. For example, in this case, I'm going to say students, let's review everything
once again. In here. First of all we have passed the data type of the object that we
are going to look into the name of that specific object is as you can name it, whatever Do
you want after the name, you should have a colon. And after that, you need to pass the
collection that you're going to look into inside this for loop, you can use this s in
order to have some sort of operation on your object. For example, if I want to print the
name of my students, I can say, print s, that gets me right now our ArrayList has only one
student, let's quickly add another, let's say students that add a new student. Let's
say Sarah, with the idea of maybe 18. Let's run the application and see what would be
the result. As you can see down in here, Mason, and Sarah has been preempted. So this is in
here is like I in a for loop. But instead of being the index of the item, it's the item
itself from time to times for each loops can be useful and this is how you can create them.
Okay, I think that's a good point to stop the video in here. In the next video we are
going to talk about some small concepts. For example, we will talk about this static keyword
that we have seen in the declaration of our main method. Besides that, if we had time,
we will talk about inner classes, we will talk about interfaces and abstract classes
See you in the next video. In this video, we are going to talk about some small concepts
that we need to know about. The first of those concepts is this static keyword that we have
seen so far in the declaration of our main method. I'm going to talk about that in another
class. So let's create another class in my package. Let's name this class test class.
You have seen inside the main class that we can have this static keyword for our methods.
But besides that, we can also declare our variables as a static as well. For example,
in here, I can say public, let's say static. After that I can say a string. Let's say name,
you can see that it's working fine as well. I'm not sure if you have noticed or not. But
as soon as I declare this a string as a static, the style of this name has changed to italic.
If I remove that you can see the difference. But what does it mean to have a static variable
or a static method? Well, when you define your variables and methods as static, those
methods and variables belong to the object itself and not to the instances of that object,
we will see what I'm talking about. But before that, let's quickly have other variables in
here. For example, I can say public int, age, maybe another one public, let's
say a string, a skin color. These variable doesn't mean anything, I just want to have
some variables. Let's also create a constructor in here. Notice that when I use the intelligent
generator to create my constructor, I do not see my static variable in this list. Once
again, that's because the static variables do not belong to the instances of the object
ID belongs to the object itself. Let's select these two. And let's create getters and setters.
But as you can see, we do have a getter and setter for this static variable. Okay, now
that we have this class, if we want to create an instance of that class, for example, from
inside our main class, if you say test class, let's name it test class is equal to new test
class. The constructor in here is waiting for an age and also a skin color, let's say
25. Right? This way, we can create our instance of the class but how do we assign a value
to the name variable farming site artists class? Well, you can use the setter methods.
For example, you can say test class dot set name, this method and you can pass a name
for example, Mason, but there is a warning in here this highlighted warning. What does
that mean is that you can set a value for this name variable even without instantiating
your class. For example, in here, I can say test class with a capital T dot, let's say
name. Or alternatively, because the setter method for this name is static as well, I
can say set name. Let's use the first one, I can say test class dot name is equal to
for example, Mesa, we can see that even without instantiating this object, we can assign a
value to this variable. In order to make sure of that let's move these two line of code
to after assigning a value to the name variable. I can also delete this setname method safely.
Now, if I want to have access to the name variable of this test class, I can say something
like this. I can say name plus test class this time with flirty. That let's say getname.
Let's run the application and let's see what would be the result. You can see that message
has been printed even though we have set the value of this name variable before instantiating
our object so whenever you use a static variables that variable will be the same in all instances
of your class. For example, if I have another instance of this test class, for example,
if I say test class, second test class is equal to new test class,
maybe another age and another skin color, let's say 30. Black. If I print the name variable
of the second test class, the result would be the same. Let's say second test class dot
get name, or for that matter, we can say name. Let's run our application, you can see that
my Sam has been printed. Besides variables, methods can be as static as well, let's quickly
define a static method inside our test class, let's say public static void. Let's name it
print something. And inside this method, let's just print something. This static method like
a static variable belong to the object itself and not to the instances of this object. For
example, in here, once again, I can say test class with a capital T dot print something,
you can see that we do not need to instantiate our object. If you're on our application,
you can see that something is printing. Okay, now we know that static variables and methods
belong to the object itself and not to the instances of that object. But why would we
want to use a static variables and methods there are a few reasons for that. First of
all, you may want to have a constant variable in all instances of your class. For example,
imagine that you are creating a class for simulating different employees of a company
inside that class you may have some information about the employee, for example, the age,
the name, email, and everything. But besides all of those, you may have a field called
company name, you know that in all instances of your employee class, the company name should
be the same for that matter, you may want to declare your company name field as a static
also, some say that using a static variables and methods is very memory friendly, because
there can be only one instance of that variable or method in all of your application. So no
matter if you have 1000 employees in your application, the company name field in all
of those instances will occupy only some spaces as a string can so using a static variables
and methods is very memory friendly. But there is a downside when you're working with this
static keyword. Let's quickly see that inside our test class as well. Let's quickly create
another method in here, let's say public void. Let's name it print, notice that this print
method is not a static and because this is not a static now, we cannot have access to
that method from inside this print something method for example, in here I cannot say print,
you can see we have a red warning in here. It says that non static method print cannot
be referenced from a static context similar to non static methods, you cannot have access
to non static fields inside the static method as well. For example, in here if I try to
print the age of this test class, you can see that we are getting a red warning in here.
Once again, the warning says that non static field cannot be referenced from a static context.
So you cannot use non static fields and methods inside a static method. Okay, I think that's
enough talking about this static keyword. Let's quickly delete this class. Also, we
need to delete all of these lines of code. Okay, now we know everything about this main
method. First of all, its access modifier is public. It's a static method, its return
type is void, its name is main. And also as the input of this method, we are receiving
a string array called arguments. Because this main method is a static, we know that there
can only be one instance of this main method in our entire application. We are not concerned
about the voice in here, but we know that in order to run Java applications, we need
a main method, which is a static with this specific syntax. Okay, that's enough. Let's
move on. The next topic that I'm going to talk about in here is inner class. Let's quickly
see that in another class called test class. Inside our classes, besides variables and
methods, we can also have another class and here is how we can define that class. We can
say private, let's say class, I'm going to name this class test inner class. And here
we have this inner class like before, inside this in our class, we can have other methods
and variables. For example, I can say private string name in here. I can have a constructor
for this class as well. Let's quickly see that you can see we can create the constructor
we can create all sorts of getters and setters. And we can treat this class as any other class
in Java. But there are a few differences between a class and an inner class. For example, if
we have some fields in our parent class, that's Let's define some, let's say private int,
age, and private string color. No matter what the access modifier of these fields are, we
can have access to these inside our tests in our class. But we need to do that inside
another method, let's say private, void, print the page. Inside this method, I can say print,
let's say age plus age, you can see that it's working fine. Even though the access modifier
of this age is private, we can have access to that from inside our inner class. The same
is for different methods of your parents. Plus, no matter what the access modifier of
those methods are, you can have access to them from inside your inner class, there are
some times that you may want to use inner classes for example, when you use inner classes,
your code might be much more easier for us to follow. The other reason for using inner
classes is that you can have this private access modifier at the declaration of your
class if you remember, we cannot change this public access modifier when we create our
parent class for example, in here I cannot say private you can see an error in here and
if you hover over that you can see that modifier privates not allowed in here beside private
access modifier You can also have a static classes. That is another benefit of using
inner classes you didn't have this option when you created your parent class let's quickly
see that if I say static in here once again modifier static not allowed in here. So within
our classes, you can have private and static classes in this course, we are not going to
use inner classes that much. In fact, the first time that we are going to use it is
when we know about async tasks. In most cases, we are going to define our async tasks as
inner classes. We will talk about that later on in the course. Okay, I think that's a good
point to stop the video in here. I did want to talk about interfaces and abstract classes
in this video. But I think that's better to have that discussion in the next video. So
see you in the next video. As I said at the end of the previous video,
In this video, we are going to talk about interfaces in Java interfaces are like a contract
between two parts of your application. Let's see what I mean by that you can create an
interface like you have created a Java class, you can right click on your package by selecting
new Java class. And then in here, by selecting interface, you can have an interface Let's
name this interface card interface. If you take a look at your package, you can see that
we have created this interface. And if you take a closer look, you can see that the icon
for this interface is somehow different from the icon of classes in Java. This is the general
schematic of an interface in Java, like classes, interfaces, lives inside the package, they
have this public access modifier, we can name our interfaces, whatever we want. And also
they have this interface keyword in their declaration. Inside interfaces, we can define
our abstract methods, let's quickly see an abstract method. I can say public, let's say
void. After that, let's say print name. As the input of this method, let's just receive
a name, let's say a string name. And that's it, you cannot have a body for your abstract
methods. For example, in here, if I put a pair of curly braces, you can see that I'm
getting a red warning. And the warning says that interface abstract methods cannot have
body. So I can delete these two curly braces and I can finish my sentence in here. By using
abstract methods you are hiding the functionality of your methods. For example, in this case,
we don't know what this print name method does. Instead, we are just defining some sort
of contract. The contract in here is the signature of our method, we know that the name of this
method is print name, we know that we are receiving a string called name. And also we
know that the return type of this method is void. The signature of this method is a contract
in which ferrovie implements this interface, we are going to use this signature. Also if
you take a look at this public keyword, you can see that it's somehow grayed out. If you
hover over that keyword, you can see that modifier public is redundant for interface
methods, it means that it's not necessary in here. And the reason for that is because
all of the abstract methods are public inside an interface. It means that you cannot have
private or protected abstract methods. Inside your interface. You can have as many abstract
methods as you want. For example, if I want to define another one in here, I can say void.
Let's name this one to start. And I'm not going to receive anything as the input of
this method. Let's define another one. Let's name the spawn move. And also let's receive
an integer call. Speed, I created the first method so that I can show you how you can
create abstract methods. And I'm going to delete that in here. So this car interface
has two methods start and move. But how can we use this interface? Let's quickly see that
as well. Inside my package, I'm going to create a Java class called electric car. And inside
this electric car, I'm going to implement that interface that I just created. In order
to implement that interface, I am going to say implements at the declaration of my class.
And after that, I need to provide the name of my interface. In this case, it's called
interface. But once we do that, you can see that I'm getting a red warning in here. And
for this red warning, we need to implement the two methods that we have created inside
our interface. In order to implement those two methods, we have multiple options. First
of all, we can click on this red light bar. By selecting implement methods, we can implement
the necessary methods. Or alternatively, if you don't see this red light, well, you can
click on the error and by pressing ALT plus enter, you can see the same dialog or the
other option is to come inside the declaration of your class. And by pressing Ctrl plus i,
you can see the list of necessary methods. In this case, we have a start and move methods.
Also, if you press Ctrl plus or you can see the list of all of the methods that you can
override. In here, you need to be a little bit careful because all of these methods are
none necessary. The methods that are necessary are these two methods. If you take a closer
look at the icon of these two methods, you can see that the icon is somehow not completed.
These are the two methods that we need to implement or override. Let's select them.
And in here we have a body for this start and move method, it means that we can define
the functionality for these two methods in here. For example, in the start case, I'm
just going to print something. Because it's an electrical car, I'm going to say electricity
flow started. Let's also define a field for this class. I'm going to save private string
name. We can also have a constructor by pressing ALT plus insert, let's create that constructor.
And let's also create getters and setters. down in here, let's also define some functionality
for this move method. Once again, I'm going to print something, let's say this that getname
plus moves at some speed. Okay, now that we have created this class
in which implements our interface, how can we instantiate our interface for that we can
switch to our main class. And inside this main class, we can say car interface. Let's
name it car interface is equal to in here I have two options. First of all, I can say
new car interface like this for Java classes. But if I do that, you can see that we are
overriding these two methods. Sometimes this might be our desired behavior. But in here,
I'm not going to use this way. Instead, I'm going to say is equal to new electric car.
This one, let's also pass a name, let's say Tesla, you can see that we are assigning a
class to an interface. But how is it working? Well, because when we have created our class,
we implemented this interface. Now Java compiler is happy with assigning a class to this interface.
Now that we have instantiated this interface, we can use its methods. For example, I can
say car interface dots, let's say start. And also let's say car interface dot move, we
also need to pass a speed, let's pass 60. Let's run the application, you can see that
electricity flow started and Tesla is moving at 60 miles per hour. You can see that even
though inside our interface, we didn't have any body. But we are printing some functionality.
When we call the start method on our interface. If you want to make sure that this start method
is happening inside your class. You can also print something else in here for example,
inside this start method, let's print the name of this class. I'm going to pass this
if you remember I said that this refers to the current object. In this case, it's referring
to this class and right now if I print this, it will print the address of our class. Let's
run the application. You can see the address of our electric car class. It means that this
start method is happening inside our electric car class and not inside the interface. If
you remember when we have talked about collections, we have defined array lists in two ways. One
of those ways was to define our array list as list for example, because I've said list
which once again you can see that is an interface. For example, the stuff a string, let's name
it names is equal to new ArrayList Probably now you understand this syntax in here, it
means that we have this ArrayList class in which implements this list interface. If you
want to make sure of that and see it for yourself, you can press down the CTRL key on Windows,
I believe it's Command key on Mac. And by clicking on this ArrayList, you can see the
documentation for your ArrayList class. Let's scroll a bit above in here inside the declaration
of our ArrayList class, you can see that we are implementing this list. Don't worry about
this in here, it means that we are going to accept any kind of object but as you can see
if you are implementing this Okay, let's move on from here. Now that we have our interface,
we can also have another class in which implements this interface. Let's quickly create another
class, let's say new Java class. Let's name this phone fossil fuel car. Once again, in
here, I'm going to say implements. Let's say car interface, we need to implement two methods.
Let's press Ctrl I, and let's select our two methods. Once again, let's define some functionalities
for these two methods. For example, let's bring something in here. Let's say explosion
in cylinder cause the engine to start. Before I define some functionality for this move
method, let's quickly add a field above in here like before, I'm going to say private,
the string name. Let's create the constructor and also getters and setters. After that insight,
the move method, I'm going to say this car is moving at some speed. Now that we have
created this class, we can instantiate our interface inside our main class, like this,
let's delete this line of code. In here I can say car interface. Once again, let's name
this one fossil car interface. Like before, I can say new fossil fuel car.
Let's pass Mercedes in here, for example. Once again, you can see that Java compiler
is happy with this way of instantiating our interface because we have implemented this
car interface inside both electric car class and also fossil fuel car class, we can instantiate
our car interface in both of these ways. And after that, I can say fosu car interface dot
start. And let's see fossil car interface dot move. Let's also pass some speed in here
and let's run our application. You can see that both of these methods have been called
in here, I have a point by defining two classes and implement the same interface in both of
these classes. My point is that when you create an interface, that interface is a contract
between different parts of your application. For example, in this case, I'm defining multiple
points of cars. No matter what kind the car is, the contract says that discourse should
have a start and also a move method. So probably by now you can see the usage of interfaces.
But there are a lot more two interfaces. For example, we can use something called callback
interfaces. callback interfaces are extremely useful for when you create event listeners
like clique listeners. And also they are useful for when you want to create some sort of connection
between two different threads. We will talk about threads in the next video, don't worry
about that, we will see the use of interfaces when we want to create a communication between
two different threads. Also, it's worth noticing that you can implement multiple interfaces
at the declaration of your class. For example, let's quickly create another interface in
here, I'm going to name this one test interface. For this, let's just have a method in here.
Let's say sorry, for private, the abstract methods cannot be private, let's say void
print name. And let's receive a name. After I have created this interface inside,
for example, my fossil fuel car, after implementing the first interface, I can add a comma. And
after that I can provide the name of my second interface. In this case, it's test interface.
But once again, you can see that we are getting the error somewhere inside the declaration
of our class, I can press Control plus i and i can implement my method. So you can have
multiple interfaces implemented at the declaration of your class. Okay, I think that's enough
talking about interfaces. Later on in the course we are going to use interfaces a lot
and Dave users will be much more clear. So hang in there if something is vague. Okay,
let's delete all of these extra classes and extra interfaces. Let's also delete these
lines of codes. Now let's talk about abstract methods. For that I'm going to create a new
class inside my package. Let's say new Java class, I'm going to name this fun test abstract
class. If you want to make your class abstract, you need to add another keyboard between the
access modifier and the keyword class. Let's add abstract in here you can see public abstract
class. And immediately after I've added this abstract keyword, if you take a look at your
package, you can see that the icon for this class has been changed. This means that this
is an abstract class. inside an abstract class like interfaces. You can have abstract methods,
let's quickly see them. For example, I can say public abstract, let's say void, and let's
name this font print name. Let's receive a name string name. Once again, like interfaces.
When you create abstract methods, you cannot have a body. For example, if I put a pair
of curly braces once again, I can see the warning in here like before I can finish my
sentence with the semicolon. The use of abstract classes is a lot like interfaces. But there
are a few slight differences. For example, let's see the first difference in here inside
my package, I'm going to define a new class, let's name this one test class. When we wanted
to implement some interface, we could have said implements. And after that the name of
our interface. But when we want to use abstract classes, we can say extends, let's say extends
test abstract class. Right now we are getting the warning again by pressing Ctrl plus if
you can see the necessary methods. So the first difference is between this extends and
implement keyword. The other difference is that when you want to use abstract classes,
you cannot extend multiple abstract classes. For example, in here, I cannot add a comma
and add another abstract class in another word abstract classes does not support multiple
inheritance. So that's the second difference between an interface and abstract class. The
other difference is that inside your abstract class, you can also have non abstract methods.
For example, in here, I can say public, let's say void. Let's name this method print. Let's
receive something in here. For example, let's say a string text. And because this is not
an abstract method, we can have a body for this method. We didn't have this option inside
an interface, we can have public non abstract methods inside an abstract class. Like every
other class, we can also have fields and maybe a constructor as well. For example, let's
say private string name. Let's create a constructor for this class, you can see that all is working
well. So the other difference is that you can have fields constructors and non abstract
fields. If you want to see the use of abstract classes like before we can switch to our main
class. And in here, I can say test abstract class. Let's name it test abstract class is
equal to new test class, the class that extends artist abstract class. After that, we can
use the methods for example, I can say this abstract class dot, let's say print name.
In here, we need to provide a name, let's say Mesa, but we didn't have any functionality
inside artists class, let's quickly define some functionality in here. Also know that
I've switched to this test class. Because we have created a constructor inside our test
abstract class, we need to create the constructor in here as well. But for the sake of simplicity,
I'm going to delete all three of these, because I just wanted to show that these three options
are available inside an abstract class. Let's bring something inside our test class inside
this print method. Let's just print the name. Let's run the application and let's see if
we can see Mason printed into our console. You can see my Sam has been printed. So once
again you can see that inside artist abstract class, we have this abstract method which
does not have anybody instead we have an extended this class inside our test class. And we have
declared the functionality inside this test class, you can see that there are a lot of
similarities between interfaces and abstract classes. Sometimes the decision for using
an abstract class or an interface can be hard for that let me show you an Oracle web page
in which may help you to decide better you can see the address in here. I think if you
check this webpage, it might be helpful. They say that use abstract classes when your classes
are related to each other. Or the other case is that when you think that the class that
is going to extend the abstract class may use some common methods or fields or also
it may require some access modifiers other than public such as private and protected
or the other case is that when you want to declare some fields that are non static and
non final, this option is also not available in interfaces, but they say that Use interfaces
when your classes are not related to each other, or in cases that you want to use multiple
inheritance we can see that when we use interfaces, we can implement multiple interfaces. Once
again, I suggest you take a look at this webpage, it might be useful. Okay, I think that's enough
for this video. In the next video we are going to talk about concurrency and threading in
Java See you in the next video. In this video, we are going to talk about
concurrency. In Java. concurrency means doing things simultaneously and at the same time.
For example, imagine that you're working with your phone and you're reading a book at the
same time, you may want to listen to some music simultaneously, you may be downloading
some files from internet This is called concurrency or doing things at the same time in programming.
In Java. The first option that we have in order to create a concurrent programming is
to create a thread a thread is a unit of execution in your device's central processing unit or
CPU. Basically, different threads come together inside something called a process. All of
these processes will be handled by your device's CPU. By default, when you run your Java application
or for that matter, your Android application, a thread called the main thread will be created.
Also, some might call this main thread the UI thread or the user interface thread as
well. Later on, if you want to do some background task, for example, downloading a file, you
will create a worker thread inside your main thread. The first option in Java that you
have in order to create a thread is like this. You can say thread, let's name this thread
is equal to new threat. Like the finding any other Java class. Let's finish our sentence
in here. The constructor of this threat requires an interface and that interface is the runnable
interface, we can pass that like this, we can say new runnable, you can see that this
runnable is an interface. When you pass this runnable interface, this run method will be
created. Basically this run method is the place that you put the code that you want
to be handled inside of worker thread. For example, let's print something in here. And
let's see if we can have a complete application. For example, let's say hello from another
thread. In order to start this thread, we need to come down after the declaration of
our thread and say thread dot start, let's run our application. And let's see if we can
see any result, you can see that our message has been printed into the console. But how
do we see the difference between the main thread and this worker thread for that I am
going to write a piece of logic in here. For example, inside this run method, I'm going
to create a for loop. Let's say for int i is equal to zero, i less than, let's say five,
and i plus plus. Inside this for loop, I'm going to print the value of this I and after
that I'm going to asleep the thread we will see how we can asleep the current thread.
First of all, let's say print printing, let's say plus I plus, let's say in a worker thread.
In order to asleep your thread, you have multiple options. The first one and I believe the easiest
one is to say something like this you can say thread with a capital T dot sleep. Inside
the parentheses of this sleep method you need to pass some numbers in milliseconds. For
example, if I want to sleep my tread for one second, I need to pass 1000 milliseconds this
asleep method is going to cause our loop to wait one second for the next record for example
in here we are going to print zero after that we are going to wait one second. And after
that we are going to print one but right now as you can see, we are getting a warning in
here and the warning says that unhandled exception Java dot Lang dot interrupted exception. In
the previous videos briefly, we have talked about exceptions. We will talk about them
in this video later on. But for now, you just need to know that whenever an exception occurs,
your application would crash. So because of that, we need to do something for this error
in here. The easiest way to overcome this error in here is to click on the error and
press ALT plus insert. After that, select this surround with try catch, you can see
that this code has been added and our thread dot sleep method has been moved to this try
block later on. We will talk about this. But for now let's move on from this part. And
let's write the same logic inside our main thread so that we can see that the code inside
the worker thread and the main thread can be executed at the same time. So basically,
I'm going to copy this for loop. Let's copy it from here and inside the main thread outside
of this run method. Let's base the button here. I'm just going to change this message
to main thread. Let's run the application and let's see If this code is going to work,
as you can see, we are printing the value of oil two times. Once in a worker thread,
and once in the main thread, it means that the code inside the worker thread and the
code inside the main thread are happening at the same time. In this situation, we say
that our application is asynchronous, or it is concurrent. So once again, when you run
your Java or Android application, one thread will be created by default, in which we call
that thread the main thread or the UI thread. After that inside that main thread, you can
create as many worker thread as you want. The simplest way to create a thread is to
say thread thread is equal to new thread. And after that, we can pass a new runnable
to the constructor of your thread in which we will create this run method that will be
executed in a background thread. But by this way of defining your thread, there are a lot
of considerations that you need to be worried about. For example, you need to be worried
about cancelling your thread when the work is done. Also, there are all sorts of new
concepts, for example, thread pools, deadlocks and interrupting your thread. I do not intend
to talk about all of those concepts in here, because in Android, we have all sorts of options
available for handling background tasks. In fact, later on in the course, we have a complete
section dedicated to handling background tasks. In Android, we have options like async, task
services, Job Scheduler, and work manager, we are going to talk about all of them. But
more on that in future videos. Okay, now let's talk about this interrupted exception that
is happening in here. Basically, whenever an exception occurs, your application will
crash and your application will be closed by the operating system. There are all sorts
of exceptions that can occur. For example, the ones that we have seen previously, were
arithmetic exception, null pointer exception, and the one that we can see in here is interrupted
exception. So in order to avoid crashes, you need to do something about the exception.
Let's comment all of these and let's see what we can do about the exceptions. Let's create an application in which we will
create an arithmetic exception. In here I'm going to define two new integers. For example,
let's say int, a is equal to two, and int b is equal to zero. Let's bring something
in here. Let's say print a divided by b. If we run our application, right, now, we should
see an arithmetic exception. You can see that down in here. The thing that we can do about
this exception is that to catch it whenever it happens, and we can do that by using a
try catch block. Let's quickly see that for example, I can say try. Let's move this line
of code to inside our try block. We can say try this in case some exception happens catch
that exception. The kind of exception was arithmetic exception. So let's say arithmetic
exception, let's name this exception E. And inside the catch block, we can do something
else with our code. For example, we can print something. In this case, let's say B was zero.
Now, if we run our application, we wouldn't get an exception. Instead, we are printing
this message. Sometimes this message might not to be useful. And in fact, in most cases,
this message will be useful for debugging purposes, but it's much better than a crash.
The kind of exception that we are catching in here is arithmetic exception. If we do
not know the kind of exception, we can pass the generic term exception. If you pass this
exception, it's going to accept all of the exceptions. If we run our application, once
again, we should see the same result. And here is the same result. The other kind of
exception that we have seen so far was null pointer exception that would occur when we
do some operation on a null object reference. For example, if we had a string in here, let's
say a string name is equal to Now, if we do some operation on our name inside the try
block, for example, if we say name, dot equals, let's say, Mesa, if we do that, we are going
to get a nullpointerexception. Because we have done this dot equals method on a null
object inside the catch block this time, instead of saying B was zero, let's say name was no.
If you run the application, it's going to work fine because we are passing the generic
term exception, but we can safely pass null pointer exception. Let's run the application.
You can see that name was no the other kind of exception that we just saw was this interrupted
exception. It's going to happen whenever we interrupt the current thread. For example,
imagine that inside a worker thread, you are downloading some file at the same time, you
may receive a phone call. If you don't catch the interrupted exception, you may get a crash.
We have all sorts of exceptions. For example, we have audio exception, which stands for
input output exception We have class cast exception, we have all sorts of other exceptions
in which we are going to talk about them whenever we face them. Also on our exception, we have
a useful method for debugging purposes. And that method is called print stack trace, we
can see the name of our exception dot print a stack trace, we will talk about this stack
in future videos when we talk about activities and fragments in Android. But for now, just
know that this line of code in here is going to print something into our console that might
be useful when you're debugging your application. Let's run the application in here. You can
see the stack trace of your exception in here it says that the exception occurred in line
34, which is this line, and you're also seeing the name of your exception, this is not an
actual exception, you're just seeing some information about your exception, this in
here might be useful for when you're debugging your application. Okay, I think that's enough
talking about concurrency and exceptions in Java. In the next video, we are going to talk
about Singleton pattern in Java. See you in the next video. In this video, we are going
to talk about Singleton pattern. Basically, we use Singleton pattern when we want to make
sure that we have only one instance of some class in our entire application. In some cases,
we may want such a thing. And here is how we can implement that pattern. For example,
one case of using Singleton pattern is when you are using a database in your application.
Don't worry about the databases, we have a complete section dedicated to them. But in
here, we are just going to create a simple Java class named database. Let's quickly create
that inside our source folder inside our package. And we will see how we can implement that
patter. Let's name this class database. For this database class, I'm going to define a
field let's say private string name. Also, let's create a constructor and also getters
and setters. Right now, because we have this public constructor,
we can create as many instance as we want from this database class. But if you want
to make sure that you have only one instance of this class in your entire application,
you can create another field in here, for example, I'm going to say private, static
as the data type of this field, I'm going to specify the class that we are in for example,
in this case, I'm going to say database. So let's say private static database, make sure
to import the one that comes from our package or dot maker dot Singleton pattern. For the
name of this field, it's convention to name it instance. And that's it. Now we can create
a getter method for this field. And here is how we can create that field, we can say public,
because we are going to use this instance inside this field, I'm going to say static,
the return type of this getter method is going to be the class itself. So I'm going to say
database. Let's name this method. Get instance, as you can see the suggestion in here and
let's have a body for this method. In here, instead of just simply passing this instance,
I'm going to create an if statement, I'm going to say if let's say now, is equal to our instance,
if that's the case, I'm going to create a new instance, I'm going to say instance, is
equal to new database. Notice that we need a name for the constructor of this database.
So I'm going to receive that name via the input of this method in here, let's say the
string name. And later on, let's first this naming here. So if our instance is now we
are going to create a new instance, and after creating that we are going to return it, we
can say return instance. But in the other case, in case if our instance is not not in
the else case, I'm just going to simply return instance, right now if we use this get instance
method, instead of this constructor, we are sure that we have only one instance of our
database class in our entire application. For example, if we go to the main class, and
if we try to instantiate our database, we can have only one instance we can say database,
let's name the database is equal to database with capital D dot get instance, of course,
we need the naming here. Let's pass a name. For example, let's say DB music. Notice that
because we have declared this get instance method as a static, now we can use this database
class with this capital D, it means that we are not relying on the instance of this database
class. Instead, we are using the object itself. But right now someone can declare the database
class as we did for any other class. For example, in here, someone can say database. Let's name
this one test database is equal to new database because in our database
class, we have the constructor, we can pass a name in here and if we do that, we have
another instance of this database class. For example, let's say DB movies. In order to
restrict users from using the constructor, I'm going to change the access modifier of
this constructor inside my database class, I'm going to change this public to private,
so that this constructor would be available only from inside this class and not from inside
any other class like this main class. Right now we have an error in here and the error
says that the constructor is private. So by changing the access modifier from public to
private, now, we are restricting others from creating multiple instances of our database
class. But because our constructor inside our database is private, we can use this constructor
inside this get instance method, as you can see in line 10, in here, right now, because
of this static keyword. And also because of this, if statement that we have put in here,
we are sure that we have only one instance of our database class. But there is also another
point that we need to be worried about. And that's when someone tries to create multiple
instances of our database from multiple threads. In some cases, if someone tries to create
multiple instances of our class asynchronously, they might be successful in doing such a thing.
In order to make our get instance method thread safe, we have an option in here after this
static keyword, we can add another keyword in which we haven't seen so far, we can say
synchronized, this synchronized keyword will make our get instance method thread safe,
it means that no more than one thread can call this get instance at the same time. So
this is the whole Singleton pattern. First of all, you declare a static field of the
kind of your class for example, in this case database, after that, you create a get instance
method in which is a static once again and also synchronized. Inside that get instance
method you are checking that if the instance of your database is now or not, if it is not,
it means that it's the first time that you are calling this get instance method. So you
need to create a new instance like we are doing in line 10. After that, we are returning
the instance but in the else case, we are not going to create a new instance, we are
just going to return the existing instance beside this get instance method. In order
to restrict others from using the constructor, you need to change the access modifier of
your constructor to private so that it would be usable only inside your database class.
We can also make these if statements shorter for example, in here, I can delete this whole
else case. And I can delete this return instance from line 11 in here, and after the if statement,
I can return that instance. So by the time we reach to this line 13 in which we are returning
the instance, we are sure that our instance is not not and we are returning either a new
instance or the existing instance. Okay, I think that's enough talking about the singleton
pattern later on in the course, you will see that this pattern might be useful from time
to time. Before I finish off this video, I'm going to talk about one more methods available
in every class in Java. And that method is called to string right now we don't have any
to string method inside our database class. But if we switch back to the main class, and
if we say print database.to string, you can see that we have such a method. And if we
run our application, we should see some information about our database class. Let's quickly run
it and let's see if we can see any result. You can see that we are getting the address
of our database class. If you want, you can change this for example inside your database
class, you can override the two string methods down in here inside the scope of our class,
we can press Ctrl plus or and from here we can select this two string method. Right now
we are returning the super statement. If you want to change that we can delete this whole
statement. And we can prepare a string in here. For example, we can say a string text
is equal to let's say database class. After that, let's add a line. And after that, let's
print the name of our database. Let's say name plus the start name. After
creating this text, we can return for example, we can say return text. Now that we have overrided,
this two string method, if we run our application, we should see some other results printed into
our console. From time to time this two string method can be useful as well. It's available
in every Java class and basically it will print some detail about that class. Okay,
I think that's enough for this video. And for that method. I think that's enough talking
about Java. Our Java section is done and hopefully we have learned a lot in the next video we
are going to have a quick challenge in order to make sure that we have learned everything
that we have talked so far. But before I finish off this video, I'm going to say that with
Java, you can do a lot have things for example, besides writing Android applications, you
can use Java in order to create desktop applications for Windows, Linux and Mac OS operating systems.
And also with the help of spring framework, you can use Java in order to create enterprise
web applications. There are much more to Java language. For example, you can use Java in
order to create applications for quantum computers. You can also use it for data analysis purposes,
and literally everything else that you want. In this course we have touched the surface
of Java language. But if you want to know more, I'm currently recording a new course
for Java language. And I'm sure that you will find that course helpful beside the Java course
I plan to record a complete course for a spring framework in order to create web applications.
By the time you're watching this video, those courses may be released, so make sure to check
them. Okay, I think that's enough. In the next video, as I said, we are going to have
a quick challenge See you in the next video. Here is our final challenge for the Java section,
I want you to simulate your phone's contacts and messages applications. Here is how our
application is going to work. First of all, we are going to greet the user with some message.
After that, we are going to show three options to the user, one for managing the contacts,
another one for handling the messages, and another one for creating the application.
In case if the user selects the first option, which is managing the contacts, we are going
to show these options, one for showing all of the contacts another one for adding a new
contact. Another one for searching for a specific contact. One more for deleting a contact.
And the last one is to go back to the previous menu, which was these three options. But in
case if the user selects the second option, which is handling messages, we are going to
show these three options. The first one is to see a list of all of the messages. The
other one is to send a new message and one last one in order to go back to the previous
menu in which is our initial menu, which has three options. In case if the user selects
these third option, we are going to create the application. We haven't talked about databases
and permanent data storage. But as a hint, if you want to store contacts and messages,
you can use a static variables. Okay, pause the video in here and go solve the challenge.
After that, come back. And let's see my solution for this application. Okay, let's go to see
how can we create this simple application. First of all, I have created my project, and
I have created this package inside my source folder. Inside this package I have created
this main class in which contains this main method. Let's continue from here. First of
all, I'm going to create a new Java class called message. Inside this message class,
I'm going to have three fields, let's say private string text. Another one, let's say
private string recipient. This recipient in here is going to be the name of our contact.
Also in here, I'm going to define an integer called ID, let's say private int ID. This
ID is not necessary for this application in here. But because in most cases, when you're
working with databases, you have a column called ID in order to identify every unique
message. I want to be as close as I can to a real world application. I just wanted you
to see this ID field inside a model in which is a message. Okay, now that we have these
three fields, let's quickly create a constructor. And let's accept all of these three fields.
After that, let's create getters and setters. I'm not sure that we are going to need all
of these getters and setters later on. If we didn't use them, we will delete them. Also
inside this message class, let's quickly create another method called get details. Basically,
we are going to print the details of every message. So let's say public void. Let's name
it get details. Let's say print. First of all, let's say contact
name. And let's print the recipient. After that, let's print the text itself. Let's say
message plus the text. We also need to add a plus in here. Sorry about that. And I think
if we add a backslash n in here, it would be much better. After the text. Let's also
print the ID Let's say backslash n, Id plus our ID. That's it for our message class, let's
quickly create the contact class as well. New Java class, let's name this phone contact.
Inside this contact class, I'm going to have four fields, let's say private string, name,
private string. Number, you may think that this number should be an integer, or maybe
a long, but because different numbers can have different formats. For example, they
can have some parentheses or maybe some hyphens. I am saving this number as a string. But if
you want, you can always use integers or long. After name and number, I'm going to save another
field in here, let's say private string email. After all of these, I'm going to have another
field in here, let's say private ArrayList of different messages. Let's name this phone
messages. So basically, I'm going to save different messages for every contact inside
an ArrayList. Okay, now that we have our four fields, let's quickly create our constructor.
But in here, I'm going to create two constructors, because at the time of creating a new contact,
that contact does not have any messages. For that, I'm going to create another constructor
in here, which will not accept an ArrayList of different messages. This time, let's select
the first three items. But because if I don't do anything about this messages, this ArrayList
will be now inside this constructor, I'm going to see these dots messages is equal to new
ArrayList. So at the time of creating a new contact, I'm saving the messages array list
as an empty array list. Okay, now that we have two constructors in here, let's quickly
create getters and setters. And also after that, let's create a get details method. Let's
say public void, get details. We can also use two string methods. But in here, I'm just
more comfortable with this get details method. let's print all of the information about each
contact. Let's say name plus the staff name. After that, let's print the number and email.
Okay, that's it for our contact class. Let's switch to main class. And let's write the
logic for our application. First of all in here, I'm going to create an ArrayList of
different contacts. But I'm not going to do that inside this main method because we are
going to have multiple methods and we need to have access to our contacts are released
in different methods for that I'm going to define my ArrayList above in here in the fields
of this main class. I can say private, static, because the methods that I'm going to use
later on are static methods, I need to create this ArrayList as a static, so let's say private
static array list of different contact. Let's name it contacts. But this is not a good place
to initialize our contacts ArrayList because this is not the place that our code will be
started. We can initialize our contacts ArrayList for example, inside this main method. But
before I do that, I'm going to also define a scanner in here because we are going to
need the scanner in multiple methods. So let's say private static scanner, let's name it
the scanner. After that inside the main method, let's initialize our contacts ArrayList. Let's
say contact is equal to new ArrayList. As you can see in here, I'm going to greet the
user with some message, let's just print something. After that, I'm going to show these three
different options to the user. Because I want to have a clean code. I'm going to show these
three options inside another method. Let's name that method show initial options. But
as you can see, right now I'm getting a red warning and that's because I need to create
this method down in here. So let's say private, static void, show initial options. Let's bring
the options in here. After that, we need to get the user's input. And for that we can
use the scanner. So let's initialize our scanner. Right now we have declared our scanner above
in here, but we never initialize that. It's a good place to initialize our scanner in
here. We can say a scanner is equal to new scanner. Let's pass the system that after
that, we can say it's choice is equal to a scanner dot next int. Let's create a switch
upon this choice. Let's say switch on choice. In case the choice is one, we are going to
manage the contacts. Once again, let's do that in another method, let's say manage contacts.
Don't worry about this read warning, we will create this method later on. Let's also add
a break in here. But in case and the choice is to, we are going to handle the messages.
So let's say manage messages. In case the choice is three, or for that matter, any other
number, we are going to create the application. So in here, I can say default. In the default
case, I'm just going to break out of the application. Let's minimize this project main for now.
And then in here, let's create our two methods. First of all, let's manage our contacts. Let's
say private, static void, manage contacts. Once again, in here, I'm going to show a list
of options. So let's print those options. One, once again, we need to get the user's
input for that we can use the scanner, let's say int choice is equal to a scanner dot next
int. Notice that we are not initializing our scanner in here. And that's because we have
done that inside this short initial options method. So by this time, we have an instance
of our scanner. After that, once again, we need to create a switch on our choice. In
case it's one, we are going to show all of the contacts, let's create that method, show
all contacts. And also we need to break. Let's also write the rest of the cases. In the default
case, I'm going to go back to the previous menu. So I'm going to once again run this
show initial options method, so that we can see all of these options once again. So in
the default case, I'm going to say show initial options. After that in here, we need a default
as well. I'm saying default in here, because I'm going to go back to the previous menu
in case if the user enters any other number. Okay, let's create these methods one by one.
First of all, let's show a list of all of the contacts. I'm going to do that down in
here. Also, instead of writing the declaration of your method, you can use the help of your
ID. For that, you can click on the red arrow in here and by pressing ALT plus insert, the
first option is to create this method, you can see that we have created this method successfully,
the void is fine for the return type. And down in here, I can't create the logic for
this method. In order to show a list of all of the contacts, I'm going to simply create
a for each loop. Let's say for contact, let's name it see inside our contacts, or at least,
let's just say C dot get details the method that we have created inside our contact class.
After the for loop once again, I'm going to show the initial options. For that I'm going
to save show initial options. We are going to quit the application when the user tells
us that's all we need to do inside this method. Let's just minimize it for now. And let's
create the second method which is add new contacts. Once again, we can use the help
of our ID. Inside this add new contact method we are going to receive some users input.
But before that, let's print something you Let's say adding a new contact. After that,
let's say please enter the contacts name. Once again, we are going to use our scanner,
let's say a string name is equal to a scanner dot next, after we get the contacts name,
we are going to get the contact number. So once again, let's bring something in here.
Let's say please enter contacts number. Let's see string number is equal to a scanner dot
next, let's also get the contacts email string he made is equal to a scanner dot next. After
that, we need to make sure that the user enter something as the name number and email of
our contact. And don't just press enter and leave us with empty strings. For that, I'm
going to create an if statement in here, let's say if name dot equals an empty string. Let's say
or if number that equals an empty string. Or if email is equal to an empty string. If
each one of these is true, we are going to show some message to the user we are going
to ask to enter all of the required information. Let's say please enter all of the information.
After printing this line of code, I'm going to recall this whole method I'm going to start
from the beginning of this method. For that I'm going to say add new contact. I'm calling
this method from inside the method. This is called a recursive call, you can see the icon
at the left side in here. If you hover over that you can see the recursive call calling
a method from inside that method. So by this way of calling our method, we are starting
once again from the beginning of this method, but in the else case, we are going to create
our contact object, I'm going to say contact, let's name it contact is equal to new contact.
And after that, I'm going to pass name, number and email. If you remember inside our contact
class, we had two constructors. And in here we are using the second constructor, we didn't
pass any messages ArrayList to this constructor in here. After creating our contact object,
we can say contact our ArrayList dot add. Let's pass our contact. As simple as that.
Now we have added a new contact after this if statement. Once again, I'm going to show
the initial options. So let's say show initial options. Because once again, we are not going
to create the application unless the user tells us Ok, we are done with our second method.
Let's see what else do we have in here. Let's create this search for contact method. The
Void is fine for the return type. Inside this method first of all we are going to ask for
the name of the contact. So let's bring something let's say please enter the contact name. Let's
say string name is equal to the scanner dot next. After that we need to make sure that
we have received any so let's say if name dot equals an empty string. We are going to
print some message we are going to ask for the contact name once again. Let's say please
enter the name and after that once again we are going to use a recursive call. We are
going to say search for contacts once again. But in the else case, we are going to search
for this contact inside our contacts ArrayList. For that once again I'm going to create a
for each loop. Let's say for contact. Let's name it see inside our contacts are a list.
Let's say if c dot get name is equal to the name that we just received. If that's the
case, let's print c dot get details. Let's also define a Boolean before this for loop.
We will see why I am defining this Boolean. Let's say Boolean. Let's name it does exist.
Let's initialize it to false in this if state Wherever you have found the contact first
of all I'm going to change the value of this does exist to true, let's say it does exist
is equal to true. And after the for loop, I'm going to create an if statement, I'm going
to say if does exist is not equal to true. Then we are going to print something I'm going
to save there is no such contact. After all of these logics, we are going to
show the list of options once again. So let's say show initial options. Okay, that's it
for our search for contact method. Let's also create this delete contact method. Once again,
in here, we are going to ask for the contacts name. So let's say please enter the name.
Like before, let's say a string name is equal to a scanner dot next, next, we need to create
our if statement. If named, that equals an empty string, we are going to ask for the
name once again. And we are going to start from the beginning of this method. In the
else case, we are going to look into our contacts ArrayList. So let's say for contact see inside
our contacts list. Before I write the logic, let's also define a Boolean above in here
like we did for the search for contacts method. Let's say Boolean does exist. Let's initialize
it to false. So in here, let's say if I don't know why I said as in here, let's quickly
change this one to see. So let's say if see, that gets name is equal to the name that we
have received. If that's the case, first of all, we are going to change the value of this
does exist. Let's say it does exist is equal to true. After that, we are going to remove
this contact from our contacts ArrayList we can save contact dot remove. This remove method
requires an object which I'm going to pass see the object that we are currently looking
in this iteration. After the for loop, I'm going to say if does exist is not equal to
true then we are going to say there is no such contact. And after all of these logics,
we are going to show the list of all of the initial options. Okay, that's it for this
method. Let's minimize this one. So far, we have created the logic for the first option
in our initial options, we have created the whole logic for this manage contacts. But
right now in the logic for this manage contacts option, we have one or two possible points
for multiple bugs, we are going to fix those two and also we are going to write the rest
of the logic for this application in the next video. See you in the next video. In the previous video, we have created the
logic for this manage contacts option. But if you remember I said that we have some issues
right now with this manage contacts logic. And in this video, first of all, we are going
to fix those issues. The first issue is inside this add new contact method. In here we are
adding the contact into our contacts array list. But before that, we need to make sure
that we do not have a contact with this name saved on our device for that before adding
this contact to my contacts array list. I'm going to check that if I have such a contact
on my device. So first of all, let's create a Boolean in here. Let's say Boolean does
exist. Let's initialize it to false. After that, I'm going to create a for each loop.
Let's say for contact see inside my contacts I have a list. Let's see if c dot get name
is equal to the name that we just received. Inside this if statement, I'm going to change
the value of this does exist to true so let's say does exist is equal to true. After the
for loop I'm going to check that if this does exist is equal to true or not. Let's say if
does exist is equal to true. Then we are going to print something we are going to say we
have a contact with this name. After that we are going to start from the beginning of
this method. So I'm going to call this add new contact method once again. But in the
else case, I'm going to add the contact to my account. Tech's ArrayList, so I'm going
to call this line of code from here. And I'm going to paste them inside this else case.
Also, after adding the contact to our contacts array list, I'm going to show some message
to the user. So let's say name, added successfully. Okay, that's the fix that we needed inside
our add new contact method. Let's also change the show all contacts method a little bit
as well. So inside this for each loop, after printing the details of a contact, I'm going
to print another line. And this line is going to be just a separator that will indicate
the difference between different contacts. Nothing special in here. Okay, let's move
on. And let's create the method that we haven't created in here, this manage messages method,
by pressing ALT plus insert, we can create that method. First of all, we are going to
show a list of options. So let's print something. After that, we need to receive the user's
input, I can say int choice is the call to a scanner dot next int. And let's create our
switch statement on this choice. In case it's Vaughn, we are going to show a list of all
of the messages. So let's say show all messages, we will create that method in a minute. But
in here, let's add a break. And let's write the other cases. In case it's true, we are
going to send a new message. So let's say send a new message. And let's add a break.
In the default case, I'm just going to show the initial options. After that, in here,
we need a break as well. Okay, let's create this show all messages method. In here, first
of all, I'm going to save all of the messages from all of the contacts into an array list.
So let's say array list of different messages. Let's name it all messages is equal to new
ArrayList. After that, I'm going to create a for each loop. For contact, see inside my
contacts or in this. Let's see all messages that at all, we haven't used this add all
method, but in here, we are going to do that. I'm going to say C dot get messages. So by
using this add all method, we are adding all of the messages of one contact to our all
messages ArrayList. After the for loop, I'm going to check that if the size of these all
messages is zero or not. So let's say if all messages that size is greater than zero, I'm
going to show the details of every message. So for that, I'm going to create another for
each loop in here. Let's say for message, let's name it m inside out all messages, at
least. let's print m dot get details. And after that, let's also print some separator.
But in the else case, I'm going to say that you do not have any message. After everything
after the if statement, I am going to show the initial options. Okay, that's it for this
show all messages method. Let's also create the other method, which is send a new message.
In here, first of all, I'm going to get the contact or recipients name. So let's ask the
user that, let's say Who are you going to send a message. After that we need to get
the name of our contact. So I can say string name is equal to scanner dot next. After that,
we need to check that if this name is empty or not for that, I can say if name that equals
an empty string. We are going to ask the user to enter a name. So let's say please enter
the name of the contact. After that we are going to have a recursive call. So in here,
I'm going to say send a new message. But in the else case, I'm going to check that if
we have such a contact in our contacts ArrayList. For that I'm going to define a Boolean in
here Boolean does exist, is equal to false. After that, I'm going to create a for each
loop. Let's say for contact see inside our contacts or at least if see that gets name,
dot equals the name that we just received. Let's say it does exist is equal to true.
After the for loop, I'm going to check that if does exist is equal to true or not. First
of all, let's write the else case. In the else case, I'm going to say there is no such
contact. But inside the if block, if we do have such a contact, we are going to ask for
the message itself. So let's say what are you going to say? Let's say a string text
is equal to a scanner dot next. After that, we need to make sure that this text is empty
or not. Let's say if text that equals an empty string. If that's the case, let's say please
enter some message. And after that, we are going to start from
the beginning of this method. So let's say send me a message, which once again is a recursive
call. But in the else case, we are going to create our message object. And after that,
we are going to add it to the contact that exists in our contacts ArrayList. But if you
remember, inside our message class, we had a field called ID. Basically, whenever you
are receiving these messages from a database, or maybe a web server, this ID is unique to
every message. In here, I'm trying to be as close as I can, and to a real world application.
So I'm going to make this ID unique. In order to have a unique ID for every message, I'm
going to define a field above in here inside my main class I am talking about here. And
after that, we will increment the number of this ID by one every time that we create a
new message. For that I'm going to say private, static integer. Let's name this phone ID.
And let's also initialize it to zero. After that down in here, when we create our message
object inside this else case, down in here, I can say ID plus plus. So because this ID
is a static integer, whenever we increment its value, it's going to be unique for every
message. So right now we have the name of our recipient, which we have received above
in here. And also we have the message body, which is this text. And also we have generated
this ID which is unique. These are the three things that we need in order to create our
message object, I can say message, let's name it new message is equal to new message we
need the text. After that we need the recipient, which is name. And after that, we need the
ID. Next, I need to find the proper contact to add this message to his or her array list
of different messages. For that I'm going to create a for loop. Let's say for contact
see inside our contacts array list. Let's say if see that get name is equal to the name
that we received. If that's the case, first of all, we need to get the array list of different
messages of this contact. For that I can say array list of messages. Let's call this ArrayList
new messages is equal to c dot get messages. After that, we need to add this new message
to this new messages ArrayList so let's say new messages that add new message Sorry, I
have used this add all methods went to remove this all. After that we are going to save
the current contact that we are looking into. because later on we are going to remove this
contact from our contacts array list. And we are going to update his or her array list
of messages. And after that, we are going to add it once again to our contacts ArrayList.
So for that I can say contact. Let's name it current contact is equal to see. Next we
need to say current contact dot set messages. And we need to pass our new messages are released.
After that, it's time to remove the C from our contacts or at least we can say contacts
that remove and we can pass the C object. Now that we have removed the previous contact,
we can add the new one by saying contacts dot add. Let's say current contact. So this
way we have added this new message to our specific contact and we have updated our contacts
ArrayList Okay, that's the entire logic that we need in order to add a new message just
after everything after we are done with this method. We need to show the initial options
once again. Let's minimize this method. And let's see what else do we have? I think we
have covered everything. And we are ready to test our application. So let's run the
application. In here we are seeing the greeting message,
which is fine. After that we are seeing the initial list of options. If we select one,
we can see the options for managing different contacts. Right now we do not have any contacts
in our ArrayList. So if we select one, you can see that we are not seeing anything, it's
better to print some message in here in case if we do not have any contact in our phone,
for example, that says, you do not have any contact on your device, but we will write
that later on. For now let's just see the other options. Once again, let's select Manage
contact. This time, let's try to add a new contact, you can see that the console is waiting
for a name, let's say may Sam, the console is waiting for a number. Let's add some number.
After that, we need to provide some email, let's say may sam@gmail.com. And as you can
see Mason added successfully. If you want to make sure of that, once again, you can
check the list of all of your contacts by saying show all contacts. And in here you
can see the details of Mason. Let's also add another contact. Let's say Sarah, this thing.
Let's add a random number. After that an email. This time let's try searching for a new contact.
So in here, if I say three, you can see that the console is waiting for the name of our
contact. Let's type Brad in here, you can see that we are seeing this message there
is no such contact in your phone. Once again, let's try searching for contact this time.
Let's try Sarah. You can see that we are seeing the details about Sarah. Let's also try removing
one of the contacts. Let's say for in order to delete a contact, let's say me Sam. In
here we are not seeing any message indicating if that we have deleted Maxim successfully
or not. But if we check the list of our contacts, we should see only Sarah. And as you can see,
we have only Sarah in our contacts list. Let's also try this go back as well. So let's say
manage contacts once again. This time if I put any number beside one through four, for
example, if I say six, you can see that we are going back to the main menu. Also, let's
try adding a new contact with empty values. Sorry about that, I need to go back and select
one. Let's say to in order to add a new contact. Let's don't provide anything for the name.
You can see that the scanner is waiting for some input. But even if the scanner moves
to the next line, we have write the logic in order to prevent adding an empty contact.
Okay, that's good. Let's add many samples again. Let's add some number. And some you
mean. Let's see what we have inside the messages option. In order to see a list of all of the
messages. Let's press one, you can see this message you don't have any message. Once again,
let's go to the messages option. I've entered two in here and let's try sending a new message.
Who are you going to send a message? Let's say Sarah, what are you going to say? Let's
say hello. It seems like we are getting a crash and the crash happened because of this
exception. Concurrent modification exception. Okay, let's take a deeper look into our code.
And let's debug our application for the first time. It seems like the exception occurred
when we try to add the new message. Also, you can see the line 99 in here, if you click
on that, you will be navigated to that line. Yes, we have this exception inside the add
new message or send a new message inside this for loop. I think the error in here is happening
because first of all, we are using this C to assign a new value to this current contact.
And immediately after that we are trying to remove this contact from our contacts ArrayList.
So this causes the concurrent modification exception. If you want to get over that exception,
you can simplify this if statement. For example in here I'm going to delete all these three
lines of code. So by this point, we have this new messages are released. We have added our
new message to this ArrayList and after that, in order to update the array list inside this
contact, I can say see dot set messages. And I can pass my new messages ArrayList. So no
need for removing and adding a new contact into our ArrayList. concurrently. Let's run
the application once again. And let's see if we are seeing the exception once again.
First of all, we need to add a contact. So let's say manage contact, add a new contact.
Let's Provide a name and number after that some email. And now we can send a new message,
let's say messages. Send a new message. Who are you going to send a message? Let's say
Mesa, what are you going to say, after this line of code, we got the exception. Let's
say hello. And this time, it seems like we have added or we have sent a new message.
If you want to make sure of that, you can go to the messages option. And you can show
the list of all of your messages, you can see that we have one message in which we have
sent it to Mesa. Okay, that seems better. Once again, let's go to this messages option.
And let's try going back to the main menu. So if I type three or any other number beside
this one and two, we should go back to the main menu. For example, let's say for and
as you can see, we are seeing the initial options. For the last thing, let's try creating
our application. And as you can see, we have created the application successfully, let's
just fix the few errors that we had. In the show all contacts method. If you remember
I said that we are going to show some message in case if we don't have any contacts in our
ArrayList. So for that, first of all, I'm going to check that if we do have any contact.
For that, I'm going to say if contacts that size is greater than zero. First of all, let's
write the else case. In the else case, I'm just going to print you do not have any contact.
But in the if block view are going to do the same thing that we were doing previously.
Let's run the application one more time in order to see that these changes are effective
or not. So right now, we do not have any contacts
in our contacts list. Also, you may be wondering why we are losing the contacts that we are
keep adding into our application. That's because we are not using any permanent data storage
like a database, we are using a static array list and that ArrayList will be cleared when
we close our application. For that reason all of the contacts are being removed whenever
we stop the application. So let's say manage contacts. And let's say show all contacts,
you can see the message in here you do not have any contacts. But it's better to show
the list of initial options once again after we print this line of code. So down in here
after this print statement, let's say show initial options. Okay, this was the last video
of this section. And this was my solution for this challenge. Your solution is probably
different than me. And that's okay, because there are multiple ways of creating the same
application. Hopefully you have practiced and learned everything that we have talked
about in this section. In the next section of the course, we are going to switch back
to Android Studio, and we are going to talk about user interface and how we can design
a beautiful layout for our application. See you in the next section. What's up everyone,
I hope you're having fun. Before we start our talk about user interface, I just wanted
to remind you that there is an extended version of the scores that you can watch. by enrolling
in the extended course you will have lifetime access to more than 60 hours of videos, you
can ask your questions directly from me and I will come back to you within hours, you
will have access to all of the source codes that I write in the videos. And also you can
have access to all of the new videos that I upload. Just check out miko.org for more
details about the course. And don't forget to use Free Code Camp as the coupon code to
get 20% discount. If you want to get serious in Android app development. Taking the extended
course is almost a necessity. Okay, everyone, I just wanted to remind you that there is
an extended version of this course that you can take without further ado, let's just start
our talk about user interface. Have fun learning. Hello everyone and welcome back. This is the
user interface section of our course and we are going to talk about a lot of concepts
and tools that we have related to user interface. We are going to talk about a lot of UI elements
and they are attributes. We are going To talk about different kinds of event listeners,
for example, click listeners on different UI elements. We will talk about how can we
create applications that is compatible with different screen sizes, and also different
languages. Besides that, we will also talk about material design and all sorts of stuff
in this section of the course. Without further ado, let's jump into our project. And let's
implement some UI elements. As you can see, I'm no longer using IntelliJ ID, and I've
switched to Android Studio. We needed IntelliJ ID for the Java section of the course. But
in here, we can switch back to Android Studio, just in case if you forget how to create a
new project in Android Studio, I'm going to start from scratch. Let's start a new Android
Studio project. In here, we needed to select a template. If you remember, I said that these
templates are some applications return to some level. Later on in the course, specifically,
after we talked about activities, we will see that how can we create all of these from
scratch, but for now, let's just select this empty activity. After that in here, we needed
to name our project. For example, for this application, I'm going to say UI basics. I'm
going to stay with this package name, I think it's fine. We needed a save location. Once
again, the default is fine. For the language, I'm going to say Java for the minimum API
level. As I said in previous videos, in the most videos for this course, I'm going to
save with API level 19. After selecting all of these, let's just create our project by
clicking on this Finish button down in here. It seems like our project has been created
successfully. Now that we know about Java, let's have another look at this class that
we have created in here. But before that, let's minimize this Ron pane. As you can see, this is a Java class in our
package, you can see that it's a class called main activity. This class is extending the
app compat activity, whatever that is. Inside this class, we have this onCreate method which
is overriding you can guess it probably because of this app compat activity. And also above
in here we have some imports. Right now we are importing this app compat activity and
also this bond. Don't worry about this, we will talk about them later on in the course.
But for now you can see the general syntax of a simple Java class in here as well. If
you remember I said that when you create an activity, a Java class and also XML file will
be created. The Java part is responsible for the behavior of your application. For example,
in your layout file, you may receive the user's input in the Java file, you may decide to
what to do with the user's input. Hopefully, now that we know about Java, we can understand
all of these much better. This onCreate method is a part of something called the activity
lifecycle. We will talk about that in future videos. But for now, just know that this onCreate
method is somehow like the main method inside a simple Java application. This is the start
point of every activity. And right now, because our application has only one activity, this
is the start point of our entire application. So this line 13 in here would be the start
point of our code. You can see this super statement in here. Once again, it means that
do whatever you are doing inside the parent class. In this case, the parent class is this
app compat activity. For the time being we are not concerned about that. But as you can
see, we are passing this save instance state which is a bonded to the super statement.
Later on, we will talk about that. Also, it's important to note that inside activities,
you have some inner methods, we didn't have this option in Java. For example, you can
see this set content view method, you don't see the declaration of this method anywhere
inside this class. But you can see that by using it, you are not getting any red warning.
Similar to this setcontentview. If you have a lot of other inner methods inside an activity,
we will talk about them later on in the course. Okay, let's move on from this part. And let's
start working on our user interface. I just wanted to have another look at Our application
and specifically this jar file. Now that we know about Java, okay, let's close this java
file. And let's start talking about this activity main dot XML file. If you remember in the
first videos of this course, I said that XML is a markup language. Once again, if you are
a web developer, you know the concept of markup languages. Those are just helpful for defining
some elements that are going to be shown to the user. Before everything. Let's scripting
locate this file in our project. Right now we are inside the Android view. And if you
want to find this activity main dot XML file, you can come to this Resources folder. down
in here inside the layout folder, you can see the file. And if you switch to projects
view, you can go to your application folder, inside the app folder. Inside the source folder,
you have this main folder. And in here you have the Resources folder. Once again, inside
the layout file, you have this activity main dot XML file. Okay, let's switch back to Android
view. And let's minimize this project pane for now, if you remember from the previous
videos of this course, I said that whenever you want to define a layout file, you have
two options. First of all, you can use this design view for example, by dragging some
items into your design view. You can have different elements and later
on, you can define some attributes for your elements. This is one way but the other way
is to switch to text view and manually type everything that you need. In my opinion, when
you are an Android developer, most of the times you are going to work with the TextView.
So in here, we are going to start from this TextView. First of all, if you're not seeing
this preview in here, you can always enable it and disable it from this preview option
in here. If you have a low memory RAM, my suggestion is to disable this review, because
it's going to render the layout file in real time. And that's going to load a lot of pressures
on your device's memory RAM and also CPU. For that if you have low memory RAM, disable
this preview, it will speed everything up. Right now inside this simple layout file,
we have this TextView you can see that when I click on this TextView this TextView inside
our XML file has been highlighted, it means that these are the same. I'm going to delete
this text view for now. Let's select all of it. And let's press Delete. The next thing
that I'm going to do is that I'm going to change this constraint layout. In future videos,
we will talk about what the constraint layout is. But for now, for a starter, I think it's
better to start with relative layout. Let's select that. Also, if you have noticed, you
can see that when we have changed the opening tag in here to relative layout, the closing
tag has been changed to relative layout as well. Inside these opening and closing tags,
I can have different UI elements. For example, if I want to define a TextView, I can open
an anchor bracket and by typing TextView. In capital T, we have a list of options. Let's
select the first one TextView. Immediately after pressing Enter, we are getting some
attributes. So for every UI elements, you need at least two attributes a width and also
a height. The values for these two attributes can be some numbers. But Alternatively, you
can see that we have other options in here as well. We will talk about this match parent
and wrap content in a minute. But for now, let's just select wrap content. Basically,
it's going to wrap the content of this text view for the height. Let's also select wrap
content. If you want you can finish creating your text view by adding a slashing here.
And that's if you can have a text view. But if you want to have more attributes, you have
a lot of options. For example, before this slash I'm going to say let's say text, you
can see that we are getting a suggestion and recall that text let's select that. And in
here I can pass a text for example, let's say hello world. As soon as I type this, you can see that text
in the preview as well. So text is one of the attributes of this text view. Let's talk
about the other attributes found by Vaughn. For example, right now this text is at the
corner of my screen I don't like this, I'm going to change the position of this TextView
to the middle of this line. For that I have multiple options First of all, I can add some
margin in which will add a space between this TextView at the edge of the screen. For example,
I can say margin and I can pass 50 for example 50 dP dp is the unit when you're working with
your layout files, we can see that we have some margin, but we can be more specific for
example, we can say margin top margin left margin right and also margin bottom. For example,
I can say margin left let's say 100 Db this time, margins are extremely useful but in
here they are not going to help us because this is not accurate, we want our TextView
to be exactly in the center of our line. For that, instead of using a margin, I have a
better option, I can say, center horizontal in order to center my text view horizontally.
As you can see, I can pass through or false in here, let's pass through. And this time
and the TextView has been centered horizontally. If you want, you can also center it vertically
by saying center vertical and passing a value of true, you can see that it has been centered
both horizontally and vertically. Beside these two, you also have another option. For example,
in this case, I'm going to delete both of these attributes. Instead, I'm going to say
center in parent, this one down in here. Let's pass through as the value of this attribute.
This center parent is going to center our elements inside its parent element. an XML
file is like a tree, we have these Child Elements. And above them, we have the parent elements.
For example, in this case, the parent element is a relative layout. If we want, we can have
another relative layout in here or maybe some other UI elements. And inside that element,
we can have this TextView we can do these kind of inheritance as many times as we want.
So in this case, the TextView is our child element. And this relative layout is our parent
element. And when we use this center implant attribute, it's going to center our TextView
in its parent element. Okay, let's move on from this part. If you want, you can also
increase the size of your text for that you can say text size, this attribute in here,
and you can pass a number for example, you can say 20 SB. When you're working with the
size of your fonts, the unit is SP, we can see that it's larger now. Also, if you want
you can have some styles on this text as well. For that we can say text style. This attribute
you can see three styles bold, italic, and normal. For example, let's fast bold. If you
want your attribute to be both bold and italic, you can add a pipeline in here. And after
that you can see italic. This time you can see both of these attributes in the same element.
If you want, you can also change the color of your text for that we can say text color.
And we can pass a color what that color should be defined inside another XML file called
color. Right now we have three colors, this color, accent, color, primary and color primary
dark. Basically, these are the names of some corners. Let's select the first one. And as
you can see the color has been changed successfully. But where does this color dot XML file locates
in our project? Well, if you want to take a look at that, you can open the project pane.
Inside the Resources folder, inside the values folder, we have this colors dot XML, you can
see that we have some colors in here with the exact name that we just saw. Don't worry
about this, we are going to talk about different kinds of XML files in future videos. But for
now, I just wanted you to see this XML file. So instead of passing a color from inside
the color dot XML file, you can also pass the hexadecimal value of that color. For that
you can search the internet for something like HTML color picker. Let's search that. For example. Let's select
the green color in here. This one maybe, and in here, you can see the hexadecimal value.
Let's copy that. And instead of facing a color from inside our color dot XML file, I'm going
to paste the value of that color, you can see that the color of the TextView has been
changed to the color that we just selected. If you remember from the previous videos of
this course, we have seen that when we wanted to have access to all of these UI elements
inside our Java file, we needed an ID. Let's add an ID attribute for this TextView as well,
let's say ID, the convention is to say add plus ID slash. Let's select that. And let's
define some ID. Let's say txt welcome. The ID attribute should be unique inside every
XML file. It means that two different elements inside the same XML file cannot have the same
ID. Later on we will use this ID in our Java file in order to have access to this TextView
there are much more attributes to text us but I think if we continue we are going to
get word for that. I'm going to move on from this TextView. And I'm going to define a button
after this TextView. For that, once again, I can open an anchor bracket. And in here
I can say button. With this capital B, let's select the first option. Once again, we have
these two mandatory attributes. And in here, let's talk about the difference between this
wrap content and match band. Right now, if I select match parent, let's also select match
parent for this height, you can see that this button is covering all of this screen. And
that's because we have set the width and height to match parent. If you want, you can change
this height for example to wrap content. And here you can see the difference the width
is matching the parent but the height is wrapping the buttons content. Let's also change the
width to wrap content. Beside wrap wanted and match parent, you can always pass the
values manually, for example, I can say 150 DPI, you can see that the width has been changed.
But this is highly discouraged because our application is going to be installed on devices
with different screen sizes. Sometimes if we put some numbers for these, if we pass
the values manually, we may not know the exact position of every element. And also sometimes
our elements might not fit in the screen in some devices. So for that matter, I'm going
to change this font to wrap content in here. Also, now that I have talked about different
screen sizes, I'm going to say that in here inside this preview, you have this option
called devices for preview. If you click on that, you can see a drop down. And from here,
you can select different screen sizes. For example, let's select this font, and you can
check the looks of your application in different screen sizes. For example, let's take a tablet,
you can see that it's somehow different. Don't worry about this. Later on in the course we
are going to cover how we can have a consistent look for our application in different screen
sizes. I just wanted to mention these options above in here. Like for the text view, we
have a text option for the button as well. Let's say text. And let's say Say hello. Similarly,
we have the option to add some margins. But I'm not going to do that right now. Instead,
I'm going to move this button to below this TextView. For that we have an attribute called
below this one here layouts below. And we need to pass the ID of the other element.
For example, in this case, we need to pass the ID of this TextView I can say at plus
ID slash. And I can say txt welcome, you can see that the button has been moved to below
this TextView. But this is not entirely but we want, we also need to center it horizontally.
Or that once again, we can see center horizontal and we can pass through. Let's also add a
margin top. Let's say margin top. And let's pass for example
15 dP, that's much better. For both of these texts here and button you have another attribute
called background. Let's also see that you can say background. And for example, we can
pass a color, let's pass the first color, you can see that the background color of this
button has been changed somehow, you have the same option for the TextView. If you want
you can apply that. I think this is an ugly color. So I'm going to change that. Let's
see the other colors. Let's select this primary dark. Nope, this is not my color. Okay, this
is better, you can always add the hexadecimal value of the color that you want in here as
well. For different UI elements, we also have another attribute called on click we have
seen the use of this athlete. When we have created our first Android application, you
can guess it, we are going to set an event listener for this button and we are going
to see what happens when we click on this button. So let's say on click, and let's pass
the name of some method. For example, I'm going to see on Hello btn clicked. Right now
you can see that we are getting this red warning and that's because we need to create this
method inside our Java file. Let's finish creating our button by using this slash. And
let's create this method inside our main activity dot java file. So let's open that file. In
order to open some files, I can always switch to this project thing. Or alternatively I
can press the Shift key two times You can see that when I do that I have a search menu.
For example, in here, I can search for main activity. And if I press Enter on the first
option, we can open our main activity dot java file. This is just a helpful shortcut
that we can use from time to time. Okay, we need to create the onClick method inside the
scope of our class and outside of the scope of this onCreate method. If you remember the
signature of that method, it was something like this, we needed to set the access modifier
to public, the return type was void, the name of the method is going to be exactly the name
that we have passed in our XML file, let's say on Hello btn clicked. For the inputs of
this method, if you remember, we had a view object with capital V. This view object is
not important right now we just need to know that we need to receive it as the input of
this method. Let's fast view as the name of this input. And in here, we can have the logic
to handle the click listener on our button. Also, if you have noticed, when I added this
view, and your import has been added above in here, let's also minimize these imports
for now. This is one way of creating event listeners for buttons. And also for that matter
for different UI elements. We have other options in which may be more useful from time to time.
We'll take a look at them in a minute. But in here, let's quickly write some logic. For
example, in here, I'm going to change the text of my text view. For that, first of all,
I need to have access to my text view. I can say text view, if you take a look at your
inputs, you will see that this TextView from the widget package has been added to our class.
If you remember I said that equivalent to every UI element. You have a class in Java.
Okay, let's name this TextView. txt welcome. And let's initialize it, we can initialize
it like this, we can say find view by Id like this set content view method, this find view
by ID is also another inner method inside every activity. Right now this find view by
ID method is waiting for some integer, and the integer is going to be the ID of our elements.
And here is how we can pass our ID for example, we can say our.id. Once again, if you remember,
I said that these are in here stands for resources. It's a special class in Java, and it will
give us the access to all of the static contents in our project. So in here, I can say our.id
dot, let's pass the ID of our text here, which was txt. Welcome, I believe now that we have
access to this txt, welcome. We can do some operation on that. For example, I can say
txt. Welcome. That's it. txt. We have seen this method previously. And inside this method,
I can pass a text. Let's say hello again. Let's run the application. And let's see if
we can change the text of this TextView. I'm going to run the application on pixel three
API level 29, you can select whichever device that you want. Okay, right now we can see
the layout that we have created so far, which is honestly oddly, but don't worry about that
we are going to work on on our designing power. If I click on this button, you can expect
what would happen we are going to change the text from hello to Hello again. Okay, there
was nothing special. In this video, I just wanted you to have another look at what we
have done in the first section of this course, which was to create your first Android application,
I just wanted you to have a better understanding on what you have done in that video. Also,
we have learned about some other attributes in here as well. Okay, in the next video,
we are going to continue our talk on different UI elements. For example, we will talk about
edit texts. And also we will talk about different ways that we can implement an onclicklistener
for our button. Okay, see you in the next video. In the previous video, we have seen
one way of creating an onclicklistener for our button. There are two more ways and in
here we are going to see them. For example, in our layout file, let's quickly create a
button. But before that, I'm going to change this constraint layout to a relative layout.
Let's delete this text and let's create a button. That's a wrap content and wrap content
for the bits Android. Let's give it a text. For example, let's say Say hello once again.
Let's say center and parent. And let's pass through, we have seen these in the previous
video, so I'm not going to discuss them. Also, if you're going to need an ID, let's say btn.
Hello, you can pass whatever you want. So in the previous video, when we wanted to create
an onclicklistener, we would have add this onClick attribute. In here, we need to pass
the name of the equivalent method inside our Java file. But in this case, I'm going to
use another approach. And for that, I'm going to delete this attribute. Okay, let's switch
back to our Java file. And let's define this button. Inside my onCreate method, I'm going
to say button. Let's name it btn. Hello, is equal to find view by ID dot btn. Hello. For
setting an onclicklistener for your button, you can use the equivalent method you can
say btn Hello, dot set onclicklistener. You can see that we have this method inside the
parentheses we need to pass an interface. In this case it can be new view dot onclicklistener.
If you take a closer look, you can see that this is an interface. Okay, now that I have
passed this new interface in here, this onClick method has been overrided. And inside this
onClick method, I can write my code. For example, if I want to print something into my console,
I can say print. Let's just say hello, let's run the application. And let's see if we can
see any result. I have opened this Ron paneling here and if I click on this say hello button,
you can see that Hello is being printed in here. So this way, by using this set onclicklistener
method on our button, we can define the onClick listener. Inside the parentheses of this method,
we have passed this new view dot onclicklistener method. But there is also another way, let's
quickly see that. So instead of passing a new interface in here, I'm going to implement
this exact interface in the declaration of my class. If you remember from the Java session,
we can implement interfaces like this, we can say implement, let's say onClick listener.
There are two options in here. The first one is coming from Android dot view that view
package and the next one is from another one, we need the first one. When we implement interfaces,
we also need to implement the methods, we can do that by pressing Ctrl plus by we need
to implement this onClick method. As the input of this onClick method, we are getting a view
object. And now we can use this view in order to create
different cases. For example, we can say switch on view, or V in this case, it's his name.
Let's say that get ID, we are going to create our switch depending on the ID of this view
object. And after that I can say case, in case it's our.id dot btn. Hello, the exact
ID that we have passed in here. In case this is the ID let's write some code. For example,
I'm going to copy this line of code from here. Let's also add a break and also a default
case. Now that I have implemented this method at the declaration of point class, and also
I've implemented this onClick method, I can remove this btn hollow dot set onclicklistener
method. Let's write it once again, let's say btn Hello dot set onclicklistener. This time
instead of saying new view dot onclicklistener I can say this. If you remember from the Java
session, this refers to the current object. Right now we are inside this class which implements
this interface. So this method down in here is happy with accepting this as the input.
So how's the follow things in here? First of all, we are setting the onclicklistener
and we are passing the class itself as the interface. Whenever the user clicks on this
button, this onClick method will be triggered a view will be passed to this method in this
case it's a button later on we will talk about that why a view and a button are equivalent.
We are getting the idea of this view and we are creating a switch statement. In case the
ID of this view is our.id dot btn Hello the ID of our button. We are printing this Hello
in here. If we had other buttons or for that matter other views, we can create different
cases for them in here as well. Let's run the application once again and let's see if
we can see the same result. Once again if I click on this say hello bata we can see
that Hello has been printed into are on Council. Also, I don't like to come down in here inside
this round in order to test my application means that I'm going to show something to
the user in our application. For that, instead of using this system dot out dot print line,
I'm going to use another option called toast messages. Let's search for those messages.
And let's see what those are like. So basically, a toast message is something like this. This
is not a permanent message, and it will be disappear after a period of time. Let's quickly
see that how can we define this in our code. So in here, I'm going to delete this line
of code. Instead, I'm going to say toast, you can see that I have two options in here.
The first one is a Java class, but the second one is a template. Basically, templates are
provided by the ID that we are using. For example, in here, if I select this template,
you can see that this whole line of code has been created. So we are using this test class
in which has this static method. Inside this static method, we are passing a context whatever
that is, we will talk about context later on in the course. But for now, so we are using
this toast class English has this static method called make text, we have three inputs for
this make text method. The first is a context, don't worry about the context yet. We will
talk about that later on in the course. But for now, just know that every activity in
Android is a context. And because right now we are inside an activity, we can pass this
as our context. The next input is a text. Basically, this is going to be the text that
we are going to show for example, let's say hello button clicked. After that, we have this constant in here,
which is toast dot length short, basically, this is just a constant for determining how
long do we want our toast message. For example, if you want to see the other time periods,
you can see that we have length long and length short. Let's select length short. And after
this make text methods, we have this dot show method, which you can guess is going to show
our toast message. So before this, we have created our toast message. And after that,
with the help of this show method, we are showing it to the user. In here we have used
the template. But if you don't want to use the template, you can always create your own
toast message. You can say toast This time, let's select the first one. Let's say make
text for the context list past these, we need the text in here, let's say second text. And
after that, we need the constant, let's say toast that last long dot show. Basically,
these two lines of code are the same. We just can't create them with the help of the ID.
Okay, this time, let's run the application. And let's see what would be the result. So
this time, if we click on this, say hello butter, you can see that some toast message
is showing down in our screen. And after that it will be disappeared. I think those messages
is much better. For our testing purposes. It's much better than this round pain down
in here. Okay, let's close the application in here. And let's talk about this view that
we are receiving in here in a logical way. Instead of this view, we need to receive a
button because we are creating our switch statement based on the ID of our button. But
there is a point in here, if you press down the control key. And if you click on this
button class, once again, if you press down the CTRL key and if you click on the class
that this button is extending, in this case, this text view, you can see that this text
view class is extending the view class. It means that after two times of inheritance,
our button is somehow a view view just extended the view class two times. So at the end, a
button is a view. If you remember from the Java session when we have talked about inheritance.
For example, when we extended the animal class and we created our dog class, we said that
a dog is an animal. In this case, a button is also a view. For that matter. Every UI
element is a view, like text views, edit text, and also other UI elements that we will talk
about later on in the course. So this in here proves that we can create an onclicklistener
for our TextView and other UI elements as well. So this onClick method is not limited
to our button. It's also worth mentioning that when you create your own listener this
way, by implementing the interface in your class declaration, you just need to create
one onClick method for all of your UI elements. For example, if I had another method down
in here, I could have passed the ID of that button to another case. And inside that case,
I could have write my logic. So I can have as many methods and for that matter, as many
onClick listeners for my view elements, also, this onClick listener is one of the available
events, listeners, we have others as well, if you want, you can take a look at them by
saying btn Hello dot set, let's say set listener. And you can see a lot of these options we
have onClick listener we have on direct listener, you can guess the meaning of each one of these,
we have set on hover listener in case if we hover over our button, we also have another
useful one. on long click listener, it means that if we like press on a button, that's
great. Let's see this one. This time, instead of implementing the on long click listener
in my class declaration, I'm going to use the easier way by saying new view dot online
click listener. This one, you can see that in here we have
a Boolean as the return type of this online click method. This Boolean is just the callback
indicating if we have long press our button. If you want your code inside this method to
work fine, you need to pass through. Let's write some logic. In here. For example, I'm
going to say toast. Once again, we can see this context in here. But the format is somehow
different. Because right now we are inside an interface, we are inside this online click
listener interface. If we pass this, this will refer to the current object, which in
this case is an interface. But interfaces are not context. And we need to pass our activity.
For that matter, we can say main activity dot this, don't worry about this main activity
that this if you didn't get that I will talk about that later on in the course when we
have talked about activities. But for now, just let's pass this as our context. And let's
create a text. Let's also change the time period in here to Lance long. I think I need
to delete this case from here as well. Okay, let's run the application. So like before,
if I click on this button, you can see that we are seeing this message Hello button clicked,
which is a simple onclicklistener for our button. But if I press my button and hold
the key, you can see that we are seeing this long press message. So this time, instead
of this onClick, we have executed this set online click listener method. You can also
check the other event listeners for your view items. Later on in the course we will check
a few more of them. But in general, you can say btn Hello dot set listener. And you can
use each one of these that you want. Okay, let's move on from the event listeners. And
let's define another UI element in our layout file. Before this button, I am going to define
an edit text. Let's say Edit Text. For the width, that's a match fine this time. And
for the height, that's a wrap content, you can see that it's something like this, if
you click on that this is our edit text. Let's also add a text in here. Let's say name and
name has been added. That seems to do better. Let's also center our edit text, I'm going
to say centering parent, and I'm going to pass through. But right now we have a conflict
between this edit text and our button. For that I'm going to move this button to below
this edit text. But before that, I need to give an ID to this edit text. Let's say ID.
Let's just name it edit text name. Let's finish creating this edit text. And then in here
inside our button element, I can say below or to be a specific layout below. And I can
pass the ID of my edit text before that I need this ad plus ID slash. That's the Edit
Text name. So this way, we have moved this button to below our edit text. I think it's
better to have some margins. That's a margin top. And let's pass 20 dP, that seems better.
Okay, let's switch back to our edit text. I don't like the text inside my edit text.
Because if I run the application, and if I try to type something in here, first of all
I need to delete this text for that instead of this text attribute. I'm going to use another
attribute called hint. I think we have hint at the first videos of this course. Let's
just pass name. This time it's much better. So whenever I click on this edit text, and
if Try to type something, this name hint will be disappeared. Also, if we want to decrease
the width of our edit text, we can pass a number in here, for example, we can say 250
dP, which is better in this case. But if you remember I said that it's never a good idea
to pass your width and height manually, because in different screen sizes, you cannot predict
the size of your different elements. For that, once again, I'm going to change this font
to match that I believe it was. And after that's done in here, I'm going to add two
margins, let's say margin left 250 dP, for example, I think it's better to change it
to 100. And also, let's add a margin right of 100. Adding different margins is one way but we
also have another way, let's we can see that as well. So I'm going to delete both of these
margins. Instead, at the declaration of my relative layout inside the opening tag. As
you can see, this is our closing tag, and this is our opening tag. Inside the opening
tag, I can define an attribute called padding, once again, like margins, and we have multiple
paddings. We have padding bottom padding left, right top, let's just use padding in here.
And let's pass 100 dP. So as you can see, the size of our edit text has been changed,
the padding and the margin are a lot like each other. Just there is one difference.
When you are adding a margin. For example, in the previous case, for our edit text, the
margin would be added from the end of our element, for example, from here to the end
of our screen. But when you're adding a padding, depth padding, we'll add some space from inside
your element. For example, in this case, the element is this relative layout itself. And
we have added the padding from inside the relative layout. So once again, margin adds
the space from the outside of the elements, but the padding will add the space from the
inside of the element, you can use both of them depending on your need. Let's see what
other attributes do we have for our edit text, like a TextView, we can change the color for
this edit text as well. For example, I can say text color. And let's pass this color
that we have in our color resources. Right now we do not have any text inside our edit
text. But as soon as we type something, the color will be changed to this color that we
can see in here. We can also style the text by saying text style this one, we can say
italic bold normal. Or if we want to use two sides at the same time, we can add a pipeline.
There is another attribute that we didn't have in text views. And that's called lines.
For example, there are times that you may need a bigger input from the user, you can
specify the number of lines in here. For example, if I say four, for example, now our edit text
is going to accept four lines of inputs. In this case, I'm not going to use these lines.
So I'm just going to delete that the default number for different lines is one. With edit
text, you can also define the kind of input that you're going to receive. For that you
can say input type this one, and you can pass one of these for example, if it's a date that
I'm going to receive, I can pass a date or maybe this date time. If I'm going to receive
a number password, I can pass this number password. If it's just a simple text, I can
pass this text, we have other options, for example, for different emails, and all sorts
of options that you can see in here. For example, if I select this text password in here, and
if I add some text instead of this hint, let's say text. You can see that when I typed the
text, it will change it to these dots. Probably you have seen this on your phone when you
are trying to log into some application or some website, this will add some level of
security. Also when you define it to email, this text email address when the user clicks
on your edit text, the keyword will be prepared to type the email address. I'm not going to
define any specific type of input so I'm going to delete this one in here as well. And let's
also change this one to him. Okay, I think that's enough about edit text. We have all
sorts of different options in which you can check them from here. As you can see, there
are 1000 of these attributes. Okay, below this button. Let's also define a TextView.
I'm going to say TextView wrap content and wrap content. Let's give it an ID, let's say.
txt Hello. After that may be some placeholder text. Let's just say hello. Let's also move
it to below this button, I'm going to say layout below. Also, it's worth noticing that
if you are not using a relative layout, for example, if you're using a constraint layout,
you do not have this layout builder option. This is one of the features of this relative
layout. We will talk about that in future videos. Okay, in here, let's pass the idea
of our button, let's say btn. Hello. Also, let's move it to center horizontal. And let's add some margins. Margin top of
maybe 30 dP, let's increase the size of this text by saying text size. And by passing I
believe 20 would be fine. I'm almost done with this layout file. Let's just go top in
here into this code. And let's select this reformat code in order to rearrange our code
so that if I publish the code, you will have the same code that I'm writing in here. Okay,
let's switch to the main activity. And let's define all these three items. Let's say Edit
Text. Let's name it. EDT. txt, I believe it was name is equal to find view by ID r.id
dot edit text name. Let's also define our text view. Let's name it txt name is equal
to find view by ID dot txt name, or txt Hello was it I think it's better to change the name
to txt Hello. But right now there is a problem with our code. We are instantiating our UI
elements inside this I create method, which once again is the starting point of our application.
But we are going to need this to UI elements inside this onClick method. Because we are
going to change the value of this TextView whenever the user clicks on our button. And
if I try to have access to this txt, hello, for example, from inside this method, if I
type txt Hello, you can see that I'm getting a red warning, you can see that the ID cannot
resolve this symbol, it means that inside this method, we do not have access to this
TextView. I'm not sure if I've mentioned this in the Java section. But the problem in here
is occurring because of the scope in Java. So right now the scope of this TextView is
inside this onCreate method. And outside of that we cannot use that if we want to have
access to this TextView. Inside both of these methods, we can say something like this, we
can declare this TextView in the declaration of our class as different fields. For example,
above in here, I can say private, let's say TextView this one. And let's name it. txt
Hello. But right now in here, if I try to instantiate my TextView, for example, if I
say find view by ID and I pass my ID, because this part in here is not a part of this activity
lifecycle. We are not going to instantiate our TextView at all, we need to instantiate
our element inside this onCreate method, which is once again the starting point of our application.
So this way, we are separating the declaration and instantiating of our UI element, I can
put a semicolon down in here. And this time, instead of defining the whole TextView I can
use this field I can say txt Hello response is equal to find view by ID r.id dot txt Hello.
Now that I have declared this txt Hello as a field, I can use it in both of these methods.
For example, in here, I can say txt Hello dot txt. Inside the set text method, I'm going
to need the text of this edit text. For that I'm going to define this edit text as a field
as well. So let's say private edit text. Let's name it really txt name. And then in here,
let's remove this edit text. Now I can pass this edit text for example to the set text
method. Let's say hello plus the Edit Text dot get text. If you remember from the first
videos of this course, I said that we need a two string method as well. We have seen
this two string method in different Java classes. It's just going to generate some text. In
this case, if we delete this to string and if we just pass this edit text name that get
text if you press down the CTRL key and if you hover over this get text method you can
see The return type of this get text method is an editable. We do not know what that is
yet. But we just know that this is not a string, and in here, we are going to need a string.
For that we need another level of conversion, we need to convert the editable to a string.
So we can use this two string method. Okay, I think after a lot of talking, our application
is ready, let's just run the application. And let's see if we can see the behavior that
we wanted. Let's type something in here. Let's say Mesa. And let's press this pattern alone
based on our application is working fine. And hopefully, we understand each piece of
the code that we have wrote so far, few minutes earlier, I said that different UI elements
extend the view class, we have seen that for this button, that's also check the case for
this edit text and text, you can press down the control key, and you can click on this
edit text class, we can see that it's extending the text view, if you click on this text view,
once again, by pressing down the control key, you can see that it's extending the view class.
The same is for the TextView itself. If you press down the control key, and if
we click on the text view, we can see that it's extending the view class. Now that we
know both of these are extending the view class, we can create an onclicklistener for
each one of them. And let's run inside this onClick method. If you want, we can create
another case for each one of them. For example, down in here, for the edit text, I can say
Edit Text name, dot set onclicklistener. You can see that we have this option in here.
And because we are implementing the onclicklistener interface inside our class declaration, I
can pass this in here. Later on inside the onClick method, I can create another case.
For example, let's say case r.id dot, let's say Edit Text name. If that's the case, let's
toast some message. Let's say attempting to type something. Before I run my application,
I'm going to delete this toast because I'm not going to have a conflict between different
hosts. So this time, if I click on the btn Hello, the text is going to be changed to
Hello plus the text inside our edit text. And if we click on the edit text itself, we
are going to see this toast message. By clicking on the text, we can see the toast message
down in here that seems to be perfect. Okay, I think that's enough for this video. In the
next video, we are going to talk about some other UI elements like checkboxes, radio buttons,
and radio groups and also progress bar. Just before I finish off this video, I'm going
to say that I will upload the source code at my website@miko.org slash code. So feel
free to check that if you need. Okay, see you in the next video. The first UI element
that we are going to talk about in this video is checkbox. Let's quickly see that in our
layout file. Before everything, I'm going to delete this TextView. And also I'm going
to change the constraint layout to relative layout. Then in here, we can create our checkbox
like this. We can say checkbox for the width and height, let's say wrapped content. You
can see that this little checkbox has been added in here. If you want we can add a text
to this check box as well. Let's say text, I'm going to enter the name of a movie. So
let's say Harry Potter. We can have an ID as well as let's say ID. Let's name it checkbox
hiring. So basically a checkbox is a box that we can check or uncheck. For example, in here
we have an attribute called checked. We can pass through or false for this for example,
if we say true, you can see the checkbox will be checked. Let's quickly add two more checkboxes.
Basically, I'm going to copy and paste this one two more times. But this time, first of
all, I'm going to change the text to let's say the matrix. And also let's change the
idea as well. Also, I'm going to add another attribute I'm going to move this new checkbox
to the right of my previous checkbox. For that we have an attribute called to write
of layout to write of. Let's pass the ID of our first checkbox, let's say checkbox, Harry.
Let's also add a margin left. We can say margin left and let's pass 15 If you For example,
let's copy and paste this one once again, let's change the text to let's say Joker.
Let's also change the ID, let's say checkbox, Joker. And also let's move it to the right
of checkbox matrix. So this way, as you can see, we can have multiple
checkboxes, you can check and uncheck them by default by setting an attribute of checked,
let's change the value for the Joker to let's say, false. If we want to center this checkbox
horizontally, we can add a margin for the first one. For example, we can say, margin
or margin left. And we can pass 25, for example. But as you can see, this is not accurate.
Instead, what we can do is that we can create another relative layout and move all of these
three checkboxes into that relative layout. Let's quickly see how we can do that. So inside
my first relative layout, I'm going to create another relative layout. Let's say relative
layout, for the width and height, let's say wrap content. Let's also give it an ID. Let's
say ID. I'm going to name this fun movies, relative layouts. Now, if I want, I can center
this relative left, I can say center horizontal, let's pass through. Beside that let's add
a margin top, let's say margin top of 20 dP. In other UI elements normally in here, we
could have finished creating our elements by adding a slashing here. But in this case,
I'm not going to do that. Instead, I'm going to finish creating my first tag my opening
tag. For that I can add a left anchor bracket. And as you can see, this closing tag has been
created automatically. Now I can put my three checkboxes inside these two tags, the opening
tag and the closing tag. Let's move all of them to inside those two tags. If you noticed,
you can see that these three checkboxes are now centered horizontally, and also they have
a margin top of 20 dP. That's because the parents layout which is this relative layout
has these two attributes. So inside XML file, you can have relative layout nested inside
another relative layout. Okay, now let's see what can we do with these checkboxes inside
our Java code. For that, I'm going to open my main activity dot java file. If you're
wondering, I'm pressing double shift in order to see the search menu. First of all in here,
let's define our checkboxes. Once again, I'm going to define them as fields, let's say
private checkbox. For the first one, let's say checkbox, Harry. In here I have two options.
First of all, I can create my checkboxes line after line. For example, I can say private
checkbox, and for the second one, we can name it checkbox matrix. Or alternatively, because
the kind of these objects are the same, I can add a comma in here and I can define my
second checkbox. For example, I can say checkbox matrix. Let's also define the checkbox Joker.
And later on inside our on create method, let's instantiate them. Let's say checkbox
Harry is equal to find view by ID r.id dot checkbox sorry. Similarly for the next two.
If you want, you can have a click listener for each one of these checkboxes For example,
I can say checkbox hiree dot set on check change listener, this is the listener that
I need. Let's pass new unchecked change listener. Once again, you can see that this is an interface.
The exact name is compound button that unchecked change listener. Inside this interface, we
have this unchecked change method in which we receive two elements. The compound button
itself, which is our checkbox in this case, and also this is checked Boolean. So in here,
I can create an if statement, I can say if is checked. Let's show a toast message. Let's
say you have watched Harry Potter. But in the else case, let's show another source message.
This time I'm going to say you need to watch Harry Potter. Before I write the logic for
the next two checkboxes, let's run our application and let's see what would be the result. Right now Harry Potter is checked but we are
not seeing any toast message and that's because the onclicklistener in here is going to react
when we click on this checkbox. For example, if I uncheck this checkbox, we can see that
you need to watch Harry Potter. Let's also check it. You have watched Harry Potter. But
what if we want to see the toast message when we run the application without any clicking
on our checkbox. For that we have an option here before setting this onclicklistener.
We can check that if our checkbox is checked or not. For example, for that I can create
an if statement, I can say if checkbox hiree.is checked. As you can see, this method is going
to return a Boolean. And as its name applies, it's going to check that if our checkbox is
checked or not. So if it's checked, I'm going to show the toast message. Let's copy it from
here. But in the else case, I'm going to show another toast message. Once again, we can
copy it from down here. Let's run the application. As you can see, when I ran the application
without any clicking, I saw that was message. So from time to time, this is check method
is going to be useful. I'm not going to define an onclicklistener for the next two checkboxes
because I'm sure that you got my point. Also, like in the previous video, instead of passing
this new compound button that unchecked change listener, you can implement this listener
at the declaration of your class for example, in here, and after that you need to override
this unchecked, change the method. After that you can pass this instead of this new listener
in here into your set on check change listener method. But once again, I'm not going to go
through that. Instead, let's switch back to our activity main dot XML file. And let's
talk about another UI element. But before that, I'm going to minimize this relative
layouts. The next UI element that I'm going to talk about is a radio button. That's a
radio button, this one down in here. For the width and height, let's say wrap content,
you can see that this is this circular button. Let's move on to below our relative layout.
I can say below or layout below. I think it was named movies relative layout. Let's also
add two margins, margin left of let's say 25 dP and also margin top of maybe 20 db,
like checkboxes, we can also have text, that's a text. For the text, I'm just going to say
married. This is going to determine the marital status of the user. So that's what this text
is about. Let's also give it an ID. Let's say radio button married. Like checkboxes.
If you want to check this married radio button, you can say checked and you can pass through.
If you want to have multiple radio buttons, you can say something like this, you can copy
and paste this radio button, but there is going to be some problem with our code. Before
that, let's change the text and ID of this radio button. For example in here, let's say
syngo. And after that, let's change the ID to RV singer. Let's also move this one to
write off our radio button married, let's say to write off radio button marriage. So
the purpose of radio buttons in programming is that among multiple radio buttons, you
can only select one. This is the difference between radio button and checkbox. When you
have checkboxes, you can check multiple checkboxes, both when you have radio buttons, you can
only have one radio button checked. But as you can see, our program is not functioning
right in here. And that's because we need to group these radio buttons. And we can do
that by creating another item in here called radio group. Before that, I'm going to delete
these two radio buttons. Let's say radio group. This one. Once again, for the width and height
I'm going to say wrap content. Let's move it below our movies relative layout. Layout below ID movies rely on a margin top
maybe of 20 dP. And also let's center it horizontally, center horizontal to true. Once again, because
I'm going to put some radio buttons inside this radio group, I'm not going to finish
creating this radio group. Instead, I'm going to finish creating this opening tag by adding
a left anchor bracket like a relative layout, you can see that now we have an opening tag
and also a closing tag. Inside this radio group. I can have my radio buttons, let's
say radio button, wrap content and wrap content. Let's give it an ID let's say radio button
married a text maybe. And also, let's change It's default value to checked, let's say checked
through. Now we can have multiple radio buttons. Let's copy and paste this one. So as you can
see, I never moved this radio button to below our first radio button, but it's moved automatically.
If we change the ID to, for example, RV single, you can see that even though both of these
radio buttons are checked, but only one of them is showing the checked value, so when
you are using radio buttons, only one of them can have a checked value. For that, I'm going
to delete this checked attribute from the second radio button. And also I'm going to
change the text to single. Let's also add another one. For the ID, let's say radio button
in REL. And let's change the text to in a relationship. Let's also delete this check
attribute. Right now our radio buttons are vertical. If you want, you can have horizontal
radio buttons as well for that inside your radio group. You can have an attribute called
orientation in which you can pass horizontal or vertical. If I pass horizontal, you can
see that now we have our radio buttons horizontally ordered, I think it's better to have some
margins between these radio buttons. So let's quickly add some margins. Let's say margin
left of maybe 15 dP, I guess. Let's add another one down in here. Okay, now let's see how
we can use these radio buttons, our radio group inside our Java file. For that I do
not need to define my radio groups. Instead, I just need to instantiate my radio group,
let's say radio group. Let's name it radio group marital status. But I believe I need
to give an ID to this radio group. And I think I didn't do that. Yes, in here I can see ID
let's say radio group marital status. In our I create method that's also minimize this
if statement and also this onClick listener. And after the checkboxes, let's instantiate
our radio group. We can say radio group, marital status, fine view by ID r.id dot, radio group
marital status, we can have an onclicklistener for this radio group by saying radio group
dot set unchecked change listener. So this method is going to be called whenever we change
the radio button selected, and inside the parentheses, you can guess I can pass new
unchecked change listener, radio group dot unchecked change listener, which is an interface
and it will create this object change method. One of the inputs of this method is this check
ID in which we can use that for example, we can create the switch statement on this check
ID. And we can create our cases we can say in case it's our.id dot, let's say radio button
married. So basically this checked ID is the ID of our radio button, whichever is selected.
So in case if the user selects this radio button married, I'm going to show a toast
message. Let's just say married. But in case it's our that Id dot, let's say radio button
single. Let's show another toast message. Let's also add another case for RV in well.
As usual, let's also create our default case. And let's add a break. Let's run our application.
And let's see if we can see any result. Right now this married is selected. If we
select the single you can see that the married one has been unchecked. And also we have saw
the toast message. Let's select another one. You can see the toast message which is perfect.
Right now we have an onclicklistener for our different radio buttons inside this radio
group. And depending on that button, we are doing something for example, in this case,
we are showing a toast message. But if we want to do something without clicking on these
buttons, we can do something like this in our code. So before this set on check change
listener. I can say radio group marital status dot get checked radio button ID. As you can
guess this will return the ID of the checked radio button. And I can save that inside an
integer. For example, I can say me checked button. After that, I can create a similar
switch statement based on the checked button. So let's say switch on the checked button.
And let's create our cases, I'm going to copy and paste the cases from here. Let's run the
application. And let's see if we can see any result. As you can see, we are not clicking
on any of these radio buttons, but we just saw the Maritimes that seems to be perfect.
In some cases, we might need to check for the checked radio button before clicking on
them. I'm going to talk about another UI elements in this video. And that's called a progress
bar. Let's quickly see that as well. Before that, I'm going to minimize this radio group.
After that down in here, let's say progress bar, draft content and wrap content. Let's
give it an ID, let's say progress bar. Let's also center it, let's say center and parent.
And let's pass through. Let's run the application. And let's see what our application is going
to look like with this progress bar. As you can see, an infinite progress bar is constantly
circulating, this might be useful, for example, when we are downloading something from the
internet. In order to make our progress bar visible or on visible, we have an option.
For example, in our XML file, if we want it to be not visible, we can say visibility.
And we can pass on. Also we have this visibility attribute for almost all of the other UI elements.
If we want, we can change it to gone. But by default, it's visible. Let's change it
back to Bob. Later on in our Java code, we need to change this visibility to visible
and whenever we are done with it, we are going to change it to gone. Let's see how can we
do that in our Java code. Before everything, let's minimize all of the extra methods and
codes. And let's instantiate our progress bar. Above in here, I'm going to say private
progress bar. Let's name it progress bar. And then in here inside the onCreate method,
let's say progress bar is equal to find view by ID r.id dot progress bar. I do not have
any button in here in order to change the visibility of this progress bar. Instead,
I'm going to change its visibility whenever the user clicks on the radio button singer
for that insight the radio group marital status listener inside the switch case, in case if
it's always single, instead of showing the toast message or after the toast message,
I'm going to say progress bar dot set visibility. And I can say visible means that whenever
the user clicks on this radio button in Braille, I'm going to change the visibility of my progress
bar to gone. Let's copy this line of code. And after the toast message. let's paste that.
And let's just change this constant to God view.com. Let's run our application. Right now we cannot see any progress bar because
in our XML file, we have added the visibility attribute and we have set the gun value in
case if we click on this single, you can see that we are seeing the progress bar. In case
if I click on this in a relationship, you can guess the visibility will be changed to
gone. There is also another form of progress bar. Let's quickly see that as well. So in
my activity main dot XML file, I can define a style for my progress. But before that,
I'm going to change the visibility once again to visible in order to see the progress bar
in our preview. And after that, let's say style. If I type horizontal, we can see this
styling here widget dot appcompat that progress bar dot horizontal. Let's change the width
to match bands so that we can see it better. And also in here I have another option I can
say progress. And I can pass an integer For example, I can say 30 you can see that the
progress of this progress bar has been changed to 30. This type of progress bar is extremely
useful when you want to show the progress of something for example, downloading a file.
Sometimes you may want to show that how much of the file has been downloaded. You can also
set a maximum for your progress. For example, you can see Max and can pass 100. Let's also
add some margin left and right margin left of 20 dP margin right after ntdp. Okay, now
let's switch back to our Java file. And let's see what we can do with this progress bar.
Before everything, I'm going to delete these two lines of code, because I'm not going to
make my progress bar visible or on visible. Let's also minimize this switch statement
and this whole listener for our radio group, after instantiating, our progress bar, I'm
going to create a threat. If you remember from the Java session, this is the simplest
way that we can create a threat. Let's say threat threat is equal to new threat, we needed
to pass a runnable, let's say new runnable. Inside this run method, I'm going to create
a for loop. Let's say for int i is equal to zero, i less than 10, i plus plus, for every
time of looping, I'm going to increment the progress of this progress bar by 10. So let's
say progress bar, dot increments progress by as you can guess we need to pass an integer
in here, for example, let's pass that. After that. Let's freeze this thread for half a
second. If you remember from the Java session, we have used this way we said thread dot sleep.
But this way, there is a probability that we create interrupted exceptions. For example,
you can see that we have an error in here. And the error says that unhandled exception.
There is also another way in Android, I'm going to use that in here. I can say system
clock dot sleep. So this way, we don't need to create a try catch block. This wasn't available
in Java, this system clock is coming from Android dot voice, you can check that by take
a look at these imports. This one in here, Android dot o s that system collect is the
one that we just imported. After creating our thread, we just need to start it we can
do that after the definition of our trade, we can say thread dot start. So in here, we
have created this worker thread in which inside that we are creating a for loop. And for each
time of looping, we are incrementing the progress of our progress bar by 10. Also, after each
time of looping, we are sleeping the worker thread for half a second. Let's quickly switch
back to our layout file. And let's delete this progress attribute it was just for demonstration.
So if I remove this one, you can see that the progress will change to zero. Let's run
the application. And let's see if we can see the progress of our progress bar. As you can
see, we are changing the value of this progress bar for every half a second. If you want,
you can also get the progress of your progress bar at any moment that you want. For example,
in here you can say progress bar dot get progress. As you can see this get progress is returning
an integer which is the current progress of your progress bar. Sometimes you may need
that and here is how you can get that. Okay, I think that's enough for this video.
Once again, like previous videos, I'm going to upload the source code at my website@maker.org
slash quotes. Feel free to check that if you need and also in the next video. Finally,
we are going to talk about the differences between a relative layout, a constraint layout
and also a linear layout. I think it's going to help you a lot with understanding the layout
files better. Okay, see you in the next video. In this video, we will talk about different
layouts in Android. Specifically, we will talk about relative layout, we will talk about
linear layout, and also constraint layout. Let's start by talking about the relative
layout. Like before, I'm going to switch to text view in my layout file. Let's also minimize
this project thing. And let's change this constraint layout to relative layout. I'm
also going to enable this preview so that we can see what we are doing. First of all,
let's delete this TextView. And let's start from the beginning. So inside the relative
layout, all of our UI elements are somehow related to each other, it means that the place
of every UI element is relative to another layout, or maybe its parent, let's quickly
create a TextView and let's see the relativity in action. Like before, I'm going to say wrap
content for the width and height. Let's also specify a text. Let's just say hello world.
As you can see right now the TextView is placed at the left corner of my screen if I want
I can change that. For example you have seen in the previous videos that I Can center this
TextView vertically or horizontally. For that I can say center horizontal. Let's pass through,
you can see that it's being centered. And this is the relativity that I was talking
about. When we set this layout center horizontal attribute to true. We are defining relativity
between this TextView and its parent. Let's also center it vertically. Or instead of these
two attributes, I can simply say centering parent. Let's also give an ID to this TextView.
Let's say txt Hello. Now if I define another UI element, I can place that related to this
TextView. Let's quickly create a button in here. Let's say wrap content and wrap content
for the width and height. Let's define a text. Like before, let's say Say hello. Also, let's
define an ID. Now if I want to move this button to below this TextView, I can simply say layout
below. And let's pass the ID of our TextView. txt Hello, I can center this button as well.
For example, I can say center horizontally. And let's pass through, we can also have a
margin for example, we can say margin top layout margin top and we can pass some number
for example 15 db. Inside a relatively at you can also have another relative layout.
Let's quickly see that for example in here, I'm going to define a relative layout and
inside that relative layout, I am going to put three text views. After that, I'm going
to move this TextView this high level two below that relative layout. So I can see relative
layout. For the width and height. Let's say wrap content, you can say match parent. Like
other UI elements, we can define an ID for our relative layout. For example, I can say
first relative layout. So up until this point, when we wanted to create our UI elements after
setting the attributes, we could have used this backslash in order to finish creating
our UI elements. But in this case, because we are going to put some other elements inside
this relative layout, we need to create an opening tag and instead of using the backslash,
I am going to use the left anchor bracket. By doing that, we also create this ending
tag. And inside this opening and ending tag, now we can put our UI elements. For example,
we can pass our text views, let's say TextView. Wrap content wrap content, I'm going to fast
forward everything for these three text views. Like before, we can place our two text views
inside this relative layout correctly. For example, we can move them to right of each
other. So for this second text view, I can say to right off, let's say txt name, let's
also add a margin left of 10 dP. Similarly for this third TextView, let's say to write
off our txt last name, and margin left of maybe 10 dP once again, once again, this whole
relative layout is placed at the left corner of our screen. If we want, we can use the
center vertical or center horizontal attributes for this whole relative layout as well. So
inside the opening tag of this relative layout, I can say center for example. And let's fast
through let's also add some margin top, let's say margin top. And that's past 100 dP. You
can see that when I use these attributes on a relative layout level, all of the UI elements
inside that relative layout respond to those attributes. For example, in here we have centered
horizontally and also we have added the margin. Now that we have this relative layout, we
can minimize that so that we can see everything better. And after that, we can move this Hello
text to below this relative layout. But before that, I need to delete the center parent attribute.
Once again, you can see that it moves to the corner of our screen and because we have set
the layout below for this button, it moves as well. So in here I can say layout below
and I can pass the ID of my relative left it was first relative layer. Let's also center
it horizontally and let's pass some margin. Center horizontal through margin top, let's
say 10 db. So my point being here was that inside a relatively at or for that matter
inside any other kind of layout, you can have other relative layouts as well. Some of these
attributes, for example, this layout below are specific to relative layout. And if you're
inside some other kind of layout, for example, a linear layout, and also constraint layout,
you cannot use this layout below. During the course, we will see that each of these attributes
are specific to relative layout, before we move to the next kind of layouts, let's also
switch to this design view. At the left pane in here, you can see this component three,
as the name of this component tree applies. This in here is showing us the hierarchy of
different elements in our UI. So for example, in here, we have this parent relative layout.
Inside that we have this first relative layout, and also txt, hello, and btn. Hello. Inside
our first relative layout, we have three text views. Sometimes when you have a messy UI,
you may use this component tree in order to keep track of different UI elements. Okay,
let's switch back to our TextView. And let's start talking about linear layout. Before
that, I'm going to delete all of these. And let's change the strategy of layout to a linear
layout. Inside a linear layout, all of the UI elements will be placed line after line,
let's quickly see that I'm going to define a TextView. Once again, wrap content and wrap
content. Let's pass the text. Let's say hello world once again. Let's also give it an ID.
That's a txt Hello. So the first thing that is different inside a linear layout is that
you do not have the center in Parent Center horizontally or center vertically attributes
when you use linear layout. For example, in here, I cannot say centering parent, you can
see that it's not available. If you want to center your UI elements, you can have for
example, a relative layout inside this linear layout. Let's move on from this part. And
let's add another UI element. Let's say button wrap content wrap content for the text, let's
say Say hello. And let's give it an ID, let's say btn. Hello,
you can see that even though I didn't use any attribute to move this button to the right
of our TextView, it automatically placed to the right of our TextView. And that's because
we are using a linear layout. Inside a linear layout, all of our UI elements will be placed
one after another. If you want, you can change the orientation of this linear layout so that
the UI elements will be placed one after another vertically. Let's quickly do that. So in the
definition of my linear layout, I'm going to pass an attribute in here, let's say orientation.
That's fast vertical, you can see that they have been placed vertically. There is also
another attribute that I'm going to talk about in linear layout. Let's quickly delete this
button. And let's define another TextView. For the text, let's say name. And for the
ID, let's say txt. Like before, do you have the margins. For example, you can say margin
top, and we can pass any number that we want. But there is also another attribute in here
before I talk about that attribute, I'm going to give some background color for these two
text fields so that we can see the difference better. So I can say background, and I can
pass a color, for example, this color accent that we have in our color resource. Let's
also set the color for the first TextView. Let's say background, and let's fast color
primary this thing. So the attribute that I'm going to talk about is wait. Let's quickly
see that you can see this layout waiting here. And we can pass any number that we want. For
example, I can say 20. Let's also pass a weight to this second TextView. And we will talk
about it. Let's say Wait, let's fast at for example, you can probably guess the usage
of this weight attribute right now, it will give our attribute so weight according to
the numbers that we have used. For example, in this case, the entire width of our layout
is 20 plus 80, which is 100. And it will give the first TextView 20% of the weight of the
whole layout. It doesn't matter what number you put in here. For example, in here, if
I say two and for the second one, if I say eight, it will work the same. Also, you can
see this space in here. That's because we have this margin top if we remove that, you
can see that the whole layout will be divided accordingly. So this rate was another attribute
that I was going to talk about. If I change this orientation to horizontal, you can see
that it's working the same. There is not much to this linear layout, I just wanted to show
you that there is value in your layout with some specific attributes, for example, this
orientation and this weight. And in this course, we are not going to use linear layout that
much it's for simple layouts, but you can use it if you want. Before I remove all of
this, I'm going to say that inside a linear layout, you can also have other layouts, for
example, a relative layout or a constraint layout. Okay, let's remove one of these. And
let's talk about constraint layout. Before that, I'm going to remove this orientation
because it was specific to linear layout. Okay, let's say constraint layout. We have
two options in here, visit constraint and visa dot constraint layout, this is the one
that we are going to need. For this constraint layout, I'm going to switch to design view
because I think it's much better to work with the design view. First of all, I'm going to
enable the blueprint so that we can see the difference. If there is any, you can click
on this blue stack in here, and you can select this design plus blueprint, we will talk about
the difference between this design mode and this blueprint in a minute. Okay, for working
with the constraint layout, you can drag your UI elements like before you can drag, for
example, a TextView. And as soon as I did that, you can see that we have four circles
at the four edges of our UI element. Let's zoom in a little bit, you can see that the
four circles are at the four edges of our UI element. Let's zoom out a bit, I just wanted
to show you the four circles. Also, the shortcuts that I'm using in here is Ctrl. Plus Plus
in order to zoom in and control plus or minus in order to zoom out. Also at any time, you
can use Ctrl plus zero in order to have a fit screen. It's also worth mentioning that
if you have a keyboard that has some numbers and keys for the calculator, the plus minus
and zero from the calculator keys are not going to be helpful in here. So the shortcuts
are going to be only useful for when you are using the upper numbers. And also the upper
plus and minus. The most basic thing in a constraint layout is to constrain your UI
elements right now you can see that we have a red area in here. Similarly, we have the
same error in our components three, it says that we need to constraint your UI element.
In order to constraint your UI elements, you can drag one of these circles to for example,
the edge of your screen. So right now we have added one constraint, if we switch back to
our TextView, you can see that we have this constraint in here. I'm talking about these
two line of code in here. Okay, let's go back to the design view, we can add another constraint.
For example, for the right constraint of our UI element, we can add the constraint to the
right edge of our screen. But still this constraint layout is not happy. It says that not vertically
constraint, it means that we need to at least add another constraint in here. And now the
error is gone. And it has been changed to some warning. If you want to center your UI
element into the center of your parent, you can add another constraint for example, from
the bottom of this TextView to the bottom of the screen. If you want to remove one of
these constraints, you can just click on the circle and you can press the delete key, you
can see that the constraint will be deleted. Let's press Ctrl Z in order to redo that.
If you take a look at this attributes painting here, you can see that you have a slider for
this TextView for different constraints. Right now the number says 50. But if you want you
can change that, for example, if you move it a little bit, you can see that the TextView
responds accordingly. It will move according to this slider. Similar to that we have this
horizontal slider in which you can guess we can move our UI element. So constraining your
UI element to the edges of the screen is one way you can also add constraints to other
UI elements. For example, if I have a button in here, let's quickly add that and let's
delete the constraints of this text view all of them. Let's move it so that we can see
everything better. This though, if we want we can constrain this button to for example,
the bottom of this text view, we can see that it moves accordingly. You can also see that
when I click on one of these circles, I can see all of the available targets for example,
I can constrain it to the right or My TextView sometimes it might not work, and you may want
to add that one more time. So this way, we have constraints with our button to the bottom
of this TextView, and also to the right of this TextView. If we want to make it center,
we can add another constraint to the left of this TextView. And both of these UI elements
are now somehow centered. Let's also add a margin so that we can see everything better.
So by clicking on one of your UI elements, you can see that in the attributes pane, we
can add a margin. For example, from top, let's add 32. If you take a look at this componentry
in here, you can see that we have no error about this button. But we have an error about
this TextView. It means that we have all of the necessary constraints about this button.
But we need to add some constraints about this TextView. For example, we need to constraint
it vertically or maybe horizontally as well. Like before, we can add the constraints to
the both edges of our screen. You can also see that when I add the constraint, this button
moves as well, it means that no matter where this TextView is, we want our button to be
concentrated to this TextView. Let's add another one. Let's also add a margin top for this
TextView as well. I think 32 is not enough. So let's say 100.
Let's also add another TextView. And let's see other kinds of constraints. So constraining
your text fields, for example, from top of this TextView to the top of this TextView.
And from bottom of this TextView to the bottom of this TextView is one way of having two
text views at the same line horizontally. There is also another way, I'm going to press
Ctrl Z two times so that we can do the constraints, we can right click on one of our UI elements,
and we can select this show baseline. Now you can see this baseline, instead of adding
the two constraints from top and bottom, we can select this baseline, and we can constraint
it to the baseline of this TextView. This time, once again, they are at the same line
horizontally. Let's zoom in a little bit. In order to navigate through all of your layout,
you can press the space key, and you can drag your mouse like if you work with Photoshop,
you have the same ability, you can see that both of these text views are at the same line
horizontally by adding some constraint to the baseline. Once again, the baseline is
not available by default, you can right click, and you can select this show baseline. Let's
zoom out. So we have seen that we can constrain our UI element to know both edges of our screen.
But what if we want to, for example, have another line for example, if we want to move
these TextView or constrain this TextView to some other space beside these two edges.
For that, we can right click on our layout. down in here inside these helpers. We have
these guidelines add vertical guideline and add horizontal guideline, you can guess each
one of these will create a line. For example, let's add a vertical guideline. Let's zoom
in a little bit so that we can see better, you can see that this line has been added
to our layout, we can move it for example, we can move it to the right of our screen.
As soon as I did that, you can see that we have some margin from the left side of our
screen, you can see this triangle in here. If I click on that, it will change the margin
from left to the right of our screen. Sometimes this might be useful as well. Right now the
constraint of this TextView is the edge of our screen, let's quickly delete the left
constraint of this TextView. And if we want, we can add this constraint to this guideline,
for example, we can add it in here. Sometimes once again, it might not work. You can see
the difference the TextView now constraints to this guideline instead of the edge of our
screen. If you want you can constrain this TextView to this guideline as well. But before
that, we need to delete this baseline constraint. Let's quickly delete that, sorry, I deleted
the whole TextView and let's constraint it to this guideline and also to the edge of
our screen. If you want you can also have multiple guidelines, we will add another one
in a second. So for example, I can once again right click on the layouts. by going to this
helpers. I can add another vertical guideline. We can see that this guideline has been added
and I can use it like I've used this first guideline. We also have a vertical guideline.
In our helpers, we can add this horizontal guideline. We can Guess it will add a horizontal
guideline. Once again, we have this triangle in here, if we click on that it will change
the margins from top to bottom. Let's also constrain this TextView to our guideline.
Sometimes when you're working with different UI elements in a constraint layout, adding
some foam strength might be difficult. For example, here, we don't have much space. For
that, we can select both of the items that we want to add constraints, for example, this
TextView. And this guideline, you can select multiple UI elements by pressing down the
control key. After you have selected both of them, you can right click, you can go to
this constraint in here, we want to constrain our TextView to which is the ID of this TextView
to our guideline, so I'm going to say top two, let's say bottom of our guideline tree.
This way, we can add the constraint sometimes where there is not much space to work with,
you can use the right click menu by selecting this constraint, you can add the required
constraint path for that, once again, you need to select the path of items that you
want. For example, this takes you on this guideline. Or if you want to add the constraint
from this TextView to this button, for example, you can select this TextView and this button.
Right now, if you have set the left constraint of this TextView to this guideline, we can
also move this guideline for example, we can move it accordingly to right and left, you
can see that once I removed this guideline, the UI elements move as well. But depending
on your system, this operation in here might be a slow because as you can see, where we
are tracking the live response of our UI elements. If you want, you can disable this live rendering,
you can go to this icon here. And you can uncheck this live rendering. Let's zoom in
a little bit. Now if I move this guideline, you can see that the UI elements themselves
do not move. But we can see the outline of every UI element. So in some cases, when you
do not have all of the required resources, for example, some large amount of memory RAM,
you can disable this live rendering. But in here, you can see the difference between this
blueprint and also this design view, you can see that when I moved this guideline, the
UI elements inside the blueprint view are moving accordingly. And that's because the
blueprints view do not render our UI elements at all. It's just some blueprint of all of
our UI elements. Later on, when we add some image view to our layout, we will see the
difference much better. Okay, let's move on from this part. Sometimes when you're creating
your layout files, you may want to have some sample data, or as we might call it in programming,
you may want to have some placeholders. For example, right now, the placeholder for this
TextView is this text view. If we want, we can change that, we can right click on our
element, we can go to this set sample data. And we can select some text, we can see that
we have this cities for example, it will change the text of our TextView to Shanghai, for
example. Let's see others. For example. Another popular choice is this date in here, you can
see different formats, we can select that and we can have some sample data about the
date. The other one is lorem ipsum. If you search on the internet for sample text, you
probably get this lorem ipsum text. Let's select that. And we can have some sample text.
And according to that, we can have this text on our layout, we also have the Lorem text.
Let's quickly see that. So instead of Lorem random, we can select
this Lorem, which is basically this Lorem text. Before we finish off this video, let's
also see the sample data for this image view as well. I know that we didn't talk about
image view so far in the course, but we will talk about that in the next video, we can
drag some image view to our layout. First thing we need to set some sample data for
our image view. For example, we can select from the avatars. Right now this is the avatar
that by default we have selected for our imagery. If you want to you can change that by right
clicking and set some sample data, we can select another avatar or we can select one
of these for example this background. Let's select another avatar. For example this one
like before you can constrain this image view for example to the both edges of your TextView.
Let's quickly do that. If you take a look at the attributes painting here, you can see
that for the layout width, we have set the width to content, we can change that, for
example, we can say match constraint. When we do that, the width of our image view will
change according to its parent constraint, which is this TextView in this case. But there
is also another difference when we change this layout width to match constraint. When
we do that, if you take a closer look in here, inside this constraint widget, you can see
that we have this line in here. Let's click on that. And once I do that, you can see that
this ratio in here has been added. It's useful for when you want to show some images from
the internet, when you don't know the size or the ratio of your image. Right now, the
ratio is one to one, if you want, you can change that, for example, you can say one
to two, you can see that now the ratio has been changed, or let's say two to one, the
ratio of our image view responds accordingly. Also, you have the same option from above
in here layout constraint ID, which you can change this to 212. Once again, one to one.
Also know that you have used this image view, you can see the difference between this blueprint
and this design view, you can see that in the blueprint view, we are not rendering the
image view. And in the blueprint view, we are not rendering our layout. It's very useful
for when you're working with constraint layout, especially if you do not have the required
resources. For example, if you do not have large amount of RAM, you can always go off
to this blue stack icon. And you can select this blueprint so that you have only the blueprint.
Okay, I think that's enough for this video in the next video. First of all, we are going
to work with this image view element. See you in the next video. In this video, we are going to talk about
images in Android, and I believe it will be a short video. As always, let's switch back
to our layout file. And let's change this constraint layout to a relative layout. You
can keep working with constraint layout, I'm just more comfortable with this relative layout.
First of all, I'm going to delete this TextView. And let's create our image view. This time
instead of wrap content or mass filing for the width and height, I'm going to put some
number for example, I'm going to say 150 db. Right now, you cannot see any image in your
layout file in this preview because we do not have any placeholder. But you can see
the outline of your image. If you want to have some placeholder you can say something
like this, you can say source this src. And you can add a sub image from your project.
By default, you have some images in your project. For example, in your driver folder, you have
this IC launcher background. Let's select that, for example. And as soon as I select
that, you can see that we can see this green image in our preview. Later on, we will talk
about this driver folder and other folders that are related to images in Android projects.
So this is going to be a placeholder. And if you want we can later on change this image
in our Java file. Let's also give an ID to our image view. Let's say ID, let's name it
might image. Let's also move it to the center of our path. Let's say center your parent
and through. So when we have address this image, we have used this app driver, which
means that this image this IC launcher background lives in our driver folder. If you take a
look at your project pane, in the Resources folder, we have seen the layout folder in
which we have this activity main dot XML file. But beside that we have this driver folder.
Inside this driver folder we have some XML files as well. So if you take a look at this
IC launcher background, you can see that we have this XML file which at the end it result
is this image, or to be specific is this drawable. Inside this XML file, we have some elements
like vector path and everything. Don't worry about them yet. We will talk about them later
on in the course but at the end, the result of this XML file is this driver in here. If
you want you can add other drivers in your driver folder as well. For example, if you
right click on your driver folder by selecting new vector asset or image asset depending
on your need, you can add new drivers. Let's select this new image asset. In here first
of all, we can select the type of our image right now. It's launcher icons if you want
you can change that. For example, you can see action bar and tap icons. So basically
this You can add some icons to your project. First of all, you need to name your icon.
This is going to be the name that later on, you will pass to your images, for example,
your image view, you can see that we have passed this IC launcher background. That name
is coming from here. IC stands for icon. It's the convention to name your icons with this
IC. So let's say I see alarm. For example, in Android Studio, you have some icons. For
example, if you click on this icon here, this Android icon in here, you can see the clip
art, you can see that there are all sorts of icons, and you can use whichever you want.
Also notice that these icons are available under this Apache License, so make sure to
check that before you use them in your project. Because I've named this icon Ico alarm, I'm
going to select one of these alarms. For example, this one, let's select okay. And in here,
you probably can see the icon, it's somehow void. If you want, you can change the color
by opening this drop down and select a custom color. For example, let's pass in black. Now you can see the alarm better. Also notice
that there are multiple sizes of this icon. And that's because in different screen sizes,
the Android system is going to select one of these sizes. For example, if it's a larger
screen size with a large pizza rate, it will select one of these larger images similar
to that if your application is going to run on a smaller screen size device, the Android
system will select one of these smaller icons. Okay, let's select Next from here. Once again,
you can see that in your Resources folder inside the driver folder, multiple images,
multiple driver files with multiple qualities will be added. And you can also see the output
file this is going to be the XML file when you create your driver file. Basically this
at the end is going to create that alarm icon. Let's click finish in here. And if you take
a look at your driver folder, now you can see that we have this icy alarm, which once
again is presented with five different qualities. Now in our activity main dot XML file, instead
of passing this IC launcher background, we can pass IC Allah. So this way, by adding
some deriva into your driver folder, you can add some images to your project. Similarly,
you can add some images into your mipmaps folder as well. Right now we have some images
in here, for example, we have this IC launcher. And also we have this IC launcher around which
at the end we'll create around it icon. If you want to add some extra images into your
project from for example, let's say your computer, you can add them into this magma folder. For
example, I have prepared this PNG file, I can copy that that's a copy. And in my micpa
folder, I can paste that. Let's select the directory. And also Let's name our file. It's
also very important to note that when you are importing some images into our project,
the name of your map file, the name of your PNG or JPG file shouldn't have any spaces.
And also for that matter, they shouldn't have any awkward cases. So the naming here I think
is fine. Let's press OK. And as you can see, this maker dot png has been added to my lead
map folder. Now that I have this image into my project, I can address that from inside
the activity main dot XML file. For example, in here instead of saying iclm, I can say
me. But because we have added that file into our map folder, we are getting a red warning
because we are saying as driver. For that I'm going to delete all of this. And I'm going
to say add map. And I can add this makeup, we can see that the logo has been added into
our project successfully. So far, we have added these images and drivers in our project
in this Android view. Let's also check the project view. And let's see if we can locate
different images in the project view as well. So you can guess that it's in our app folder
inside the sources folder. Inside the main folder inside Resources folder, we can see
all these drivers and mipmap folders. Once again, each one of these is going to respond
to the quality of the screen of the user's device. So for example, if we want to locate
this macro dot png because it was a high quality image, I believe it will be inside this week
map x x hdpi. As you can see it's in here. But if you want to have an application that
response to each one of the screen sizes and the screen qualities correctly, you need to
create images for each one of these qualities and add them into your project. Right now,
if you take a look at, for example, this mdpi, you can see that inside this folder, we do
not have any macro dot png, it's not going to cause any problem in order to show the
images in different screen sizes. As long as there is some image with the name maker
dot png, it's going to show something to the user, but it may cause some bad user experience.
Okay, let's switch back to our Android view. And let's talk about how you can change the
icon of your application. But before that, let's quickly run the application. And let's
see what is the current icon for our application. Right now you can see that the name of this
application is images. And if you take a look at the list of your applications on your device,
you can see that the logo of these images is this rounded Android icon. This is the
icon that we have seen inside our MC map folder. So if you take a look at your map folder, then in here we have this IC launcher round,
which is this icon, which at the end will be somehow rounded. And if you want to change
that you can go to your manifest folder, you can see that we have this Android manifest
that XML file. If you click on that, you can see some general information about your application.
later on. We will talk about this manifest file and also other XML files in your project.
But for now, you can see that inside this application tags, we have two attributes this
icon and also this round icon. Both of them are addressing the IC launcher icon for now,
if you want you can change that, for example, in the devices that you are not going to show
around the icon, you can change this, let's quickly change this one and let's address
our makeup. Similarly for the round icon, I'm going to pass me but let's run the application.
And let's see if we have changed the icon successfully. If you take a look at the list
of your applications, once again, you can see that the icon for this images application
has been changed. Okay, I think that's enough for this video. In the next video, we are
going to start working on the list view and also a spinner. So in the next video, we are
going to show how can we have a list of different items. See you in the next video. In this video, we are going to talk about
how we can show a list of different items in our application. For example, at least
have different cities or at least have different students. For that, first of all, I'm going
to start talking about ListView. ListView is one of the options that we can use in order
to show a list of different options. For that, first of all, I'm going to close this java
file for now inside my XML file, first of all, I'm going to delete this TextView. And
after that, I'm going to change this constraint layout to a relative layout. If you want,
you can work with constraint layout, but I'm more comfortable with relative layout. After
that down in here, I'm going to say list view. For the bid standpoint. This time I'm going
to say match parent. And as soon as I do that, you can see that in here in our preview, we
can see a list of different items on our screen. These are just some sample data indicating
that we are going to use a ListView. I'm also going to add a margin top, let's say margin
top. And let's say 100 dP, let's also give an ID. But before that if you take a closer
look in here, I'm not sure that if you can see this scroll bar at the left pane in here,
but it indicates that we can scroll our ListView in case if all of our items do not fit on
the screen. So if we have a large amount of items, we can scroll over our list view. Okay,
let's give an ID to our list view. Let's say ID. I'm going to name it cities ListView or
cities list. And I think that's enough for now. Let's quickly switch back to our Java
file and let's initialize this list view. Like before above in here I'm going to say
private list view. Let's name it ListView or Let's name it cities list. down in here
inside the onCreate method I'm going to say city's list is equal to find view by ID. Also
if you have noticed I'm using a shortcut for this find view by ID method. Instead of typing
all of the method I'm using FB shortcut. If you press Enter or tab you will get the whole
method we will talk about these available shortcuts in IntelliJ and Android Studio later
on in the course. Okay, let's pass the address of our ListView, let's say our.id dot cities
list. After that, we need to create the data that we want to show in our list view. For
example, in here, I'm going to create an ArrayList of different strings. And later on, I'm going
to pass it to this city's ListView. For that, I'm going to say ArrayList. This one in here,
of different strings, let's name it cities, is equal to new ArrayList. And after that,
I'm going to add some cities to this array list, let's say cities dot add. And let's
add some items. In here, I'm adding all of these cities to
my city's array list manually. But in most cases, the list of your objects will be coming
from the web server or maybe your database. Because we didn't talk about this stuff yet.
We are going to hard coding them and we are going to pass them manually to our ArrayList.
Okay, after providing your data, you need to pass this data to your ListView. But before
that, you need to create an adapter. The purpose of the adapter is to fetch the data to your
ListView. Let's quickly see how we can create our adapter. There are multiple kinds of adapters,
but the one that I'm going to use in here is this array adapter. This is the simplest
one, and we are going to work with that in here. Let's say array adapter of type string.
Let's name it cities adapter. That's equal to new array adapter. Inside the parentheses
of this array adapter, we need three things. First of all, we need a context, which I'm
going to pass this later on in the course, we will talk about context. But in here, because
we are inside an activity, I'm talking about this main activity and activities are context.
So this one in here is going to work fine. So by passing this, we are passing our main
activity as the context. Don't worry about that yet. We will talk about context later
on in the course. After that, we need to pass a layout file for every item in our list view.
So for example, if you are going to show the name of a city, we need a layout for that
city in our list view, we can create our customized layout, but in here, I'm going to use one
of the built in layouts. For that I'm going to say Android dot r dot layout dot, let's
say simple list item. So basically, this is a built in layout file in which we can use
in order to show different cities in our list view. After passing the context, and also
the layout file for every item, we also need to pass the data. In this case, we need to
pass the city's array list. So let's say cities in here. And now we have our adapter for our
ListView. Once again, the purpose of this adapter is to fetch the data, in this case,
this city's ArrayList to our ListView. After creating your adapter, you can say city's
list dot set adapter, and you can pass your adapter, let's say city's adapter. before
running the application, let's quickly review what we are doing in here. First of all, we
have created our ListView inside our layout file. After that we have initialized it inside
this onCreate method in here. After that we have prepared our data in this case, we have
created this simple ArrayList of different strings called cities. After that we have
created an adapter in order to fetch these cities array list to our list view. And after
creating the adapter, we have passed it to our list view. Let's quickly run our application.
And let's see if we can see these items in our list view. As you can see, we have created
this list view and also populated the data that we have passed in our ArrayList. Also,
if we had more data that wouldn't fit on the screen, the ListView would be a scrollable
display of in here for every item is this simple this item that we have passed in here.
If you want to take a look at that you can press down the CTRL key in Mac it should be
command key. And by clicking on the symbol list item one you can check the layout file.
You can see that it's a simple text view with some attributes. Nothing special in here.
You can also make your items clickable right now if you click on one item, nothing happens.
But you can set a listener for each one of these items. Let's quickly see that. So after
passing the adapter in here, I can say city List dot set on item click listener this one. And
I can pass my interface, I can say new on item click listener. Notice that it's adapter
view.on item click listener, it's different from on click listener. When we pass this
interface, we have this on item click method in which has some inputs. The one that we
are interested in is this position in here. Basically, this is going to be the position
of our item in our ListView. Let's quickly see how we can use that. For example in here
I'm going to show a toast message after clicking on each one of the items. Once again, when
we create our toast message, first of all, we need to pass a context. Because we are
inside this on item click method which exists in another interface, we cannot simply pass
this we need to pass main activity dot this in order to refer to our context. After passing
the context, we can pass our text for the text in here I'm going to say cities dot get.
And for the index in here, I can pass this position. So this way, we are going to get
the city name that we have clicked on. We are using this position as the index in order
to get the appropriate city name from our cities ArrayList. Also, if you have noticed
when I use this cities inside this on item click method, this final keyword has been
added to the declaration of ArrayList. As a reminder from the Java session, when you
add a final keyword at the declaration of a variable or an object, that variable or
the instance of that object would be constant, it means that you cannot change that instance.
But although we cannot change the instance of this cities, after declaring it as final,
we can use all of the methods inside that object. For example, we can use this dot add
method, because we are using this city's ArrayList inside this on item click method which exists
in another interface, the city's ArrayList needs to be constant. And this final keyword
has been added automatically. And if I remove it right now from here, you can see that we
are getting this error down in here. And it says that your variable should be constant.
So let's add the final keyword once again. Also, let's add another text in here, let's
say plus selected. Okay, let's run the application once again. And let's see if we have set on
item click listener successfully. So now if we click on one of the items inside our list
view, for example, this New York, you can see the toast message in here, New York selected
Berlin Berlin selected. Okay, it seems like our on item click listener is working fine.
Once again, this on item click listener is different from the onClick. listener. If you
set the onclicklistener on your ListView, it's not going to work according to every
item in your ListView. Okay, I think that's enough talking about ListView. You can work
around ListView, if you want. But I do not suggest that because in Android, we have modern
solutions for populating a list of different options. For example, we have RecyclerView,
which has a lot of flexibilities. If you take a look at your layout file inside the design
view, you can find a ListView somewhere inside this legacy. You can see that in here. And
it's inside this legacy because these days, almost no one uses ListView. I just wanted
to show how can you create a ListView. The reason that you may want to avoid using ListView
is that ListView does not have much flexibility. For example, you cannot customize the layout
of every item in your list view. You can create a customized layout for every item. But in
recycler view, you have much more flexibilities. And also, the other issue is about performance.
If you have a large amount of data that you want to show in a list for example, if you
have 1000 items. In those cases, you will see the performance issue when you're working
with ListView. recycler view has done a much better job when it comes to performance. We
will talk about recycler view in one or two videos from now. But let's move on from this
part. The other layout for that I'm going to talk about is called a spinner. Let's quickly
see that I'm going to define my spinner above this ListView. So in here, let's say a spinner.
For the width, same height. This time, let's say wrap content. Let's center it horizontally
and also let's add some margin top. Center horizontal through margin top, let's say 50
dP. Right now you cannot see your spinner inside this preview very well. And that's
because you do not have any data inside your spinner yet. Basically, this is Winner is going to create a drop down menu.
For example, if you click on this, you will see a list of different options. We will see
that in action in a minute. But for now let's just pass an ID for our spinner. Let's say
students list or students spinner, it's a better name. Also, let's move our ListView
to below this has been a layout below. And let's pass the ID of our spinner. Let's initialize
our spinner in our Java file. Like before, I'm going to come above in here and say, private
spinner. Let's name it a student spinner. And then in here inside the onCreate method,
I can't initialize that. Let's see student spinner is equal to find view by ID dot, let's
say a student spinner. Once again, like the ListView, first of all, we need to create
the list of items, the data that we want to show in our spinner. For that I'm going to
create another ArrayList in here. So let's say array list of different strings. Let's
call it the students is equal to new ArrayList. After that, let's pass on data to this students
ArrayList. Similar to when we are working with listviews.
After providing our data, we also need to create an adapter. Once again, the purpose
of this adapter is going to be fetching the data into our spinner, we can create our adapter
like we have did for the ListView. So in here I can see array adapter of different strings.
Let's name it the students adapter is equal to new array adapter. Like before, inside
this parentheses, we need three items. First of all, we need the context. After that, we
need to lay out five for every item in our screener. Once again, you can create your
customized layout file if you want. But in here for the sake of simplicity, I'm going
to use a built in one. So let's say Android dot r dot layout dot the layout font that
I'm going to use this time is this simple spinner drop down item. When we created the
adapter for ListView. We have used this simple list item Vaughn. But in here we are going
to use this simple spinner drop down item. After that, once again, we need our data which
I'm going to pass my students I released. After creating your adapter you can see the
students the spinner dot set adapter, and you can pass your students adapter. Let's
run our application. And let's see what a spinner looks like. You can see this winner
above in here, it's going to generate a drop down menu. If I click on this triangle in
here, you can see the name of the students that I have passed into my ArrayList. Once
again, these items can be also clickable. For example, if I click on one of these, we
can take some action. Let's quickly see that how can we create an onclicklistener for each
one of these items. So after setting the adapter down in here, I'm going to say students spinner
dot set on item selected listener, this is different from the listener that we have used
for the ListView. For the ListView we have used set on item click listener but it's not
going to work in here. Instead we are going to use this set on item selected listener.
Let's pass our interface let's say new on item select listener adapter view.on item
selected listener and this interface is going to generate two methods on item selected and
on nothing selected. The names are descriptive on nothing selected means that if you do not
select anything inside your spinner, you are not going to work with this method and we
are not going to write any logic in here. Instead inside this on item selected we are
going to show a toast message. Once again, you can see that we have this position in
here in which we can use it in order to for example get the name of that student. First
of all like before we need the context because we are inside another interface we are going
to pass main activity that this after that for the text I'm going to say students that
get as the index I'm going to pass position. That's a plus selected. Let's run the application and let's see if
everything is going to work. So in here you can see that even though I never clicked on
any item I see the toast message. And that's because we have used this set on item selected
listener. Once again, this is different from the on item click listener. I don't know why.
But we cannot use an item click listener for the spinner, if you try to use that you will
get an exception. Instead, the other option that you have is this set on item selected
listener. Let's see if we can show the toast message. If we select another item, for example,
Sarah, you can see that those messages down in here. This is one way of showing data inside
your spinner. It's useful for when you do not know what data you're going to show. For
example, if you're going to retrieve the data from a web server or a database, to be precise,
in case your data is dynamic. But in case you know that data previously in case your
data is static, you can use another way, let's quickly see that. So before that, I'm going
to open this project pane. Inside my app folder inside this Resources folder, we have this
values folder in here, in which inside that we have this strings dot XML file, we can
create a string array inside this XML file, and later on, we can pass it into our espinar.
Basically, this strings file is going to be the place that we put all of the static strings.
For example, right now you can see that we have this app name string, in which we have
used it inside our manifest file. Let's quickly see that inside this Android manifest dot
XML file, we have this label attribute. If we click on the label, you can see that it's
addressing the string file. And this is the name of our string from strings that XML file,
we know for sure that the name of our application is not going to change, for example, it's
not dependent on some string from our database or the web server. So we have passed it in
here. In the next video, we will talk about the usages of these strings that XML file
and also for that matter, other XML files in our application. But for now, let's create
a string array statically in here, and let's pass it to our spinner. So inside this strings
dot XML file, you can create two different kinds of items, you can create a string, or
alternatively, you can create a string array. The way to do that is like this, you can say
a string array, you need to name your array. For example, in here, I'm going to say to
students after that, inside this opening and closing tag, I can create different items,
let's say item. And inside these item tags, I can provide the value for example, I can
say Mesa, you can copy and paste this item as many times that you want. Once again, don't worry, if you don't understand
these strings, that XML file, we will talk about it in the next video. Now that we have
created this string array, we can pass it to our spinner item inside our activity main
dot XML file. When we have created our spinner, you have an attribute called entries. This
attribute in here, you can see that we have these add airy students this is the address
of our string array in our strings dot XML file that's passed that and as soon as I pass
that, you can see that we have some sample data in our spinner. So now that I have passed
the data to our espinar, aesthetically, I don't need to pass them in my jar file dynamically.
For that I can comment all of these lines of code, for example, from here to top in
here. But right now we are getting an error inside this on item selected method. And that's
because we no longer have this students array. If you want to show the name of the student
when you select some item, instead of using the students array list, you can use another
way. Let's delete this line of code and let's create a new toast message. For the text.
This time I'm going to say students spinner dot let's say get selected item. You can see
that this method is going to return an object, let's say get selected item after that we
can see.to string. This to a string is just another level of conversion in order to convert
the object that has been returned to a string. After that, let's say plus selected once again
before running the application. Let's review what we have done. First of all we have created
this string array after that we have passed it to our spinner statically and after that
inside our Java five, we have created this set on item selected listener. Inside the
on item selected method, we have created this toast message. And we are getting the value
of every item by using a student's spinner dot get selected item method. Let's run the
application. And let's see if you have the same behavior. You can see that we have some
data in our spinner. If I select breath for example, you can see the toast message Brad
selected. It seems like our spinner is working fine. So far, we have talked about different
layout files, for example, this activity main dot XML, which is a layout file. In the next
video, we are going to talk about other kinds of XML files, for example, this strings that
XML or this Android manifest dot XML. Also, we have other kinds of XML files. In the next
video, we are going to talk about them. Okay, see you in the next video. So far, we have talked about different layout
funds in our application placed inside this Resources folder inside the layout folder.
For example, we have talked about this activity main dot XML file, in which we have defined
the looks of our layout file for our main activity. But in Android, there are a lot
of other XML files. For example, at the end of the previous video, we have take a look
at the strings dot XML file. Let's close these days. Let's talk a bit about that strings
dot XML file. As I said, it's placed inside this Resources folder inside the values folder,
you can see these strings that XML file. If you remember, I said that this is the place
that you will put all of the static strings of your application. Let's quickly see what
I mean by that. So for example, inside my layout file, if I define a TextView, we have
a TextView. In here, let's give it an ID. Let's say txt Hello, let's go to our Java
file. And let's initialize this TextView. Let's say private TextView. Let's name it.
txt Hello. And then in here inside the onCreate, let's curricular initialize this TextView.
Let's see what would happen if we set the text of this text a fellow manually. For example,
in here, if we say txt Hello dot set text. And if we pass Hello, you can see that we
are getting some highlights in here. And the highlight says that this string cannot be
translated use Android resources instead. If you want, you can have some more information
about this warning, as the suggestion says, you can press Ctrl plus f1. And you can see
a whole dialogue about this morning. Basically, this in here means that this text is going
to be the same in all of the languages. For example, if you have an application that has
some users around the world, this text is going to be the same in all of the devices
regardless of the user's language. As the warning says you can define this text inside
your strings dot XML file. Let's go to see how we can use this strings dot XML file in
order to localize our application. So in here, I'm going to define another string, the way
to do that is to open a tag and say a string. After that, we need to name our string. For
example, in here, I'm going to simply say hello. And for the value of this string, I'm
going to say hello. Now I can pass this string to my text view inside my java file. Instead
of hard coding this text, I can say get a string. This get a string method like this
find view by ID is an inner method inside every activity, we can use that because we
are extending this app compat activity. So inside these practices, we can address our
string file. For example, I can say R dot string, dot let's say hello, right now the
result is going to be exactly as before. For example, we are just going to show hello to
the user. But the option that we have in here is to create another strings dot XML file
inside our values folder. For example, in here, I can right click on my values folder.
I can say new value resource file. I need to name this new XML file exactly strings,
let's say strings. The name is important in here it should be exactly the same. And in
here you have a few options. We will talk about few of them in here. But the one that
we are We're interested in here is this locale. Let's select that. And let's add it to this
chosen qualifiers. So basically this locale is going to be useful for when you want to
expose your application to different languages. For example, if you know that you have some
users from Germany, you can translate your application this way for those users as well.
Let's quickly see that if we can see Germany here, you can see that we have this the German D
stands for Deutsche in the right hand side, we can select a specific region, we know that
there are multiple countries that spoke German, let's select Germany. And let's press OK.
If you take a look at your values folder, you can see that now you have these strings
folder in which inside that you have two strings dot XML file, the names are exactly the same,
but the second one is for the German language users. Right now, this strings dot XML file
for German users is empty. If you want, you can define some strings in here. For example,
I'm going to define my Hello text in here as well. Let's see a string. Let's name it
Hello. It's very important that this name would be exactly the same name that you have
passed inside the other strings dot XML file. If you remember in here, we have this string
called Hello, we are going to name it in here hello as well. Now let's pass on value for
this string. For example, the German translation of Hello is Hello, I believe. So inside this
strings dot XML file for the German users, we have a string called Hello. But the value
in here is different from the one that we had inside the default strings dot XML. Now
that we have created two strings, that XML file, because inside our main activity, we
are using this get string method and we are addressing our Hello. If some German language
user uses our application, the value of this TextView will be different in different languages.
Let's quickly run our application. And let's see the difference. Right now the language
of this device is English. And because of that, we are seeing this Hello text. But if
we change the language of this device to let's say German, we should see how though, let's
close this application, and let's quickly change the language of this device. And let's
see if we can see the difference. So we can go to the settings. down in here inside the
systems, I believe, or system, language and input. Let's go to languages. And let's add
another language. Let's search for German, or its equivalent storage, we need to select
a region let's select Deutschland. And also, we need to make the storage as the default
language of this phone. So let's move this to above this English. And now you can see
that the language of this phone has changed to Deutsch. If we run our application, once
again, we should see the difference. This time, you can see that we are seeing hollow
instead of Hello. Without changing a line of code, we now have an application that looks
different in different languages. So these are the strings dot XML file is extremely
useful for localization purposes. If you want, you can add another string file. For example,
once again, on our values folder, we can right click, we can say new value resource point.
Once again, we can name it strings. And once again, we can select this locale. And if you
want, you can select another language and you can do the same process. After creating
your application, if you want to translate your application for another language, you
can pass this strings dot XML file to maybe a translator and ask him or her to change
some of the values for your string files. As simple as that you can localize your application
for different languages, you can see that we also have an error in here this URL is
not important. Basically, it says that you do not have an equivalent string for this
app name. You can also change the app name in different languages as well. But we are
not going to do that in this application. Okay, let's close all of these. And let's
talk about another kind of XML file in Android applications. The other XML file that I'm
going to talk about is this colors dot XML file. Once again, it's placed inside this
values folder. Let's take a look at that. You See, that's right now we have three colors
in here. Like strings, this is going to be the place that we pass all of our static colors.
If we want, we can define another color in here for that we can come between these resources
tag. And we can say color. We can name our color. For example, let's say blue. And for
the value, we need to pass a hexadecimal value, we can get that value by searching for HTML
color picker. Let's quickly do that. For example, in here, if we want a blue color,
a lighter blue, maybe we can copy the hexadecimal value from here and we can paste it in our
project. We can see that at the left painting here we have this blue color. Now that we
have this blue color, we can use it in different places of our application. For example, inside
our activity main dot XML file. When we have defined this TextView, we can change its color.
We can say color or to Riverside's text color, and we can address our color. For example,
I can say add color slash blue. This add color is referencing our colors that XML file this
morning, here, you can see that the color of our text has been changed to this light
blue. Instead of searching for different colors on the internet, you can also define them
another way. For example, you can copy this color accent color. Let's copy that. Let's
paste it in here. And let's define avoid color. But for the value of this white color, I can
click on this a square. And I can select a void color. For example, let's select this
white. And as you can see, now we have a white color without searching the internet. We can
get the hexadecimal values for different colors. Okay, there is not much more to these colors
that XML file, I just wanted to show you how you can define new colors. Let's talk about
the other XML file in Android applications, which is this styles dot XML. But before that,
let's close these two. And let's open this styles dot XML. Once again, it lives inside
our values folder. So basically, this styles dot XML file is the place that we define the
theme of our application. Right now we have one style in here. Later on, we will see that
where we have used this, the name of this style is app theme. But if we want we can
override this for example, we can change the value of some of these colors if we want.
Or we can change other attributes. You can also define multiple styles. For example,
let's copy this whole style. And let's paste it down in here. We need to name our style
differently. For example, let's say customized app team. And let's override the previous style. For
example, we have this parent attribute in here, which you can guess it's implementing
all of the features of this exact theme in here. If you want, first of all, you can change
this parent. For example, let's take a look at the other ones. Let's say light.we have
these no action bar in which we are going to use in future videos, we have these dialogues,
I'm not going to change the parent in here instead, if you want, you can change some
of the values of this color. So in different parts of our application, we may use this
color primary for different texts. The value of this color primary is right now, this value
in here add color slash color primary. If you want, you can change that, for example,
you can say blue the color that we just created. You can see that now the color primary in
these two styles is different. For the first one is this dark green for the second one
is this light blue. Now that you have defined this customized app theme slide you can pass
it to let's say different activities in your application. It means that different activities
in your application different pages in your application can have different styles. For
example, one of them may have some toolbar, some of them may not have that toolbar if
you use another parent. Later on we will see that how we can do that. Also we will talk
about activities later on in the course Don't worry about activities if you don't understand
them yet. So this styles dot XML file is the place that you define different styles for
your application. We will be coming back to this styles dot XML file later on. In the
course, specifically when we talk about material design, but for now let's move on from this
part, I believe you grasp the general idea. The other XML file that I'm going to talk
about is this manifest file, this Android manifest dot XML file. I believe this is the
most important XML file in every Android application. Basically, this is where you define the general
attributes the general features of your application, you can see that we have this manifest tag.
Inside that we have this application tag, we have seen this icon and round icon previously.
Basically, these are helpful for when you want to define different icons for your application.
We also have this label, which is basically the name of your application that is going
to be shown to the user. You also have a general theme for your application, which as you can
see is addressing the style, the app theme style, if you want, you can pass your customized
app theme. It will override all of the activities in your application. But in here, I'm not
going to do that. Right now, inside the application tag, you
have one activity, which is basically our main activity. So basically, every activity
needs to be declared inside the manifest file inside this application tag as well. This
activity in here has been added automatically, because when we have created our application,
we have selected the empty activity template. But if we don't select that template, one
of the things that we need to do is to come inside this manifest file and declare our
activity. Inside this activity tag, you have this intent filter tag, don't worry about
that yet. We will talk about that later on in the course, I believe in the broadcast
receiver section of the course. But probably you can guess the user of this intent filter
from this launcher and main, it means that this main activity is the launcher activity
when we run our application. Don't worry about all of these yet. These are just some basic
properties, some basic features of our application. So beside activities, you need to define three
other elements in the manifest file as well. So in every Android application, we have four
main components, activities, content providers, broadcast receivers, and services. We will
talk about all of them later on in the course. But these are the four main components of
every Android application, all of them needs to be declared inside the manifest file. So
as you can see, this manifest file is very important. It contains all of the important
features of your application, we will be coming back to this manifest file a lot during the
course. So don't worry if you don't understand all of these new stuff that we are seeing
in here. Okay, the next XML file that I'm going to talk about is menus, let's quickly
see them as well. So in your project pane inside the Resources folder, you can create
another directory for different menus. By default, you do not have that directory like
we did have four different values and layout files, we need to create that directory, we
can right click on our resource folder, we can say new directory, it's very important
to name this directory menu. And after that, you can see that we have this menu folder
in here. You can right click on that, and you can say new menu resource file. This way,
you can create a menu dot XML file. For example, let's name this menu file main menu. Let's
create this file. And let's see what does it look like. Let's switch to text view. In
here you can see that we have this menu attack. Basically menus are useful for when you want
to create some sort of menu in your application. And the way to do that is to come inside this
menu tag and create different items I can say item you can define multiple attributes
for your item but the one that is mandatory and you have to create that is this title.
You can say Android column title, and you can pass a title for your menu. For example,
we can say settings in here. You can see that some menu has been created in here. later
on. We will pass this menu to for example, our main activity to have some sort of menu
in our main activity. The other attributes that I have in here is ID for example, I can
say Settings menu. We also can have an icon for our menu item. But I believe we do not
have any icon in our project yet before by An icon let's quickly create some icons in
our driver folder, we have seen how we can create different icons, we can right click
on our driver folder by saying new image asset, we can create icons. In the icon type, I'm
going to say action bar and tap icons. For example, inside this clip art, let's search
for settings icon. You can see that we have one icon in here, let's add that. Let's change
the name to IC settings. And let's change the color to black. Let's add another icon
in our driver folder. Mirror Image asset like before. Let's name this one icy alarm. Let's search for alar. Color is fine, let's
just create this icon. Now that we have these two icons, we can pass them in our menu file.
For example, in this item, I can say icon. Let's pass our settings icon icy settings.
Right now we cannot see the icon of the setting in here. But if you want to see that you can
define another attribute that's called show as action. So we have some values for this
show as action attributes. If you say always, it means that we always want our menu items
in the toolbar, you can see that we have other options. For example, we have this if row,
it means that place them in the toolbar if there is room for this menu item. We have
also this never it means that always show the menu items like this and never show them
in the toolbar. Let's change the value for now to always. And let's create another item
in here. So I can say item like before the title is mandatory. And also we are getting
a warning for the previous items title. Once again, it says that you need to define the
title in your strings dot XML file. Like before, this is for the localization purposes. And
the best practice is to create this settings title in your strings dot XML file. In your
real world applications, make sure to do that. But in here for the sake of simplicity, I'm
not going to do that I'm going to cope with this warning. So let's pass a title in here.
I'm going to say alarm. Let's give you time Id let's say alarm menu. After that, let's
give you an icon. Let's say icy alarm. Let's set the show as action attribute for this
one to e4. You can create as many items as you want. But I think for this simple menu
item, these two would be fine. Okay, now that we have created this menu file, let's see
how we can pass these two for example, our main activity. Let's close this file. Once
again, it was placed inside our Resources folder inside the menu directory that we just
created. In order to show this menu in your main activity, you need to open the main activity
dot java file. And you need to override another method in here. So because we are extending
the app compat activity inside this main activity, we have some methods that we can override
one of these methods is this onCreate method. If you come outside of this onCreate method
and press Ctrl plus or you can see the list of all of the available methods you can see
that there are a lot of them. The one that we need in here is called on create Options
menu. If you type on create Options menu, you can see this method in here let's select
that. And in here we have this method. First of all I'm going to delete this statement
from here this return super.on create Options menu and I'm going to create or inflate my
menu for that I can say menu inflator this class in here. Let's name it inflator is equal
to get menu inflator this gets menu inflator is like this, find view by ID method. It's
an inner class in every activity. So basically with the help of this inflator, we are going
to inflate or create our menu after accessing to our inflator we can say inflator dot inflate.
For this inflate method. First of all we need to address the menu font that we just created.
For that we can see our that menu that main menu, the menu that we just created. The second
argument is the menu that He's being passed to this method. That's fast that you can see
that the return type of this method is a Boolean. This Boolean is indicating that if we have
successfully inflated our menu, by this point, we have inflated our menu and after that we
can return through. This is all of the logic that we need in order to inflate or create
our menu in our main activity. Let's run the application. And let's see if we can see our
menu in our application. You can see that in our activity, we have
these two items, this settings icon and this alarm icon. We can also set an onclicklistener
for each one of these menu items. Let's quickly see how we can do that. So we need to override
another method outside of this onCreate Options menu method. If we press Ctrl plus Oh, and
if we search for on options item selected, this method in here if we select that, we
can override that this time, I'm going to keep this super statement we will talk about
I'm going to keep that. As you can see as the input of this method, we are getting a
menu item. This is the item that user is going to click on. And we can use it. For example,
to create a switch statement. Let's create our switch statement. So our switch statement
is going to work on the item dot get item ID. If you remember in our menu file for different
menu items, we have set different IDs. Let's quickly see that in our main menu dot XML
file, we have set ID for each one of these items. And in here, we are going to act upon
those IDs. Let's create our switch statement. Let's say in case it's our.id. That settings
menu, we are going to show a toast message, let's say toast. For the text let's see settings
clicked or settings selected. After showing the toast message in here, instead of adding
a break for distribution statement for this specific case, we can return something. Once
again you can see that the return type of this method is a Boolean as well. This Boolean
indicates that if we have acted according to this item successfully or not. In here,
after showing the toast message we are going to return true. So let's say return true.
And let's create other cases. For example, in case it's our that Id does alarm menu.
Once again, we are going to show another toast message. Let's say alarm selected. In Here
I'm showing a toast message. But in a real world application, you may want to navigate
the user to some other part of your application. But more on that later on when we know about
different activities and fragment. Okay, after showing the toast message, let's return through
once again. And also let's create the default case. In the default case, I am going to return
this super statement. Because I'm not interested in other items besides these two. So do whatever
you're doing inside the parent class. So basically, I can call this super segment from here, I
can return it in the default case. Before we run our application. Let's review what
we are doing in here. As the input of this on options item selected method we are getting
a menu item, we can use this item ID in order to create a switch statement. In case the
ID is the ID of our settings menu item, we are showing this source message setting selected.
In case it's alarm menu item ID we are showing another toast message. But in the default
case in case if it's another item beside these two, we are passing the job to the parent
class. Let's run the application and let's see if we have set the listener successfully.
So for example, if we click on this settings icon, you can see that settings selected.
If we click on this alarm, we can see alarm selected. It seems like you have done a good
job inside this on options item selected method. Okay, I think that's enough for this video.
In the next video we are going to continue our talk about other kinds of XML files available
in Android. See you in the next video. Let's continue our talk about different XML
files in Android. In previous videos we take a look at different XML files for example
drawable for its layout files, some files inside our mipmap folder. We have seen a strange
and colors and styles. Beside these, we take a look at menus and also our manifest file.
Let's see what else do we have in here. Right now our main activity has only one layout
file this activity main dot XML. But if you want, you can create more layout files for
this activity. For example, right now, this layout is for the portrait mode, if you want,
you can create another layout file for the let's say landscape mode. If you don't know
what the portrait and landscape modes are, let me quickly show that. So right now, this
is called the portrait mode. If we change the rotation of our device, and this is going
to be the landscape, I think I need to activate the rotation of this device. Let's go to the
certification center. And from here, I believe this is the option, this auto rotate, we need
to activate that. And now if we rotate our device, you can see that now we have a different
look for our application. Sometimes this might work. But if you have a complex lab file that
you want to show it differently in different rotations, you need to create two separate
files for each one of these rotations, one for the portrait mode and one for the landscape
mode. Let's quickly see that how we can create another layout file for this main activity.
So inside my layout folder, on the layout folder, I can right click by selecting new
layout resource file, I can create a layout file, or alternatively, inside this activity
main dot XML file. From here, if you click on this icon, you can see that we have this
portrait selected right now, if you want, you can create a landscape variation for the
layout of your main activity. But before I do that, I'm going to add another text. And
also I'm going to add some constraints to this layout file. So I'm going to move this
new TextView to below my level text. Let's quickly add some constraints. As I mentioned
before, if your items are too close to each other, you can always select both elements.
And you can use the right click menu by going to constraint and add constraint from here,
too. But I'm not going to do that. Instead, I'm going to add some margins of let's say
500. So for the simple application, this is going to be the look of my application in
the portrait view, go to text views are placed after each other vertically. But in the landscape
mode, I'm going to put the two text beside each other, let's quickly create a variation
for our landscape mode. By selecting this create landscape variation, you can see that
inside our layout file, now we have to find inside the activity main folder, we have this
activity main dot XML, which is for the portrait mode, and the other one, which is for the
landscape mode. And now if we want we can change this landscape for example, I'm going
to change the constraint of this TextView. Let's delete all of the previous constraints.
I'm also going to delete the constraint of this TextView the left constraint. Let's place
this fun in here, and let's add some constraint. Also, another point in here that you may find
useful is that if you want to center your elements, for example, horizontally, you can
select the two items, for example, these two by right clicking on the item, and by going
to this center, and selecting horizontally, you can center your items horizontally. So
once again, this is the view for the landscape mode, the layout for the landscape mode, and
this is going to be the layer for the portrait mode. Now if I run my application, I should
see the difference. You can see that in the landscape mode, the two texts are beside each
other. But if you change the rotation to portrait mode, the two texts are vertically after each
other. So this way, by coming to this icon in here and selecting create landscape variation,
you can create another layout file for your main activity. But this is not the only option.
You can also create a nice version in case if you want to activate a nice theme for your
application. I'm not going to do that. Let's quickly see how we can create that. So in
here, I can go to this create other and from here I have all sorts of options. For example,
if we want to create a night mode for our activity, we can select this night mode, we
can pass it to this qualifiers. And for the night mode. That's a night. Let's create this
fun. And let's take a look at our project thing. Now inside this activity main folder
you can see that we have three activity main dot XML files, the middle one is for the night
view. If you want, you can change that, for example, you can change some colors, but I'm
not going to do that in here. I'm just going to ignore this layout file for the night view.
Let's see what other layouts we can create for our activity. So once again, I can go
to this icon in here by saying create other you can see that we have all sorts of options.
For example, In here, we have this version, in which we can create different layers for
IDs for different versions of the Android on the user's device. Let's add this to this
chosen qualifiers. And in here, we can put a number. For example, if we want our application
to look different in API level 21, we can put 21 in here, and we can create the layout
file. Let's take a look at our layout folder inside activity main folder. Now we have this
activity main dot XML, which is a specific for the version 21 of the API. This way, you
can also create other layout files, and you can change them if you want. Before I finish
off this video, I'm going to talk about another point of XML files in Android. let's right
click on our layout file, and let's select new layout resource file. And let's see what
an include is. So for the file name of this XML file, I'm going to say trademark. And
also I'm going to change the root element to let's say, relative layout. Let's select
Okay, and let's switch to TextView. Inside this TextView, you can see that we have this
relative layout. So basically you use include whenever you want to reuse some layout file,
for example, now I have created this trademark dot XML file in which I'm going to put an
image view and a text view inside that after creating this layout file, I can reuse this
trademark dot XML in order to show this trademark in multiple activities of my application.
So the use of include tag is to reuse your layout files. First of all, let's design this
trademark dot XML. In here, I'm going to say TextView. Or before that let's define an image
view, let's say 15. dp for the width and height.
Let's give it an ID. And for the placeholder, I'm not going to
import any image into my project. Instead, I'm going to use this IC launcher background
which exists in our driver folder. Let's also define a TextView. In here, wrap content and
wrap content for the text. I'm going to say developed by me Sam. After that, let's move
this TextView to the right of our image view, let's say to the right of logo. Let's add
some margin left, maybe 10 dP, let's style this text a little bit. Let's say italic,
and forked. Let's also change the size of this TextView. Right now the width and height
of this relative layout, this whole parent is match parent in here, I'm going to change
that I'm going to change both of these to wrap content, you will see why when we use
this layout fine. And also I'm going to add another attribute for both of these elements.
Let's center them vertically, center vertical for both of them, let's say through between
place them at the center vertically. So this is our simple layout file. In here we are
showing a TextView and also an image view. If we want to show this layout file in multiple
places in our application, we can use the include tag include tag is very useful for
when you have a complex layout file, and you don't want to write the exact same file twice.
Let's switch to our activity main dot XML file. And let's see how we can use that trademark.
So down here after the TextView, I'm going to say include, and I can add a layout attribute.
And I need to pass the address of my layout file. In this case, it's at layer slash trade.
As simple as that we can include another XML file inside this layout file. If you want,
we can also constraint this layout file, you can see that I can select this whole layout
file. But right now if I try to constraint my layout file, you can see that it won't
work, we can see that it will be placed once again at the top of my screen. And that's
because we need to override the width and height of this layout, right. The way to do
that is to compensate this include tag. And in here for my whole layout file, I need to
define my layout width and height once again. So for example for the layout, which I'm going
to say wrap content for the height as well, I'm going to say wrap content This way, you
can see that now we can constraint our layout file, we just need to override the width and
height of our layout file. Let's also add two more constraints. I can use this trademark
dot XML file as many times as I want in different parts of my application that can be useful
sometimes also where you're using include tag, you may want another tag. Let's quickly
see that. So instead of this relative layout, sometimes you may see merge this tagging here.
So basically what this merge is doing is that it's avoiding redundancy. Let's talk about
what I mean by that. So right now these two elements have no idea about about their parents,
they do not know where they are going to be used inside relative layout, a linear layout
or a constraint layout. For that reason, because they don't know about the parent, you can
see that our layout does not look very beautiful in here. But if you know for sure that where
you're going to use this layout file, for example, if you are going to use this layout
file inside a linear layout, you do not need to write the linear layout. Once again, you
can use this merge tag in order to avoid redundancy. At the time of rendering your layout file,
this merge tag will be ignored. And these two elements will be placed inside the parent
that they are going to be used. Sometimes when you know for sure, that's where you're
going to use your layout file using this merge tag can improve the performance when rendering
your layout. But in here, I'm just going to change this to a relative layout. Okay, I
think that's enough talking about different XML files in Android, we have others as well,
we will take a look at them later on in the course. But for now, I think it's enough.
In the next video, we are going to talk about the material design library, see you in the
next video. In creating Android applications, designing
is an important aspect. And creating a beautiful layout will impact the number of downloads
for your application on the Play Store. And also it will impact the user's feedback. But
sometimes designing can be challenging, especially if you're like me if you are more interested
in the code side of the application. But luckily, we have material design as a guideline for
our designing. Despite being a guideline Material Design also introduces some new components
that we can use in our application. Let's check the material design website. And let's
see how we can use that in our project. The website for material design is material that if you go to this Developer tab in here, you
can see that besides Android applications, you can also use material design for iOS app
development, you can use it for web development, and also you can use it with hybrid development
with flutter. Let's go to the Android page. As I said, Material Design consists of two
things. First of all, it's a guideline for designing your applications. Also, besides
being a guideline, you have some components that you can use in your application, we will
take a look at those components in a minute. But before that, if you take a look at this
theming in here, for example, if you want to check the guidelines for typography theming,
you can click on this link. And after that, if you take a look at this material design
guideline for typography, you will see some guidelines. Basically these guidelines are
helpful for when you want to design and create a beautiful application. Basically, these
are some to do's and not to do's in order to follow when you are designing different
applications. So make sure to check this webpage and the guidelines. In here we are not going
to talk about guidelines. Instead we are going to take a look at the components. If you go
to this components link, you will see that we have a lot of components. We are familiar
with some of these components. For example, we have seen different buttons and checkboxes.
But some of them are new. Don't worry about that later on. We will see a lot of these
in the course. But let's take a look at a few components that we already know. For example,
let's take these buttons. Then in here in this image, you can see that we have four
different kinds of material buttons. These are somehow different from the buttons that
we have used already in our applications. Basically, the main difference is in the styling
of different buttons. Similar for button we have all sorts of other components. For example,
we have checkboxes for some of these components. We have also some documentation and guidelines
for designing them. For example, if you want to check the guidelines for designing a checkbox,
you can click on that link. And in here, you can see some guidelines. So make sure to check
that if you need but let's see how we can use these components in our applications.
Before that, I'm just going to say that in this video, we are not going to vote with
all of these components. During the course we will be coming back to this web page and
a lot of these components. But for now first of all, we are going to start with material
buttons. We will also take a look at the floating action button. This one in here. We will also
take a look at the material cart and things like a snack bars. Later on in the course
we will take a look at the top app bars, bottom up bars, and also things like tab layouts
and a lot more. Okay, instead of talking let's implement these maffeo buttons in our application.
In order to use material design components in your application, you need to add a dependency
in your application. We haven't used any extra dependencies in our applications yet, but
Let's see how we can do that. If you remember I said that Gradle will combine all of the
layout files, all of the Java files all of the static resources in our application. And
besides all of those Gradle will also use the third party libraries that we use in our
application. One of those libraries that we are going to use in here and later on Gradle
is going to handle combining it in our application is this material design. So we need to add
this material design library in our project with the help of Gradle. In order to add the
material design library, you can go to this Developer tab. After that, you can select
this Android. And inside this documentation, you can go to this getting started. And from
there, you can find the dependency that you need. In this page, you can see a step by
step guide for adding the library, the material design library into your project, make sure
to read this page if you need. But basically what they are saying is that, first of all,
make sure that you are using Google repositories in your project. Let's see where that is in
Android Studio, in Android Studio inside this Gradle script inside this build that Gradle.
This project module, you need to add the Google repository, Google repositories has been added
by default into our project inside this all projects. But if you don't see this Google
in here, make sure to add that the next step after adding the Google repository is to add
Material Design dependency, you can copy this dependency from here, and you can add it to
your project. Let's copy that this time, we need to go to this build that Gradle module
app this one in here. But before that, let's close this one. And let's also minimize all
these extra pains, we need to add that dependency inside these dependencies in here. For example,
you can add that dependency before all the other dependencies. Let's face that in here.
But we also need to change this line because right now we have this version tag in here.
And this is not the version, it's better always check the internet for the latest version
of material design, you can also use the help of Andrew the studio. Right now I'm getting
a highlight. If I hover over this highlight, you can see that the latest version available
is 1.1 point zero. So instead of this version, I'm going to say 1.1 point zero. After adding
this dependency, you need to click on this sync now. And after that Gradle will download
some files to this specific material design library files from the internet. And it will
add the library to your project. So let's click on the sync. Now before that, make sure
that you have an internet connection, it was somehow fast. And now we can use material
design components in our project. Also inside these dependencies, you can see that by default,
we have other dependencies as well. For example, we have this constraint layout, we have these
dependencies for testing. And also we have these app compat dependencies which help backward
compatibility, but more on them later on. Okay, now that we have added this material
dependency, let's see how we can use them. But before using them, I'm going to add a
button in my layout file. Let's quickly see that. Let's also enable this preview. And
before everything, let's delete this TextView. So in here, I'm going to save button, let's
say wrap content and wrap content. And let's define a text, let's say Say hello. Let's also change this
constraint layout to a relative layout. And let's center our button. You can see that
we are seeing the previous slide for our button. Now let's implement material theme. And let's
see how that changes the size of our button. So for that, I'm going to open my project
pane. If you remember inside the Resources folder inside the values folder, we have these
slides that XML. Let's open that right now we have this app theme style in which its
parent is this theme that we are seeing in here. If we want to implement Matthew, your
theme, we can change this parent. Let's quickly do that. And the theme in here is going to
be themed material components. We also have another theme called theme dot material components
that light this one in here video, we'll take a look at that in a minute. But in here, I'm
not going to customize this theme that material components. So for that, I'm going to delete
all these three items. I'm going to use all of the values from inside these material components
theme, so let's delete them. We just change the past theme of this afternoon. But right
now if we switch to our activity main dot XML file, you can see that we are getting
this dark theme somehow we also change the style of our button. This is good for a night
theme. But in here I'm going to change the parents theme to a light theme so that we
can see better. So let's select this lighting here. And if we switch back to our activity
main dot XML file, you can see that we are seeing this beautiful light theme out button
is now installed, we have some round corners, the font is somehow different. And also the
spacing between the letters is different. We didn't change anything for our button elements.
But because we are using the material theme as the parent theme of our application, all
of these styles have been applied automatically. We can also customize this button for example,
we can change the background color of this button. But before that, let's quickly add
a color to our color resources. Inside colors that XML I'm going to add a new color, let's
copy this font. Let's face it, and let's change the name to let's say orange. For the value,
I'm going to select this orange color. Now in our activity main dot XML file, if we want
to change the background color of this button to the orange, we can say background tint
this morning here, and we can address our orange color. We can also change the text
color of this button. But I don't think that's necessary, I just wanted to show you that
you can customize your buttons. Let's delete this color. As you saw on the material design
website, we have some styles for our button. Let's see other slides as well. For example,
in here I can see a style. Let's search for material button, you can see that we have
this on elevated button style. Let's quickly see that this is basically this style that
we are currently using. It's the default case. Let's remove that. And let's see others, we
have this button style, we have this outline button. If you take a look at that, you can
see that the style of your button is changed to some outline button. Sometimes this might
be useful. We also have a text button, let's quickly see that. This is the one material
components Start button the text button, this will change our button to a text button. Sometimes
you may want to use this, I'm going to stay with the default case. So I'm going to delete
this whole state attribute. So you can see that using material design is very easy. Basically,
we just added the material dependency into our project inside this, like build that Gradle
module app. After that inside the slides, we change the parent to this team, that material
components team. And after that we can use all of the elements from inside the material
design library. If you add another element into your layout file, for example, a checkbox
By default, the checkbox from the material design library will be used. Okay, let's move
on from this part. And let's talk about some of the components that we don't have in our
applications. If we don't use the material design library, the first of those components
that I'm going to talk about in here is called floating action button. Let's delete this
button. And let's see that floating action button. So in here I can say floating action
button, we can see that we have two option, we have this floating action button and we
have this extended floating action button. Let's use the first one for the width and
height I'm going to say wrap content. And as soon as I do that, you can see that we
have this beautiful button in here, this floating action button is going to be floating on our
layout file. Even if for example, we scroll the page, if you want, you can change the
location of this button for example, you can move it to down below in here. For that I
can use two attributes that we haven't seen so far. For example, I can see a line parent
button and we can set it to true, we can see that as soon as I do that its location will
be changed to the bottom of our screen, we can also use another attribute called align
parent. And in order to move it to the right of our screen, let's say through and now you
can see the difference. Let's also add some margins. Let's say margin. In here, we have
two options, we can add this margin right. Or alternatively, we can use this version.
And if I use this module right in here, I will get a warning. Let's quickly use that.
And let's see the warning. For example. In here, I'm going to say 20 dP, you can see
the highlighting here. If you take a look at this, it says that it's better to use margin.
And the reason for this is because some of the languages it starts from right. So for
example, if the language of your user is Arabic, in that case, this floating action button
will be placed at the left of the screen. And if you add a margin, right, it's going
to put the floating action button to outside of the screen. For that reason. It's better
to use margin and so let's say margin and, and let's fast 20 dP, you can see that we
are getting the same result in here. We also need to add a margin button. That's a margin
button. And that's first 20 dP. You can also add an icon for your floating action button
as well. Let's quickly add an icon into our driver folder and let's add it for our floating
action button. Let's say new image assets on our driver folder. Let's select action
bar and tab icons. And let's select a plus sign in here. Let's search for add. And let's
add this one. For the name, let's say ICF. And also, let's change the color. I'm not
sure that if this is a white color for that, I'm going to use this custom color. And I'm
going to use white. Right now the selector is on white. So let's say choose, and let's
create our icon. And now you can add the icon for your floating action button. But for some
reason, I cannot use the source attribute, which is the attribute to pass an icon for
your floating action button. I think because I added this dependency in my project, I need
to restart my Android Studio, or the other option is to rebuild my project. Or the better
option is to go to this file, and invalidate your cache and restart Android Studio. Let's select that, let's see, invalidate and
restart. Now that I have invalidated my cache, I can use the source attribute. So inside
this floating action button tag, I can say source, this 100 source, and I can pass my
ice icon, you can see that as soon as I do that, this icon will be added to my floating
action button. If you want, you can also change the color of this floating action button.
For example, let's change it to the orange color that we have defined a few minutes ago.
For that I can say background tint this one here, and I can pass color orange, you can
see that the color will be changed to orange. Also, you can see that we have some sort of
border for this floating action button. If you want, you can also change that. The way
to do that is like this, you can say app column, background tint. And this way, you can pass
your new collar for example, if you want to pass avoid color. First of all, you can create
that color inside your collar resources. And after that pass that or alternatively, you
can pass the hexadecimal value of that color directly in here. For example, I know that
hashtag FFF is for the void color. So if I pass that, you can see that we have a void
color in here. And also you can see that the border of this floating action button is now
white. So this Android column background tint is for the background color of your floating
action button. But this app column background tint is for the border of your floating action
button. You can also define another color anything. Let's quickly see that you can see
rebuild color this one in here, app column repo color, and pass a color. For example,
once again, I'm going to pass void. This repo color is the color of the floating action
button when you click on it, let's run this application. And let's see that you can see
that we have this beautiful floating action button at the bottom of our screen. And if
we click on that, you can see some color. That white color is this rainbow color. Beside
that you may also have noticed that the color of this top bar has changed as well. This
is because we are using material components theme in our application. Later on, we will
see that we have a beautiful toolbar when we work with material design. We will implement
that toolbar in our applications later on. But for now let's talk more about this floating
action button. You can also set an onclicklistener for this button if you want as well. But for
that we need to have access to this floating action button inside our main activity dot
java file. So for example, like before, I can say private floating action button, this
one that comes from material, that floating action button package. Let's name it FA B.
After that we need to instantiate it inside our on create method. Let's say FA v is equal
to find view by ID. But before that, we need to give an ID to our floating action button.
I don't think we did that in here. Let's say ID, let's just name it FA B, let's say our.id
dot FAA. After that you can say fab dot set onclicklistener is fine in here. And we can
pass our listener. For example, let's try a toast message. Let's say fab clicked. Let's
run the application. And let's see if we see the toast message. You can see that you're
seeing that toast message it seems to be perfect. There are also other ways of using this floating
action buttons for example, one way is to use a combination of floating action button
and app bar navigation. In that case, we will see that we can implement a beautiful style
and a beautiful design for our application. But more on that later on when we talk about
bottom apart navigations Okay, I think that's enough for this video. In the next video we
will talk about two more components in material design library. We will talk about snack bars
and also card views. See you in the next video. In this video, we are going to talk about
two more material components. The first of those components is snack bar. Before we start
implementing the snack bar, let's see what does it look like. So if you go to material
that i o in these components, in this listening here, you can see a snack bar. Let's see that.
This is what a snack bar looks like. It's a lot like a toast message. But the style
is a little bit different. And also inside the snack bar, you can have a button that
will do some action. Beside that you can make your snack bars to be indefinite, it means
that they won't be dismissed until the user clicks on this action. Also, you can style
your snack bar as well. For example, you can change the color of this text and also the
color of this action button. As we will see later on in the course snack bars are extremely
useful when you're developing Android applications. In order to use the snack bars. First of all,
you need to add the material design library into your project. So let's go to this Developer
tab. In this Android section, let's go to the documentation getting started. Let's copy
the dependency. In our project inside the Gradle scripts build that Gradle. Let's quickly
add that dependency. For the version, if you hover over this, you will see the latest version,
which is 1.1 point or after adding the material dependency. First of all in my layout file,
I'm going to do some changes, I'm going to add a button. And also beside that I'm going
to give an ID to my parent layout, both First of all, you may have noticed some changes
in the looks of Android Studio compared to the previous video. That's because I have
updated my Android Studio. And we have slight differences. Don't worry about that we will
talk about these differences in the next video. For this video, let's just implement our snack
bar. The first difference inside this new Android Studio is that you no longer can see
the text and design mode in here. And if you want to go to your text, you can go to this
split view in here. Once again, we will talk about these differences. Let's give an ID
to our constraint layout. Let's say ID, I'm going to name it parent. Later on in this
video, we will see that why I'm giving an ID to this constraint layout. Let's also go
back to our design view. And let's add a button. Before that let's delete this text here. Let's
quickly constraint it. And also Let's change its text. I'm going to change it to show snack
bar. Let's also quickly changed the theme of my application so that we can see the material
button. In our project like we saw in the previous video in our values folder inside
the styles folder. I'm just going to change the panel theme here. I'm going to change
it to this team that material components stuff light. If you switch back to your layout file,
now you can see that we are using the material buttons in my java file. First of all, I'm
going to initialize this parent this constraint layout and also this button. Let's quickly
do that, let's say private constraint layout. Let's name it parent. And also private button.
Let's name it btn. Show sniper. Down here inside the onCreate method. Let's initialize
these two parent is equal to find view by ID r.id. That parent potential snack bar is
equal to find view by ID r.id. That I believe its ID was button after that set onclicklistener
for this button. Let's say btn show snack bar dot set onclicklistener new onclicklistener
I'm going to hand the job to another method. So let's say show snack bar. Let's quickly
create this method down here. Private void show snack bar. We don't need any input. And here is how you can show snack what you
can say snack bar dots make without instantiating a new snack bar you can use this static make
method in order to create your snack bar. This make method needs three inputs. First
of all we need to pass the parent layout the layout that we are going to show our snack
bar inside that in this case our parents layout is a constraint layout. And as you saw I have
initialized that constraint layout Here, that's the reason I gave an ID to my constraint layout.
Now in here, I can say parent. After that I need to text that I want to show in my snack
bar. For example, I'm going to say this is a snack bar. The third parameter in here is
a constant that will indicate the time that you want to show your a snack bar. And you
can pass that constant like this, you can say, a snack bar, that you have three constants
in here, this length long, net short, and also left indefinite. The long and short are
descriptive, but if you personally have indefinite, you will show your snack bar indefinitely,
and it won't be dismissed until the user clicks on that action button. Let's select this one
for now. indefinite after this make method, you can call dot show method in order to show
your snack bar. This is going to be a really simple snack bar. And we don't have any action
yet. Let's see if it's going to work. If we click on this button, we should see our snack
bar. And here it is. It's a really basic snack bar. And we don't have any action beside that
we haven't changed a slide of our text. Also, because we have past this length, indefinite
there is no way to dismiss this snackbar. Let's quickly change this constant to length
short, and let's see the difference. Now if we show our snack bar, you can see that it
will be dismissed after a few moments. Okay, now let's see how we can add an action to
our snack bar. But first of all, I'm going to change this constant to left indefinite
once again. And before the show method, I'm going to call another method. That method
is called dot set action. First of all, we need a text in here, this is going to be the
text of our action. For example, if you want you can say retry in here. After that you
need an onClick listener that's a new onClick listener. This is going to be an interface.
And inside the onClick method, we can do whatever we want when the user clicks on this retry
text. For example, in this case, I'm just going to show a toast message. Let's say retry
clicked. Let's see if we can see the action. As you can see in here, now we have this retry
option. Remember that the length is still indefinite. But if we click on this retry,
this snack bar will be dismissed. And also we will see a toast message. Let's also see
that how we can change the color of these two texts this retry and also the color of
the message of our snack bar. For that once again before the show method in here, I'm
going to call another method. Let's say that set action text color in order to change the
color of our action text. In here, you can pass your colors in two different ways. First
of all, you can address the color from your color resources, if you remember in your project
inside the Resources folder, inside the values folder, you had these colors, that XML file
in which you have few colors inside that you can address one of these corners inside your
set action text color like this, you can say get color. And after that our dot color dot
for example, color primary. Beside that if you have noticed, we have some colors that
are coming from the material design libraries. You can see that we have these colors as well.
But for example right now, if I use this color primary in here, you can see that we are getting
this warning. And this warning says that you can use this method in API level 23. and higher.
There is also another way to get our color without seeing this error. Let's we can see
that. Let's say get resources. This phone dot let's
say get column. Inside this method, you can address your color, you can say our color,
that for example, color accent. Let's also see the other way. Instead of using the resources
in my project, I can use a Java class. So for example, instead of this whole method
in here, I can say color with a capital C, which is coming from Android dot graphics
dot let's say read. This way we can get red color with the help of this color class. So
if you don't have this red color in your resources, you can also use this class. Okay, now let's
see how we can change the color of the message of our snack. For that I can say that set
text color this method. Once again, in order to pass a color you have two options. In this
case, I'm going to say color dot for example yellow. Let's run the application and let's
see if we have successfully changed the color or not. Let's show our snack bar. You can
see that the color of the message is yellow. And also the color of our action button is
red. Okay, I think that's enough talking about the snack bar. Later on, we will use snack
bars a lot in the course. The next material component that I'm going to talk about is
material court view. Let's quickly see what does it look like in material that I have.
Once again, inside this components tab inside this cart, you can see your cart views. Let's
scroll down and filled with this is what cart view looks like. You can use it to, for example,
show different items in your application, you can mix UI elements in form of a cart.
Beside that you can also have some actions for your cart view. Also, you can have some
coronary radius, and also you can have some shadow or elevation to be precise beside your
current view. In this video, we are not going to implement the actions we will do that later
on in the course. But for now, let's just implement a simple cartoon in our application,
we have added the material design dependencies in our project, so we can add the cart view
without any problem. But before that, let's close this style and colors. In my layout
file in here, I'm going to add my cart view below this button. Let's switch to the split
view. And let's add that down in here, I'm going to define my cart view, let's say material
cart view. This one, beside the material cart view, you also have a native cards view. But
style is a little bit different. If you don't want to use the material card view, you can
always go to developer.android.com and get the dependency from the Android x libraries
for cart view. But in here, let's implement this material cart view. I'm going to enter
my width and height manually. For the bits, I'm going to say 100 dP, I think that's fine.
And for the height, let's say 200 DPI, it has an odd shape, I think it's better to change
the width to 150 dpi. Let's give it an ID. I'm going to say card view. After that inside
this card view, let's enter some elements. But before that, let's quickly concentrate
our call to you. Inside this cart view, first of all, I'm going to define a relative layout.
For the width and height, let's say match parent, the parent is this card view. So we
are going to fit the whole cart view. And inside this relative layout, I'm going to
put my elements for example, I'm going to put a TextView wrap content and wrap content.
Let's also center it horizontally. For its text, let's just say hello. Let's also change
the style of this code, let's say text style. And let's pass both beside that let's increase
the size. Let's say 18. So after that below this TextView, I'm going to define an image
view, you can see that in a cart view, you can have multiple UI elements for the width
of this image, I'm going to save 140 dP. And for the height, let's say match parent, I'm
going to move this image view to below this TextView. So let's say layout below. But before
that I need to give an ID to this TextView. Let's say ID. txt Hello. Let's also add a
margin top and let's center this image view margin top, let's say 10 dP centered horizontal
through. Let's also use a placeholder, let's say source. I'm going to pass this IC luncheon.
Okay, I think that's enough for understanding the cardview. Beside that in their current
view elements, you have other attributes as well. For example, if you want to make the
coordinates of your card view radius, you have this option corner radius, called corner
radius. You can say five dB, for example, right now you may not see the difference.
But if we run our application, we will see the corner radius You can also change the
corner radius if you think that five DB is not enough. The other option that we have
in here is this card elevation in which will give some 3d shape to our card, we have some
shadow behind our cards. Once again, I'm going to say five up, you can also define this card
view like any other UI elements in your Java file. Let's quickly do that private cart view.
In here you can see that we have two options. We have this card view which is coming from
Android x card view. And also we have this material card view which is coming from the
material design libraries. In here we are going to use this material called view but
once again, the difference is only in the style. Let's name it card view. And down in
here inside the onCreate method. Let's initialize it Let's quickly set an onclicklistener
for this cart view, cart view dot set onclicklistener. Beside that, you can see that we have a lot
of options in here. We will talk about them later on in the course, set onclicklistener.
Let's just show a toast message. Let's run the application. And let's see what does our
cart view look like? Our cart view looks like something like this, which is not that good.
But we can do much better with the card views. We will do that later on in the course. Specifically
when we talk about recycler view, the combination of recycler view and card view for its items
will create a really beautiful layout file. We will see that I believe in the next video.
But in here, you can see that we have this corner radius and also we have this elevation
which is this 3d shape for our cart view. Beside that later on in the course, we will
see how we can create an expandable card view. That means that we will have some button in
here for example, an arrow in which by clicking on that view, expand our cart view and we
will see some more information and maybe actions for our item in our cart view. Okay, I think
that's enough for this video. In this video, I just wanted to show you how you can create
a snack bar and also implement this cart view. In the next video, we are going to start talking
about recycler view. In previous videos we have seen list view for showing different
items. But recycler view is a much more better option to show lists of different items. In
the next two or three videos we are going to see how we can use recycler views. See
you in the next video. In this video, we are going to talk about
recycler view, which as I said before is another option for showing a list of different items
in our application. But before that, as you can see, I've updated my Android Studio and
in here we have some changes. Before talking about recycler view, I'm going to show some
of these changes in the newest version of Android Studio, I strongly suggest that you
always keep your Android Studio updated. You can do that by going to this Help menu. down
in here, you can check for different updates. And if there is any updates available, you
can see a list of different options. This in here is Firebase services, we are not going
to use that I'm going to cancel this update, you can see that I've also have some updates
for my emulator and hexam installer. I will update them after this video. But for now,
let's just say remind me later. Also, if you remember from the installation videos, I've
said that always check the updates from a stable channel. If you're not sure about your
channel, you can always go to settings by going to this file tab in here by going to
settings. In here, if you check for updates, you can see that my updates are being checked
from inside the stable channel. We have others as well. These other channels are for preview
purposes. And it's basically for professional developers to check new features in Android
and report some bugs if there is any to the Android team. But for you for the starter,
it's probably best to check your updates from a stable channel. The first thing that is
different in this newest version of Android Studio is the way you go to full screen, you
can go to full screen by going to this view menu. And by going to appearance. From here,
you can go to full screen. In previous versions, this option was somewhere down in here. Let's
go to full screen mode. The other change that you can probably see in here is this component
tree. This type in here is a little bit different. There are not much changes in here just this
time. But there is a very important change above in here. You can see that down in here
we no longer have that design and text view mode. Instead of in here we have three options.
Right now we are inside the design view. We can also select this one to go to the text
view. And in between these two, we have this splitter mode. As you can see, it acts like
if you have enabled preview inside your text view, but there is a difference. Before that
let's quickly minimize this project pane. From here from inside this splitter view,
you can also enable attributes. For example, if I select this button, I can see the text
view of this button I can see the design view of this button and also I can see all of the
attributes in here as well. This is going to be helpful, especially if you're using
multiple monitors. For now I'm just going to minimize this attribute pane. You You can
also change the size of this preview. Besides attributes, you can also enable this palette
from here in which you can see all of different layout elements. And you can drag them directly
into your design view. Once again, this is going to be helpful if
you are using multiple monitors. The other thing that you can see in here is this resource
manager, we had this resource manager in Android Studio 3.5. But there has been some improvements
in this newest version. Basically, inside this resource manager, you can see all of
the static resources inside your project. Previously, if you wanted to see different
rival items inside your project, you could have go to this project training here. And
inside the resource folder, you could have checked your drivers. Now with this resource
manager, you can have access to those drivers more easily. Also, beside that you can see
different colors, you can see different layouts mipmaps, the strings, and also if you click
on these three dots in here, you can see all sorts of resources in your project. Also,
if you want, you can use these resources directly from here. For example, right now, in our
layout file, we have this image view, which its source is this IC launcher background
which exists in our driver folder. If we want to change this to this IC launcher mipmap
file, we can simply drag this IC launcher, and we can paste it in here, you can see that
the source of our image view has now changed. Similarly, we can do the same thing for the
strings. For example, right now in our string resources, we have this app name string, we
can drag that for example, instead of this Hello, we can see that the text has been changed.
Let's undo the changes. So from time to time, this resource manager can be useful. The other
thing that has changed in this newest version of Android Studio is the font of my code.
I actually don't like this font, and I'm going to change it to the previous font that we
had in our Android Studio. For that I can go to this file inside the settings. You can
search for fonts. And in here, you can change the font. For example, I think I'm going to
select this one. Let's press OK. And yes, it is the previous font that we had when we
worked with different layouts, right. Also, besides Android Studio, I've updated my Gradle
tool as well. If you want to check that you can go to your project menu, you can go to
this Gradle script, we have changed two things about the Gradle. First of all, if you take
a look at this Gradle dot rapper properties, you can see that we have the latest version
of Gradle in here. And also besides that, if you go to this build dot Gradle project
module, you can see that we are using the latest Gradle tools version. So beside Android
Studio, I've updated my Gradle as well. Probably you wouldn't see any difference when you update
your Gradle. In most cases, it's going to fix some bugs, and also it may improve some
performance. Once again, my suggestion is to keep everything updated when you're working
with Android Studio. Okay, let's move on from this part. And let's talk about recycler view
in Android Studio. For that, I'm going to close this project. And I'm going to create
a new project. Let's say start a new Android Studio project. Now that we have in here under
the studio has a new update in these templates as well. For example inside this TV, you can
see that we have other options for different operating systems, or for different devices,
some new templates has been added. But we are not going to work with them. Like before
we are going to use this empty activity. Let's name this project recycler view. Or let's
say RecyclerView example. It's interesting that in here, we have this new option in here.
It says use legacy Android dot support that libraries. So basically, before Android x,
we had to use support libraries for having backward compatibility is in older devices.
As you saw in the previous videos, the use of Android X was mandatory. But now in here
we have this new option. I don't think we are going to use this legacy support libraries
in our course but it seems like we now have this option. Okay, let's create our project. And let's see how we can use recycler view.
for that. We have two options. First of all, we can go to our activity main dot XML file.
As you can see, we have this recycler view option in here but before using it, we need
to download its dependency into our project. You can click on this download option in here
and it will be automatically added to our gradle file. Or if you don't want to add it
from here you can always search for recycler view dependencies and add Manually into a
gradle file. Before I add this recycler view, let's quickly open our Gradle scripts build
that Gradle module app. down in here in these dependencies, you can see that we don't have
any recycler view. Let's download this recycler view by clicking on this. You can see a warning
in here. Would you like to add this now, let's say okay, it seems like we have added recycler
view successfully. Let's check out we've got gradle file. And then in here, you can see
the recycler view. But as you can see the highlighting here, this is not the latest
version. For that reason, it's always better to check the internet for the latest RecyclerView
dependencies. The highlighting here says that you have version 1.1 point oh available. So
let's change this one to 1.1 point oh, and let's sync our project. Okay, now that we
have added this RecyclerView dependency, we can add it to our layout file. I'm going to
switch to text view from above in here. And I'm going to minimize this resource manager.
First of all, I'm going to change this constraint layout to a relative layout. After that's
like before, I'm going to delete this TextView. And let's add a recycler view. So you can
see recycler view this option down in here. For the width and height. Let's say match
parent, I'm going to match the whole relative layout. Let's also give you an idea. Let's
say contacts recycler view. As you can guess I'm going to show a list of different contacts
in my recycler view. After that, we can finish creating our recycler view. And if you enable
your preview from inside this split view, you can see that we have these options inside
this recycler view. I'm also going to add some padding to this parent relative layout.
So in here inside the starting tag, let's say padding, and let's say 10 dP. That seems
better. After that, we need to initialize our recycler view in our Java file. So inside
this main activity dot java file. First of all, I'm going to say private recycler view.
This one that comes from Android x dot recycler view v jet. Let's name it contacts recycler
view. And down in here inside the onCreate method, let's initialize it. Contacts, recycler
view is equal to find view by ID dot contact recycler view. When we have worked with ListView,
right after this point, right after initializing our ListView, we could have create an array
adapter and after that, we could have passed our array adapter to our list view. But when
we are using recycler view, we need to create our own adapter. Creating your own recycler
view adapter is probably the most complex code that you have written so far. But we
are going to go through each step together. Before creating our adapter. We also need
a layout file. If you remember when we have used ListView. For every item in our list
view, we have past a built in layout. In recycler view, we need to create that layout as well.
So inside my project inside the Resources folder inside the layout folder, I'm going
to create a new layout resource file. I'm going to name this phone contacts this item.
I'm also going to change this route element to a relative layout. Okay, let's create our
layout file. And let's switch to our TextView. If you remember from previous videos, I said
that when you are working with RecyclerView, you have all sorts of flexibilities. In designing
your items layout files, we will take a look at more complex layout files. But in here,
I'm just going to add a simple text view. Let's switch to the split view so that we
can see the preview. Okay, let's say TextView. Wrap content and wrap content. For the text,
let's say contact Nate. Later on in our recycler view, we are going to change this text view.
Beside that let's also give an ID to this TextView let's say txt name. I'm also going to change
the height of this relative layout to wrap content because we don't want to occupy the
whole screen for just one item in our recycler view. For that, let's change this font to
wrap content. Let's also add some interest in here so that we can see it better. And
also let's add some padding. Let's say padding. And that's past 10 Up. Sorry for that. Let's
also give an ID to this relative layout, we will see how it can be useful. Let's just
name it parent. So this in here is going to be the layout file for every item in our recycler
view. Now that we have created this context, this item dot XML file, we can create our
recycler view adapter. For that we need to create a Java class in our project. So inside
our package, I'm going to say new Java class. Let's name this class contacts, recycler view
adapter. Let's create our class and let's see what do we have in here. So first of all,
before everything, I'm going to create an inner class inside this class, we will see
what this inner class is. this inner class needs to be public, let's say public class.
I'm going to name it view holder because it's the convention. This view holder class needs
to extend recycler view dot view holder this class in here, but as you can see, we are
getting an error in here. And that's because we need to create our constructor. Let's quickly
do that by pressing ALT plus insert. This inner view holder class is going to hold the
view for every item in our recycler view. For example, in this case, it's going to generate
a new contact list item, in which later on we will see how we can use this layout file
and also all of the elements inside that. So basically, this inner class is responsible
for generating our view objects. If you want to have access to elements inside your view
object, you can add them as the fields of this inner class. For example, in here, I
can say private TextView. If you remember, we had a TextView in our list item, the ID
was txt name. Let's name it. txt name. And down in here inside the constructor, let's
say txt name is equal to find view by ID. But because we are not inside an activity,
we cannot use this find view by ID method like this. Instead, what we can do is that
we can use this view object that has been passed to this constructor. For example, I
can say item view dot find view by ID. You can see that we have this method in here.
So the only difference is that inside an activity, you can simply say find view by ID. But in
here because we are not inside an activity, we can use this view or we can say item view
dot find view by ID. And after that we can address our TextView I can see our.id dot
let's say fix the name. If you have other elements inside your layer file, you can add
them like this one by one. We will see that later on in few minutes. But for now we are
done with this interview holder class. Let's minimize this. And now we can extend the RecyclerView
adapter at the declaration of our adapter class. The way to do that is like this, we
can say extends recycler view dot adapter, we can see that we have this option. Also
take a look at this VH in here It stands for view holder. If you import this adapter inside
the diamonds, you need to pass view holder. There are also multiple view holders Make
sure to import the one that is inside this class this orb that may code that your project
name. You also have one in Android x that recycler view, so make sure to don't confuse
them. If you remember when we have used array adapter for list views as the data type of
our adapter, we have passed the string. This view holder class is exactly like that. And
we are saying that the data type of our adapter at the end is this view holder class, the
class that we created inside our adapter. Okay, now that we have extended recycler view
adapter, we need to create some methods or to be specific we need to implement some methods.
For that I can press Ctrl plus i and as you can see, we have three mandatory methods on
create view holder on bind view holder and this get item count method. let's implement
all three of them. You're also going to need a constructor for this adapter class. Let's
quickly create that by pressing ALT plus insert by going to construct it we can create our
constructor. Before explaining these three methods in here, I'm going to create a model
in my project. As I said previously, in this video, I'm going to show some contacts inside
my recycler view. And I'm going to create a model for those contacts. So inside my project,
I'm going to create a new Java class. Let's name it contact. For this contact, I'm going
to define some features. First of all, let's say private string name. After that, Let's
say private string email. After that, I'm going to define a new string, let's say private
string, image URL bvoc, how this one is going to be useful. Basically, we are going to show
some images from the internet by using the URLs. And after that, we need to create our
constructor. Once again, by pressing ALT plus insert, we can do that. Let's also create
some getters and setters. I'm not sure that I'm going to use all of them. later on. If
you did not use them, I will delete them. Let's also create a two string method this
might be useful as well. Okay, now we have our contact model. Let's close this class.
So once again, inside my recycler view, I'm going to show a list of different contacts.
Because of that, I need to pass the list of different contacts to this adapter class.
For that before everything above in here, I'm going to create an ArrayList or to a specific
private ArrayList of different contacts. Let's say private ArrayList of contacts, let's name
it contacts is equal to new ArrayList. It's very important to initialize your ArrayList
if you don't initialize it, you will definitely get a nullpointerexception. Also, because
we have set this context ArrayList as private, we also need to create a setter method so
that later on for example, from inside our main activity, we can set the initial data
for our contacts for that down in here. After the get item count method, I'm going to press
ALT plus insert. And by going to this setup menu, we can create a setter for our contacts
are released. Later on from inside our main activity, we will pass our data we're using
this set contacts method. But there is a very important point in here. Imagine that you
are getting your data for example, the list of your contacts from a web server from internet,
the list of different contacts that are coming from the internet may change during the time,
so the list of different contacts inside your recycler view should be changed as well. If
you want at any time, you can reuse this set contacts method in order to change the data
inside your adapter. But in order to refresh the data inside your recycler view, you need
to use another method inside the set contacts method. That method is called notify data
set changed this one in here. So basically, the data set for our adapter in this case
is our contacts ArrayList. After changing the list of different contacts at any time,
we are going to notify the adapter that the data set has been changed. This way we can
refresh our recycler view with the new data that we have received or passed to this adapter
class. Okay, let's move on from this part. And let's start working on these three different
methods. The simplest of these methods is this get item count, you can guess its purpose,
it's just going to return the count of different items in your adapter. In this case, we know
that the data in our adapter is a list of contacts. so we can simply return the list
of our contacts, we can say contacts that size. That's all we need to do inside this get item
count. For some reason RecyclerView needs the number of items inside your adapter. And
in here, we can simply return that. Okay, I think that's enough for this video. In the
next video at the beginning we will start working on these two methods. After that,
we will see that how we can have more complex layouts in recycler view. And after that we
will see how we can use that image URL in order to show different contact images in
our application. Okay, see you in the next video. Okay, let's continue our talk about creating
a recycler view adapter. But before that, let's quickly have a review of what we have
done so far. So first of all, we have added the RecyclerView dependency in our Gradle
script. If you take a look at build dot Gradle module app inside these dependencies, you
can see that we have added recycler view. After that we have added this recycler view
in our activity main dot XML file. Inside this relative layout, we have this recycler
view. After that inside our main activity dot java file. We have initialized our recycler
view. After that it was the time to create the layout file for every item in our recycler
view. We have done that by creating a new layout file called contacts list item in our
layers folder. If we want to take another look It's a simple relative layout, which
contains only one TextView. Later on, we will change this. After creating the layout file
for every item, it was time to create our adapter class. We have done that by adding
a new Java class. In our package, the name of that class was contacts recycler view adapter
inside this class. First of all, we have created this inner class, we have named it view holder
because it's the convention. After that, we have extended the recycler view dot view holder.
We needed a constructor so we have created this constructor in here. As I said in the
previous video, this view holder class is responsible for holding the view items for
every item in our recycler view. We can also instantiate all of our UI elements from inside
our contacts list item dot XML file inside this view holder class if you want. After
creating this view holder class this inner class in here, we have extended the recycler
view dot adapter class in which as its data type, we have passed our inner view holder
class. When we extended this recycler view adapter, we needed to implement three mandatory
methods. This oncreateview holder on bind view holder and get item count methods. We
are going to talk about these methods in this video. But before that, we also created a
model for our contacts. We have added that in our package. This contact has a name, an
email, and also an image URL. later on. In this video, we will see that how we are going
to show an image based on its image URL. After creating our model inside our adapter class,
we have created an array list of different contexts in which we have named that contacts.
It was also important to initialize this array list I said that we are going to get a nullpointerexception
if we don't initialize our ArrayList. Also later on when we create an instance of this
adapter class, we are going to need a constructor. So for that we have created this empty constructor.
I believe later on we will change this. Also in order to pass the data into this adapter
request. In this case an ArrayList of contacts we have used this set contacts method in which
we are going to call it from inside our main activity. After passing the data to this adapter,
we have notified the adapter that the data set has changed so that we can refresh the
list of items in our recycler view. Also in the previous video, we have talked about this
get item count method. Once again, it's going to return the number of items in our adapter.
In this case, we have returned our contacts array list dot size. Okay, now it's time to
work on these two methods. But before everything, let's close all of the extra classes and files. And let's start working on this onCreate view
holder method. As you can see, the return type of this method is a view holder. It means
that this method is the place to generate our view holder to place to instantiate our
view holder class that we have created down here. In order to create our view holder class.
First of all, we need to create a view object. We can do that by saying view this one in
here. Let's name it view is equal to if we were inside an activity, we could have said
get layout inflator. But because we are inside a class beside our activity, we can't use
that instead we can say something like this we can say layout inflator with capital L
dot from this method in here, you can see that this from method is waiting for our context.
You can also guess by the style of this from method that this is a static method. In here
we don't have any context. But we can use this view group in order to get the context.
Let's get the context from this view group and I will talk about it. You can see that
the name of this view group is parent so I can say parent dot get context. As you can
see in here we are creating a view object and we are using this layout inflator to generate
that view object. The job of this layout inflator is that to inflate a layout for some reason
this layout inflator needs a context so we can say dot from and inside that method we
can pass our context. The way to inflate our layout with the help of this layout inflator
is that to use dot inflate method. So in here after this Fromme method, we can say that
inflate and after passing some arguments, we can generate our view object. In here,
we need to pass three arguments. First of all, we need to pass the address of our layout
file for every item in our recycler view. I mean that contacts list item, that XML file
that we just created. So for that I can say our dot layout dot, let's say contact list
item. After that, we need to pass our view group, in this case, its name is parent, once
again, I will talk about it. And also after that, we need to pass a Boolean. I will talk
about that after we talked about to be over. Let's fast forward. So in this case, and now
we have our view object. Okay, let's talk about these two arguments in here, this view
group and also this Boolean. Basically, the view group is the parent of all of the layout
files. For example, it's the parent of relative layout, linear layout, and also constraint
layout. This view group can be used to group different views inside it. If you want to
make sure of that, for example, you can go to your main activity just for testing purposes.
If you save private relative layout, let's name with relative layout. from the previous
videos, we know that if we want to check some documentation in Android, we can press down
the control key. And by selecting the class name, we can have access to the relative layout
documentation and also declaration. In here you can see that this relative layout is extending
view group. So once again, view group is the parent of all of our layout files. But why
we are passing this view group as one of the arguments inside our adapter class. Before
talking about that, let's quickly delete this line of code. We have created this just to
read the documentation and declaration. So in here inside this inflate method, we are
passing this view group. Basically, this tells that Where do you want to attach your view
object, for example, when we create an instance of our adapter object from inside our main
activity, because in our main activity layout files, we have defined a relative layout,
this view group is going to be a relative layout. And this view object in here, our
layout file for every item is going to be attached to that relative layout inside our
main activity. That's also the reason why this view group has the name of parent in
here. But what is this Boolean in here you can see that the name of this Boolean is attached
to root. And also I'm passing false. In here, I just said that I want to attach my view
object to its parent. I'm passing false in here because if we pass through, it will be
a redundant job, we already passed our view group as the parent of our view object. And
if you pass through, it's going to be redundant. We have this Boolean because we can also pass
null in here. For example, if you're not sure about our parent, and about where our view
is going to be attached, instead of our parents view group, we can simply pass now, you can
see that the name of this argument has changed to route. So if you passed now, you're not
going to be sure about the place that this view is going to be attached to. But of course,
this is an option that you have. Once again, I'm going to pass parent. And for the Boolean
I'm going to pass false. So at the end of this line of code with the help of this layout,
inflator dot inflate method, we have our view object. Now it's the time to create our view
holder object. And after that, return it, if you take a look at the constructor of this
class that you have created, you can see that this constructor in here is accepting a view.
Now that we have our view object, we can create an instance of this view holder class. So
above in here before the return statement, I can say, view holder, the one that exists in our adapter class,
not the one inside the Android x that recycler view, let's say view holder, let's name it
holder, is equal to new view holder. And let's first review. After that, let's return our
holder. So once again, the purpose of this method in here this oncreateview holder is
to create an instance of our view holder class for every item in our recycler view. Later
on this holder will be passed to this unbind view holder method as you can see in here,
and we can use it in order to change the properties of our UI elements. Let's see how we can do
that. So inside this unbind view holder method, which I believe is the most important method
inside every recycler view adapter. We are going to use the properties of our view holder
class. For example, right now inside our layout file, we have only one TextView. So if I want
to change the value of my TextView I can say something like this, I can say holder dot
txt name, dot set text and we can pass our text. You can see that in here we are able
to use holder dot txt name if you remember Inside our view holder class, we had such
a field. But also this field was private. If you remember from the Java session, I said
that whenever you use inner classes from inside the parent class, you can have access to all
of the private fields and methods of your inner class. In this case, inside this adapter
class, we can use this folder dot txt name, even though it's private. Okay, but what do
we pass inside this set text method. As you can see, beside this folder, we also are getting
some integer called position. It's exactly like the position that we have inside ListView
adapters. This is going to be the position of the item in our recycler view. Once again,
we can use this position in order to get the data for example from our contacts ArrayList.
For example, inside the set text method, I can say contacts, dot, let's say get. And
in here as the index i can pass position. Also, during the time, I've seen that the
name of this integer was different. Sometimes it was named it sometimes it was position
and also I think I've seen others. But basically, this integer is just the position of every
item in your recycler view data set. Okay, after getting the corresponding contacts,
we can use dot get name, for example, in order to set the name of our contact to this TextView.
This is going to be the simplest recycler view that you can create. You can have all
sorts of UI elements inside your list item layout file, and after that inside this unbind
view holder method. You can also set different onClick listeners for each one of you I elements.
But more on that in few minutes. So by this time, our adapter class is ready, we have
done a great job and we have created our recycler view adapter class. Now that we have created
our recycler view adapter, it's time to switch back to our main activity and pass some data
to this adapter class. So inside this onCreate method, we have instantiated a recycler view.
After that, we need to create an ArrayList of different contacts. For example, let's
say array list of different contacts. Let's name it contacts is equal to new ArrayList.
Once again, I'm passing the data manually in here because we don't know anything about
databases and web servers yet. In a real world application, these data are probably coming
from a database or a web server. Let's quickly add some data to our contacts ArrayList. As you can see, I've added some contacts into
my area list. For every contact, I've selected a name also an email. And beside that I've
get these image URLs from the internet. There is just one point in here. And that's regarding
these image URLs. Sometimes when you're copying the address of some image from the internet,
that address may not have an extension, for example, like this dot jpg, or dot png. Those
images are not going to be useful in here. So make sure to select the images that have
the extension of that JPG or dot png. Just because some students asked me before how
to get the address of these images. Let me quickly show you one example. For example,
in Google Images, you can search for different images. And by right clicking on the image,
you can copy the image address. For example, in another tab, you can paste that address
if it's ending with dot JPG or dot png, you're good to go. Okay, after creating your contacts,
it's time to create your recycler view adapter. For that, I'm going to say contact recycler
view adapter. Let's name it adapter is equal to new contacts recycler view adapter. We
didn't need anything for the constructor, so you're good to go. After that, we can use
the setter method inside our adapter we can say adapter dot set contacts, and we can pass
our ArrayList. After creating our adapter instance, and setting the data, we can set
this adapter to our recycler view. So down in here, I can say contacts recycler view
dot set adapter. And I can pass my adapter in a ListView. That would be the end of everything.
And we could have test our application. But in recycler view, there is also one more step.
We also need to set a layout manager for our recycler view as well. Let's quickly set that
and we will talk about let's say contacts RecyclerView dot set layout manager. In here
we have few options. First of all, we can pass a linear layout manager and we can pass
Like this we can say new linear layout manager, in which for its constructor, we need the
context. This time because we are inside an activity, we can safely pass this as the context.
By setting the layout manager of our recycler view to a linear layout manager. We are saying
that display the items in our recycler view in a linear fashion. The other option that
we have is grid layout manager, we will take a look at that. But in here, this linear layout
manager is by default vertical. If you want to change that, for example, if you want to
have a horizontal view, you can do that. We will do that in a minute after running our
application. So by this point, our application is ready to test. We have created our recycler
view we have instantiated down in here, we also have created this dynamic list of contacts.
After that we have instantiated our adapter class. We have set the data inside this adapter
class. After that we have set the adapter to a recycler view. We also have set a layout
manager for our recycler view. Let's test the application. And let's see what does a
recycler view look like. As you can see the list of different contacts name are being
shown inside a recycler view in my activity. If I had more contacts, I could have scrolled
my recycler view and I could have access to all of them. Right now they all can fit on
the screen. So this is not a scroll view. Let's quickly change this linear layer to
a horizontal linear layout and see the difference. So in order to have a horizontal linear layout,
after this context, you can say linear layout manager dot horizontal, this one in here.
This is a constant in which you can use in order to have a linear layout manager. Beside
that you also have a Boolean in here. Let's pass that I'm going to pass false. As you
can see, the name of this Boolean is reverse layout. If you want to reverse the order of
items inside your recycler view you can pass through in here. But I don't see any reason
for doing that. So I'm going to pass false. Let's run the application once again. And
let's see what a horizontal linear layout looks like. You can see that this time right
now we are seeing only one contact on the screen. And that's because when we created
the layout for every item in our recycler view, we have past match parent as the width
of the item. But if you want to see other items, you can scroll the window horizontally,
you can see that we are seeing other contacts. So this is what this horizontal linear layout
looks like. Okay, let's quickly see the other layout manager that
I talked about. And let's move on from this one. The name of the other layout manager
was grid layout manager. So I'm going to delete all of these. And inside this set layout manager
method, I'm going to say new grid layout manager. For the inputs of this constructor, we need
two arguments. First of all, we need the context. After that we need the number of columns.
For example, I can pass two in here, these two in here is going to divide our screen
horizontally into different parts, or to be specific to different columns. And it's going
to show different contacts in those two columns. But before I run my application, I'm going
to change one thing in the application in the contacts list item that XML file, I'm
going to change the match parent attribute of my relative layout to let's say wrap content.
You can see that for this video, we have set it to match parent. I'm going to change that
to wrap content. Okay, now let's run the application. You can see that the screen has been divided
into two different columns horizontally, and we can see the contacts name in two different
columns. So sometimes you may want to use this grid layout manager. Okay, now let's
see how we can set an onclicklistener for each one of these items in our recycler view.
Right now, if we click on each one of these items, they are not going to do anything.
But if we want to set an onclicklistener we need to do that inside our contacts recycler
view adapter. Let's quickly open that class. It was in our Java folder inside our project
folder. Contacts recycler view adapter. If you remember, I said that this unbind view
holder method is the most important method in your adapter class. And inside this method,
you can set an onclicklistener for every UI element that you want. Also, if you remember
inside this contacts list item, I've defined an ID for this whole relative layout. If you
want you can set the onclicklistener on this TextView but I think it's better To define
the onclicklistener on the whole relative layout, because as you can see, we have this
padding of 10 dP and some places in our relative layout are not going to be clickable if we
set the onclicklistener on the TextView. But because I'm going to define the onClick listener
on this relative layout, inside my adapter class, when I've created this view holder
class, after creating the TextView, I need to reference the relative layout as well.
So I can say private relative layout. Let's name it parent. We also need to instantiate
it inside the constructor down in here, I can say parent is equal to item view dot find
view by ID, once again, let's say r.id dot parent. After defining this relative layout,
now you can have access to that inside this unbind view holder method. So for example,
in here, I can say holder dot parent, which is the name of this relative layout, dot,
let's say set onclicklistener. You can see that we have this option. Let's pass our interface
new onclicklistener. And in here, I'm just going to show some toast message. Let's say
toast. If you remember when we have used this make text method on our toast, we needed a
context. But in here, we do not have access to any kind of context. Once again, we will
talk about context later on when we talk about activities in Android, both inside this adapter
class. Right now, we don't have any context. So we have to pass it inside the constructor.
For example, I'm going to define the context as the member variable above in here, let's
say private context. Let's name it context. And after that, I'm going to receive that
where this constructor, let's say context. Let's name it context. Inside the constructor,
I can say this context is equal to context. Whatever now that I have changed this constructor,
if I switch back to main activity, I should see some red warning. When we have instantiated
our adapter class, we need to pass our context once again, because this time we are inside
this activity, I can simply pass this. So this way inside our adapter, now we have a
context. And when we create our toast message, we can pass that as the context. For the text,
I'm going to show the name of the contact. So I can say contacts the ArrayList that we
had, let's say that get once again, I'm going to use this position as the index. Let's say that get me. Also, if you have noticed
that as soon as I've used this position inside this onClick method, because we are inside
an interface, this final keyword has been added to the declaration of this integer.
Let's also add another text in here, let's say selected. Let's quickly run the application.
And let's see if we have correctly set the onclicklistener on our relative layout. Let's
click on the first one margravine selected social arona social romance. It seems like
our onclicklistener is working fine. Okay, I think that's a good point to stop the video
in here. I did want to talk about that image URL and how to show that in our recycler view.
But it seems like this video is getting a little bit long. So I'm going to talk about
that in the next video. Besides that we will also talk about using a combination of recycler
view and card view. The combination of these two will generate a really beautiful look
for our recycler view. Okay, see you in the next video. In the previous video, we have
created a functional recycler view. By functional I mean, we have created a skeleton of our
recycler view. But right now, it's very simple. If you take a look at your contact list item
that XML file, you can see that every item in your recycler view is just a simple text
view. In this video, we are going to work around this and we are going to see how much
flexibility we have when we are working with recycler views. The first thing that I'm going
to do in here is that to use a cart view instead of this simple TextView and its parent which
is relative layout, we are going to show our contacts in a card view. For that first of
all, we need to add the card view dependencies into our project. In previous videos when
we wanted to use card view in our project, we have added the material design library.
And from there we have used the material cart view instead of using the material design
library. This time I'm going to use the native Android cards Let's see where we can find
that card view the finances. So if you search for card view dependencies, you will end up
with a link like this, make sure to put Android x in your search because if you search for
Android, you may get some link like this. Let's quickly take a look at that. In here
inside this dependencies, you can see that you are using comm dot Android dot Support
Library. We are not using support libraries in our project right now, if you remember,
when we have created our project, we have added the Android x artifacts. If you want
to make sure of that, you can always check your gradle file. Let's quickly do that. So
in my project pane inside this Gradle script, in this build that Gradle module app, in these
dependencies, you can see that we are always using Android x. If for some reason you're
using the support libraries, you can implement this support libraries version. But because
we are using Android x, this dependency is not going to be helpful for us. So make sure
to include this Android x in your search. And the first link from the official Android
developers website is probably our needed link. Then in here, you can see the dependencies,
you can see that this time, we are going to add the dependency from Android x packages.
Let's copy this line of code. And let's add it into our project. So once again, inside
this built up Gradle module app file. Inside these dependencies, we are going to add our
dependency. Let's quickly do that in here. And let's sync our project. Now that I've
added cardview dependencies into my project, I can use it in my layout files, for example,
inside this contacts list item that XML file, instead of this relative layout, I'm going
to use card view, you can see that it's coming from Android x packages. If you remember in
card views, we had two attributes that can be helpful in here. The first one is card
elevation, this one in here, which will give some 3d shapes to our card. For example, if
I say five dp, we will get an elevation of FTP. The next one is called corner radius.
This one in here, which once again, I'm going to save five dB, I will change these numbers
if it was necessary. And also inside this card view, instead of this TextView, I'm going
to use a relative layout. The reason for the relative layout is that because I'm going
to include multiple UI elements, and I'm going to use some of the attributes like layout
below center, horizontal and attributes like that. And those attributes are available inside
a relative layout. So for that, first of all, in here, I'm going to create a relative layout.
For the width and height, let's say match parent. And I think that's enough for our
relative layout. Inside that, first of all, I'm going to move this TextView. First of
all, let's center this TextView horizontally, let's say center horizontal and let's pass
through. Beside that let's change the style of this text. That's a text style. And let's
change it to book. After that, I'm going to create another text view and I'm going to
show the contacts email. Let's add that after this TextView. Let's change the contact name
to contact email. And let's change the ID to txt email. Let's also move this to below
our contact name. Layout below, let's say txt name. Let's also change the styling here.
Let's say it's added I think it's better to add some margin top margin top, let's say
seven dp. Also I'm going to delete the center horizontal attributes. Okay after these two
texts, I'm going to show the contacts image for that I'm going to create an image view.
Let's say image view for the width and height of this image view because I want to have
a consistent image view I'm going to put the numbers manually because my images are coming
from the internet. And I don't know anything about their size. For example in here I'm
going to say 550 dP, I think that would be fine. For the height as well. Once again 150
dP that's also give an ID to this image view. Let's just say image. I'm going to move these
two below my contacts email. Let's say layout below. And let's pass the email. Let's add
a margin top, I think 10 dP would be fine. I'm also going to center this image via horizontally.
So let's say center horizontal. And let's pass through. Let's also add a placeholder,
I'm going to say source. And let's address one of our images in our package. I think
this IC launcher background would be fine. Okay, I think that's enough for our current
view, I don't think we need anything else, let's just have a quick look of what our current
view looks like. I think I need to increase this coronary radius. For example, let's say
10. In here, that should be better. Besides that, let's increase this card elevation.
You can play around with these numbers until you're satisfied. I'm almost done with this
contact list item file, I'm just going to reformat my code so that when I publish this
code, you and I have the same base code. For that, I'm going to go to this code tab in
here. And down in here, I'm going to select this
reformat code, you can see that the code has been rearranged. Okay, now that I have changed
this layout file, we need to also apply the changes inside our recycler view adapter file
as well. So down in here, when we have created our view holder class, we need to address
all of the new elements in our contacts list item dot XML file. First of all, we have deleted
this relative layout, and we have replaced that with the current view. So in here, instead
of using a relative layout, I'm going to say current view. And let's also add our email
text, I'm going to add it in the same line with this txt name. Let's say txt email. And
let's initialize it down in here inside this constructor. So let's say txt email is equal
to item view dot find view by ID r.id dot txt email. We also need to add some quotes
inside this unbind view holder method. For example, we are going to show the contacts
email, we need to do that in here. Let's say holder dot txt email, dot set text. Let's
pass our contacts dot get which for the index, I'm going to pass position, let's say dot
get email. before showing the image view, I'm going to run the application. And I'm
going to see that if everything is working fine. So let's run the application. You can
instantly see that with this view changes how much we have improved our layout. But
right now this layout needs some modification. For example, we need to add some margin between
these card views. And also we need to add a margin top for this txt name. Let's quickly
apply them. So if I switch back to my contact list item dot XML file, for this parent card
view, I'm going to add a margin that's a margin top or instead of margin top, I'm just going
to say margin. I think 10 dP would be fine. Beside that, let's also add a margin for this
TextView. Let's say margin top and that's a seven dp. Let's also add a margin was thought
for this email. So in here for this txt email, I'm going to say margin start this one in
here and I'm going to say five dp. Let's run the application once again. You can see that
it's much better. Now, you can also see the two attributes that we have added for our
current views much better in here. First of all, we have added this corner radius, you
can see that in here and also this 3d shape with a shadow behind our card view is for
that called elevation attribute. Beside that the reason that we are seeing two columns
in here is because of that grid layout manager that we have passed to our recycler view.
If you want to have only one column, you can change that, for example inside our main activity.
down in here, instead of a grid layout manager, we can pass a linear layout manager. So in
here, let's say new linear layout manager. And let's pass our context. Before I run this
application, I'm going to make sure that I've centered my recycler view. Let's switch to
our main activity layout file. And let's center our recycler view. Let's say center horizontal.
And let's fast through. Also I'm going to change the width attribute in here to wrap
content. Let's run the application once again. Right now you can see that we have only three
contacts in our screen but we can scroll our recycler view that's we could do that. You
can see that if our item do not fit on the screen. Our recycler view is a scroller but
besides that, let's also check the onclicklistener Let's click on this link. cart view. And you
can see that social romance selected, it seems to be perfect. Okay, now let's work on this
image view, let's see how we can show our images. For that we have multiple options,
the easiest one is to use an external library called glide. Let's add that into our project.
And we will talk about it. So if you search for glide dependency, the first link from
this GitHub page is the link to that external library. Let's see what does it look like.
down in here, you should see the dependencies. First of all, we need to add these two into
our repositories. Let's see if we have them in our gradle file. Let's open our project
pane in the Gradle scripts inside this build that Gradle project spawn in these repositories,
we need to add the Maven repositories. Let's quickly add them. I'm going to copy this one
in here. And I'm going to add it inside these repositories for all projects. Beside that, we need to add these two dependencies
into our project. Inside this build dot Gradle design module app, we need to add the dependencies.
Let's sync our project. And while it's sinking, let's also talk about the SQLite. So glide
is an image loader library in which has developed by Google so you can safely use it in your
projects. glide has a lot of functionalities in which one of them is to load images from
the internet. Later on in the course, we will see other functionalities as well. But if
you want to know more about why they have documentation in here, let's click on this
vehicle lights documentation. You can read this page if you want. But we will talk about
glide more later on in the course. Okay, let's switch back to our project. And it seems like
we have added the glide library successfully. Let's close these two Gradle files. Also,
let's close this activity main dot XML file. And let's go to our contacts recycler view
adapter. That's java file. So inside this unbind view holder method, I'm going to show
the images of different contacts. For that I'm going to use the glide inside this method.
Let's see how we can use glide. In order to show images with glide library, you can say
something like this, you can say glide with capital G. And after that, you need to pass
your context, you can do that by saying that with for the context in here, I'm going to
pass my context. As a reminder, we have get the context via the constructor of this class.
In the previous video, I'm talking about this one in here. Now that we have our context,
we can use it with this width method. After that, I'm going to say that this image is
going to be a bitmap. So let's say that as bitmap. After that, we need to pass the source
of our image. In this case, we are going to pass the image URL for our contact image,
let's say dot load. And let's pass our context image URL for that I'm going to say contacts
that get once again, I'm going to use the position as the index. That's a dot get image
URL. After that, we need to pass the image view that we want to show our image inside
that I'm going to save that into. And I'm going to address my image view, which I can
say holder dot image. But for that, first of all, we need to add this image inside this
view holder class. We never did that. So inside this view holder class, first of all, I'm
going to say private image view. Let's call it image. And let's also instantiate it inside
the constructor. Let's say image is equal to item view dot find view by ID r.id dot
image. This is the simplest way of using glide. First of all, we need to pass our context.
After that, we need to say that it's going to be a bitmap file. After that, we need to
pass the source of our image with this start load method. And after that, we need to specify
the image view that we are going to show our image inside that this is going to work fine.
But before I run my application, I need to do one more thing. We are going to load different
images from the internet. For that we need to add a permission into our manifest file
for accessing the internet. So far, we haven't talked about requesting permission. Let's
quickly see how we can do that. So in our project main inside the app folder, inside
this manifest folder, if we open this Android manifest dot XML file, we can add our permission
in here above the application tag. In here, I can open a tag and the tag is going to be
users permission, this funding here and we need to assess To find the kind of permission,
let's search for internet permission, you can see this Android permission that internet.
Let's close our tag. There are much more concepts regarding these permissions, we will talk
about them later on in the course, for some permissions, you need to create a UI logic
in order to ask the user to grant that permission to your application. But this internet permission
is a safe permission. And if you add it to your manifest file, the Android system is
going to grant it automatically. That's all we need to do in order to request for an internet
permission. Later on, we will talk more about permissions. Let's just run our application.
And let's see if we can successfully show different images. You can see that we are seeing different images
in here. But there was a problem when I ran this application after adding the permission
for the first time. The first time I wasn't able to see the images. And that's because
we have changed our manifest file. Whenever you change your manifest file, you need to
uninstall the application and install it once again. So if you're not seeing different images,
make sure to uninstall the application and install it once again. After that, you should
see different images. Let's also check the others you can see that the images are loading
from the internet after a few seconds. You can see that our recycler view our cart views
and also the glide library is working perfect. The combination of these three we'll create
a really beautiful layout for when we want to show a list of different items. And probably
by now you can see the flexibility and all of the functionalities of recycler view, you
can see that we can modify our layout files, our list item layout files however we want.
Okay, I think that's enough for this video just to see our recycler view better. I'm
going to change the linear layout manager once again to a grid layout manager. And after
that, we will finish our video. So let's change it back to grid layout manager and let's run
our application once again. You can see that our RecyclerView seems perfect. Okay, I think
that's enough for this video. In the next video, we are going to see how we can use
different fonts for our text views, for example, and external font that we don't have in Android
Studio. Okay, see you in the next video. In this video, we are going to talk about
different fonts, how we can apply different fonts to our TextView. Whether that font exists
in our project, or whether we are going to add it externally. I believe this will be
a short video. First of all, let's see how we can add an external font into our project.
Before that, I'm going to go to this layout file and give an ID to this TextView. Let's
just name it. txt Hello. In order to add an external font in your Resources folder, you
need to create a new directory, you can right click on your resource folder. By selecting
new and Resource Directory you can create that directory. We have done this when we
have created a menu resource file. In here, you just need to define the type of your resource,
you can search for font in here. And that's all you need to do. Now you can see that you
have this font folder, and you can copy your external fonts into this folder. For example,
I have prepared this font. But before adding this font into my project, I need to do some
modifications. For example, I need to change the name of this one. In order to add this
font into your project, you need to follow some rules. For example, you need to change
all of the upper cases into lower cases. And also you shouldn't use hyphens, instead of
that you can use on their lines. So in here, I'm going to change the name a little bit.
Let's change this opportunity to learn. After you have changed the name, you can simply
copy your font and inside your font folder, you can paste it. The name is fine. Let's
just press OK. Now in your font folder, you have this Amsterdam, the TTF. If your font
has some preview, you can see that by double clicking on your font. Okay, now that we have
added this font, let's see how we can use it on our text view. Let's switch to our TextView
mode. And on this TextView we have one attribute called font family. This one in here. And
now we can address our font, which is add font slash amster. No. Let's use to split
here and let's see if we can see our font in the preview. You can see that right now
the font hasn't been rendered, but I believe this will be changed when we run our application.
Let's run the application and let's see if we can successfully change the font up artix
view, you can see that this beautiful font has been applied on our text the beside using
your own fonts in your project, you can also use some fonts called Google fonts. Let's
quickly see how we can use them. So for that, I'm going to switch to design view and search
for font family attributes in here. But before that, we need to click on this text view.
Let's search for font family. You can see that we have this attribute, and beside our
font, which is right now at font Amsterdam, you have this drop down icon. If you click
on that, you can see that in Android, we have some fonts that we can use. But besides all
of these, we have these more fonts option. And when we click on that, you can see that
we have at least have a lot of more fonts. Also, you can see the source in here it says
Google fonts, these Google fonts are free, and you can safely use them in your applications.
You just need to add a license in your application somewhere. Okay, let's see what do we have
in this Google fonts. For example, we have this calligraphy T or something like that,
that we can use. In here you can see that we have two options, create downloadable font
and add font to your project. The first option means that you don't want to add the font
to your project. And you want to use the online font every time that a user uses your application.
If you are creating an offline application, this option in here might not be that useful.
Instead of that, I'm going to use the second option which will add the font to my project.
But it will increase the size of the final apk file. Also, then in here, you can see
this preview for some fonts, you have a more than one preview. And you can select between
them both for this font, we have only this regular. Also down in here, you can see the
license that you need to show somewhere in your application. For the simple application.
I'm not going to do that because this is not going to be a commercial application. Okay,
let's add this font into our project by pressing OK, you can see that this calligraphy font
has been added into my font folder. I believe this will have a preview. So if I click on
that, you can see a preview of your font. Now if I run my application, I should see
this font instead of this Amsterdam font. You can see that the font has been applied
successfully. For some fonts, you may have different styles for example, regular or normal,
Italia, bold and bold italic. Let's quickly see a font that has those styles. And let's
see how we can apply those styles on our text views. So once again, I'm going to click on
this drop down menu. And once again, I'm going to click on this more fonts. The font that
I'm going to use in here is called lobster two. If you click on that, you can see that
in this preview pane, you have four options, I'm going to add them one by one into my project.
For the first one, I'm going to name it lobster to underline regular. And also I'm going to
add it to my project, I'm not going to make a downloadable font. Let's press OK. And let's
do the same for the other three slides. You can see that now we have four different
lobster two fonts. If we want to apply them on our text views, we can do the same as we
did for the other fonts, which we had only one font. For example, inside our text view.
For this font family in here, we can pass the fonts manually by specifying the name
of our font, or we can pass this styling job to the Android. For example, we can add a
text style in here. And we can specify the size which can be it's fairly bold or normal.
Right now if I select text style as bold and if I change this lobster to Bold Italic to
just lobster to regular. Let's quickly do that. If I run my application, I'm going to
get a bolder style for this specific font. Let's quickly run that. You can see that we
have this bold font but this in here is not accurate because we have added the style manually.
This actually in here is using our lobster to regular font. And if we want to use a specifically
this lobster to bold font, we can create a font family for that. Let's quickly see how
we can create a font family. So in my font resource folder, I can Right click, and by
pressing new fonts resource file, we can create a new font family. For the file name, I'm
going to put the font name, which in this case is lobster two. Let's create that. Inside
this font family. I'm going to define four fonts, we need three attributes in here. First
of all, we are going to need the font itself. For the first one, I'm going to pass the lobster
to regular font. After that, I'm going to pass a style for this font, let's say font
style. You can see that in here we have two styles Italia, and normal. In here, I'm going
to pass normal. But if you want to pass a bolder style, you need to pass that as a font
weight. Let's quickly see that you can see that we have this font fate attribute in which
we can pass a number. Basically, for normal fonts, these weights should be 400, I will
show a link for where you can find the exact font weight that you need. But for now, let's
just pass 400. And let's finish creating our font. After that, I'm going to create three
more font elements. And I'm going to pass the other three fonts, let's say font. Once
again, we need to address our font. This time, let's say lobster to retallick. For this style,
I'm going to say Italian this time. And once again, because this is not a bold font, we
are going to pass 400 as the font weight. Let's quickly add two more fonts for the bold
styles. You can see that for the normal bold font I first normal as the font style. But
for the Italian font I first Italian, the only difference between a bold and a regular
size font is in this wait for the regular view half past 400 both for the bold ones
we have past 700. Before we go further, let's quickly see where we can find the proper font
weight. So if you search for font weight Android developer, you can see this font weight from
the developer.android.com. Let's quickly see that. And in here inside this companion properties,
we can see different weights for different fonts. For example, we have past 400 for the
regular fonts, which is the correct number. For the bold ones, we also passed 700 I believe
in Android, you won't see much difference. If you pass for example 500. When the fonts
are being rendered, the only difference is between these 407 100. So if you want you
can check this webpage. Okay, let's switch back to Android Studio. Now that we have created
this font family, we can pass it in our activity main dot XML file. But before that, you can
see that we have a lot of warnings in here. If you hover over one of them, it says that
these attributes are only usable in API level 26 and higher. So if your application is running
on API level lower than that, this font family won't be applied. I've seen that some people
use App namespace instead of this Android. For example, you can see up in here, of course,
you need to add the namespace. By pressing ALT plus enter, you can see that this new
namespace has been added. I'm not going to talk about name spacing here. But basically
it's like importing in XML file. In other programming languages, you also have namespaces.
Basically, it will define that where this attribute is coming from. So some people are
using this app namespace. They say that if you use this app namespace instead of Android,
the font family will be applied in lower APA levels as well. But honestly, I didn't see
that difference. So I'm going to change this one back to Android. And in my activity, main
dot XML file, I'm going to pass the font family. So in here instead of passing lobster to regular
I'm going to pass lobster to this XML file that we just created. And now this way we
are passing the styling job to the Android system. So even though we are using this lobster
to because we have set a style to bold in here, at the end, our font is going to be
rendered to this lobster to bold. Let's run our application and let's see if we can see
a bold font. You can see that we are seeing the bold font. Once again the difference in
here is that this time we are using exactly this lobster to bold. But when we have passed
lobster to regular and we have set the style to bold, only the Android Studio increase
the size. Sometimes there might be some differences between different font styles. When the designer
created the font, so this way of creating a font family is much more accurate. Okay,
just before finishing this video, I'm going to show you how you can apply different fonts
in Java. For example, inside this layout file in the design view, I'm going to add a button.
And by clicking on this button, I am going to change the font of this TextView. Let's
change the ID of this button. First of all, to let's say btn, change font. And also let's
add some constraints. And let's change the text. I'm just going to say change in our
main activity. First of all, let's initialize these two items. After that, let's set an onclicklistener.
For our button. Let's say that set onclicklistener new onclicklistener. Before this onClick listener,
I'm going to create a typeface. And after that, I'm going to change the type face of
this TextView inside this onClick method. So above in here, let's say typeface, you
can see that it's coming from Android dot graphics package. Let's name it typeface is
equal to and here we are going to get a reference to our font in our Resources folder. If I
tried get resources in here, as we can see, that gets resources that get font. And if
I pass my font address, for example, if I say R dot font dot, let's say Amsterdam, you
can see that we are getting a red warning in here. And the warning says that this method
is only available in API level 26. and higher. You can overcome this problem by using resource
compat. Instead of this get resources method. Let's quickly see that. So in here, I can
say resource compat dot get font. First of all, we need the context which I'm going to
pass this. After that we need to address our font, let's say our dot font dot Amsterdam.
So instead of get resources, you can use this resource compat, which is a good option for
backward compatibility. After you have defined your typeface inside the onClick method, you
can say txt. Hello, that's that typeface. And you can pass your typeface. As simple
as that you can change the font of your text to let's run the application. And let's see
if everything is working fine. Right now the font is lobster too. If we click on this button,
we can see that the font is changing to Amsterdam, it seems to be perfect. Okay, I think that's
enough for this video. And also for that matter for this section of the course. There are
a lot more concepts and tools that you have when you're designing your layout files. For
example, you have navigation drawers, you have bottom navigation views, you have animations
that you can apply in your application. But I'm not going to talk about them in this section
of the course because there are a lot more concepts that we don't know anything about
them yet. Later on in the course we will see a lot more tools for designing our layout
files. Okay, in the next video, we are going to have a quick challenge for this section
of the course so that we make sure we have learned everything that we have talked so
far. See you in the next video. As I said at the end of the previous video, In this
video, we are going to have a quick challenge. The purpose of this challenge is to make sure
that we have learned everything that we have talked so far. And here is our challenge,
I want you to create this simple layout file. You can think of this layout file as a simple
registration for in which we are receiving the user's name, email, password, gender,
and also country. Beside that we have this image view in here plus this button which
normally in a normal application, this potential navigates to the user's gallery, or maybe
the camera in order to take a photo. But because we don't know anything about that yet, this
button and this image view are just for showing purposes, these are not going to do anything.
Just if you want, you can show a toast message after clicking on this image button. Beside
that we have this License Agreement text which down below that you can see this checkbox
if everything works fine. When we click on the register, we are going to show a snack
bar indicating that the user has registered successfully. But if for example, the user
leaves one of these edit texts empty you're going to show a warning. Beside that we are
going to make sure that the user agrees to our license agreement. Okay, this is our challenge.
As you can see, this is a simple layout file. I'm sure that you can do it by yourself. But
as you can see, we are going to practice a lot of things that we have learned in In this
section of the course, we are going to work with a lot of UI elements beside that as you
can see, we are implementing material theming. Also, we are going to show a snack bars. And
beside that we are going to see how we can initialize and work with our UI elements in
the Java file. Feel free to use any kind of layout for that you want in order to design
the simple layout file in here I have used in constraint layout. But if you want, you
can use linear layout or relative layout. Okay, pause the video in here and go solve
the challenge. Whenever you're done, come back to see my solution as well. Okay, I hope you solve the challenge, let's quickly
see my solution as well. I'm going to start by creating a new project. For the name of
this project, I'm going to say UI challenge. I'm going to save it API level 19. In this
simple application, it shouldn't matter. Okay, let's start working on our layout file. But
before that, I'm going to close all of my extra files and panes. As I said, I'm going
to work with constraint layout. But if you want, you can work with linear layout or relative
layout. Before everything, let's remove this TextView. And let's drag all of our items.
First of all, we need an image view for the image profile. For the sample data, I'm going
to select one of the avatars, we also need a button. Beside that we are going to need
material design components. We will add that in a minute. But before that, let's quickly
drag all of our UI elements, we need four edit texts in here, the first two are going
to be in plain text, and the next ones are going to be password. The first two are for
the name and email. Let's quickly add two passwords in here. The difference between
this password and this plain text edit text is that when you type something inside the
password edit text, it won't show the text itself, but you will see some dots. Also beside
that we need a TextView for our gender text. After that we need a radio group. Let's quickly
add that inside this radio group we need four radio buttons. Also, I'm not sure that if
you have seen this way of dragging radio buttons in your radio group in the design view. Previously,
we have seen how to add radio buttons inside a radio group in the TextView. But here is
how you can do that in the design view. Basically, you can use these components three, for example,
I can drag my radio buttons to inside this radio group. Let's add two more. Let's also
quickly change the orientation of this radio group. Let's search for the orientation in
the attributes. This one in here, I'm going to change it to horizontal. Beside that we
need a TextView for the countries. And also we need a spinner in here for selecting one
of the countries that search for a spinner. Let's quickly change the viets of this spinner
to wrap content instead of match parent, this is not match parent in here, it's just some
ntps we are going to change that to wrap wanted. Also I think it's better to put it above in
here beside our country's text. And after everything. If you remember we had the button.
Let's quickly add that this is going to be our button register. Beside that we need a
TextView in here for our license agreement. And also we needed a checkbox. Let's search
for checkbox. And let's change the checked value of this checkbox to true let's search
for checked. Or you can see that down in here. Also, I'm going to change the checked value
of this radio button to checked as well. Also, let's quickly change the idea of our UI elements
so that we can use them in our Java file. I'm going to fast forward the process of giving
them an ID basically, you can select your UI element and you can change the attributes
from this top right pane in here. Just a quick review, let's quickly see the
ID of each one of them because later on you're going to use them in our Java file. This one
is image profile. This one is btn peak image, edit text name edit text email, edit text
password edit text pass repeat. txt gender this morning here is our agenda for our radio
group. The three radio buttons are named or be male or be female and or the other. This
TextView is called txt country. The screener is called a screener country and this button
is btn register. This TextView in here is called a txt agreement. And this checkbox
is called agreement check. We are also going to need four more text views. If you remember
I said that when we click on this register button, we are going to make sure that we
have received some input from the user. And if for some reason the user don't enter anything
on our edit text, we are going to show some warnings and we are going to use text views
for those warnings. So let's quickly add four more text views. I'm going to add Warning
for each one of edit text above the editors. Let's quickly give some ID to these. For example,
for the first one, I'm going to say txt var name. You can guess the rest of them. This one is txt one email.
This one txt one pass. And the last one is txt var is repeat. Okay, now that we have
the ID for all of these UI elements, let's quickly change the initial values. For example,
for this TextView, I'm not going to change anything, but for this edit text, I'm going
to delete the text and I'm going to add a hint. Let's search for the hint. That's just
a name. Sometimes like this, you can see some options, which can be annoying by pressing
the Escape key on your keyboard, you can get rid of that suggestion, let's do the same
thing for these three remaining editors. For this TextView, I'm going to change its value
to let's say gender. For the radio buttons, let's change the first one to make the next
one female. And the other one, I'm going to name either this TextView in here, let's change
it to countries or country. Let's change these buttons text to peak image. And this font
to register. Also this checkbox to I agree. Beside that, we need to change the value of
this text view. But we are going to do that later on when we created our constraints.
I'm not going to do anything about this yet. Also, I'm going to change the color of these
four warning text views. Let's quickly do that. Let's search for color. And let's change
it to some red color, I think this one would be fine. Now let's start constraining our
UI elements. For example, for this image view, I'm going to constrain it to the left of my
screen and also to the top of my screen. But of course, I need some merging. I will add
that in a minute beside that the right of this image view to the left of my button,
and also the right of this button to the right of my screen. Beside that I'm going to constrain
this button to the bottom of my image view. Similar thing for the top of my image view.
Also, let's add some margin for this image view. For example, margin top, let's say 32,
I believe is fine. And let's move it to left. But as you can see, when I move this image
view to the left and this button do not move, I'm going to delete this right constraint.
And I'm going to drag it from the left of this button to the right of my image view.
Now let's constrain this image view to the right of our screen. And now we can move it.
It seems better now for these text views. First of all, I'm going to add a horizontal
guideline. So let's right click on our layout, and let's go to this helpers. And let's add
horizontal vide line. Let's move this guideline to somewhere about here. I think it's fine.
Beside that we need a vertical guideline. Let's quickly add that helpers add vertical
guideline. And let's move it a little bit. Now let's constraint our edit texts. For example,
this one to our guideline, I'm going to constrain this TextView to this guideline as well. Also,
I'm going to add a constraint from the top of this edit text to the bottom of this TextView.
But as you can see these are too close to each other. What you can do is that by pressing
down the CTRL key, you can select both of them. And by right clicking, you can use this
right click menu, you can go to this constraint, let's say Edit Text name, let's say top to
the bottom of our txt warning name, we can see that now we have a constraint. Beside
that I'm going to add a constraint from the top of this TextView to our horizontal guideline.
So once again, let's select both of them. And let's right click constraint txt warning
name top to bottom of our guideline, I think I'm going to remove the margin here you can
see that we have an 80 margin. Let's decrease that to zero, I believe is fine. Let's do
the same thing for the rest of edit text and text views. For these three remaining text
views, I'm going to add a margin top to the top edit text but I'm also going to add a
margin. let's right click constraint txt warning email top to the bottom of our edit text name.
Let's see what is the margin here 15 I think I'm going to save it 16 Okay, let's do the
same thing for the remaining two edit text and text views. We can see that everything looks better. Now.
Also, if for any reason your computer is slow, you can always go to this icon in here and
you can disable This live rendering, or alternatively, you can work with blueprint view, which you
can show from this blueprint option in here. Let's quickly see that you can work with this
one as well. But like before, I'm going to save it to design view. Okay, let's add a
constraint for this gender text. First of all, I'm going to construct it to the top
of this edit text, constraint. txt gender, top to, let's say, bottom of our edit text,
let's also add a margin, I think a margin 24 would be fine, it seems too much, let's
say 60. Let's also add a margin to the left of our screen, let's add a margin in here
as for the radio group, I'm going to select the radio group from this component tree.
For the left constraint, I'm going to add it to this guideline. Also, I'm going to add
a constraint from the top of this radio group to the bottom of this gender TextView. Once
again, I'm going to use the right click menu, let's say constraint. It seems like I didn't
select the radio group, you can always use this component three if you want. Let's select
both of them. let's right click constraint, let's say radio group gender, top to bottom
of RT x d gender, that seems to be better, let's also add a margin, I think 16 would
be fine. For the country text, I'm going to do the same thing. For the left margin, let's
say 16. Let's constraint it to our radio group. constraint. txt country talk to the bottom
of our radio for the margin, let's say 16 months again, for the spinner, I'm going to
constraint it to the right of my country TextView. And also its bottom and top to the bottom
on top of this country TextView as well. Of course, we need a margin left. Let's quickly
add that. For this register button, I'm going to constraint it to the three edges of my
screen. But I need a margin button. Let's add 32. For example, I think that's fine.
For this TextView. I'm going to add another guideline in here. Let's quickly add that
first add vertical guideline, I'm going to move this guideline, let's move it to somewhere
about here. And let's concentrate our TextView to this one in here. For the top, I'm going
to constrain it to the vertical guideline. Let's also constraint this checkbox. I'm also
going to constraint the top of this checkbox to the bottom of our TextView. Let's add another
guideline in here. This one is going to be a horizontal guideline. And let's move it
down below this edit text. Now I'm going to add a constraint from the bottom of this checkbox
to the to this horizontal guideline, it seems like we don't have a proper constraint in
here. For that I'm going to delete this top constraint, we can delete the constraint by
selecting the constraint and pressing down to delete key. Let's also add a constraint
from the bottom of this TextView to the bottom horizontal guideline. Also, I'm going to move
it a little bit above. That seems better. Now, let's also change the text of this TextView.
And also let's change the visibility of these four warning text to gone. First of all, let's
add the text for this TextView. But you can see that as soon as I typed the TextView in
here, the text of our TextView somehow occupies other layout files. And also it doesn't fit
on the screen. If you want to fix that you can click on this to arrow in here. And you
can change the constraint to a match constraint what we also need a margin. Let's quickly
add eight in here. Also for the right. Okay, that seems with it. Also, I think it's better
to move this checkbox to above a little bit. Let's click on that. And let's move it above.
Okay, that seems better. Let's quickly change the visibility of this for one new text views
as well. Let's search for visibility. And let's change it to gone. Similarly for the
next three text views. But now that I've done that, you can see that we have two small margins,
you can increase that. For example, let's say eight in here. Similarly for the next
two editors, sorry for the repetition. Okay, that's about the size of our layout file.
We also need to add some entry for our explainer. Let's quickly add them in our strings values
in our resources in values folder inside the strings. I'm going to add an array string, let's say array. Let's name it countries.
And let's add our items. Now in our activity main dot XML file, we can pass this as the
entries of our espinar. Let's say For entries, and let's address our country's array. Okay,
that seems better. Besides that, for this image view, we also need a source. Let's search
for source in here. For some reason we can't see source in here, let's switch to text view
or this split view. And let's add it in here. Let's say source. And let's pass this mid
map file that we have in our project. Before testing the application, let's quickly add
the material design team. For that, I'm going to go to material.io. Let's go to this Developer
tab. We have seen all of this before in this Android in the documentation getting started.
down in here you can see the dependency. Let's add that in our project Gradle script build
dot Gradle module app. down in here inside the dependencies. Let's add that we also need
to add a version in here which as you can see in the warning, the latest version is
1.1 point oh, let's sync our project. And let's go to our styles and change the theme
of our application. I'm going to delete this theme in here. And I'm going to use team dot
material components that lights this one. We have used these previously in previous
videos, let's switch back to our activity main file, you can see that the state of our
buttons has changed. Let's quickly test everything I'm going to run the application on pixel
three API 29. It seems like we have done a relatively good job, we just need to increase
the size of this image. For that I'm going to change the width and height of this image
view. I'm going to add them manually, let's say 130 dP, I think that would be fine. Let's
run the application. Once again, if you want, you can also decrease the size of this TextView
as well. Yes, that seems to be better. Your design might be different than mine. It's
okay. It's probably better than me. I'm not a designer, but we just wanted to practice
everything that we have learned. Okay, I think that's enough for this video. In the next
video, we are going to switch to our Java file and we are going to work on the logic
of our application. See you in the next video. In the previous video, we have created this
layout file, which isn't that bad. In this video, we are going to work on the Java file
and the logic for this application. So for that, let's switch to our main activity dot
java file. And let's close our layout file. First of all in here, I'm going to initialize
all of my UI elements. Before that, let's quickly add a lock, I believe it will be useful,
let's say private edit text we had for edit text, I'm going to fast forward the process
of defining and initializing these UI elements, you can see that it's very boring. I'm also
going to define a constraint layout element in here, let's say private constraint layout.
I'm going to name it parent, I believe later on, we will use this constraint layout to
show a snack bar, I also need to give an ID to my constraint layout. So for that, let's
switch to our activity main dot XML file in our split view, in the parent constraint layout,
I'm going to give it an ID. Let's say ID, I'm going to say parent. Okay, now let's initialize
all of these UI elements. I'm going to do that inside another method. Let's name that
method it needs to be used. First of all, let's create that method down in here, private
void in interviews. First of all, let's add a look. Let's get started. Let's minimize
this project thing. And let's initialize once again, I'm going to fast forward the process
of initializing these UI elements. I think I have a typo in here. But I have set an ID
for this pretend register. Let's quickly fix that in our layout file. If I click on this
register button in here, you can see my type of sorry for that, I also need to change it
in here. Okay, now that we have initialized all of our views, I'm going to set an onclicklistener.
First of all for my btn peak image, I'm talking about this one in here. So after this method,
I'm going to say btn peak image dot set onclicklistener new onclicklistener. Let's just show a toast message. We haven't
seen how to pick an image for example from a gallery, or for that matter to take a picture
using the device's camera for that. We are just going to show this first message. After
that let's define an onclicklistener for our btn finish or btn register. I believe I named
it set onclicklistener new onclicklistener. I'm going to do the job inside another method,
let's say in its register. Let's create that method down in here. Let's say private void
we need to register Once again, let's add a look. Let's say start in here. First of
all, I'm going to check that if the user has entered all of the data for that, I'm going
to say if I'm going to create another method, I will create that in a minute. But let's
say if validates data. If that's the case, we are going to continue. Let's quickly create
this method down in here. And let's see what we are going to do inside this method. Private
the return type is going to be a Boolean, let's say private, Boolean, validate data.
Once again, let's add a lot. Let's say if edit txt name dot get text.to string if it's
equal to an empty string. First of all, we are going to show the warning text. So let's
say txt warning, txt warning name, dot set visibility. Let's fast be Zeebo. I believe
you have seen this previously in the course after that we are going to return false it
means that we didn't validate the data so we shouldn't continue our code. In this method
inside this if statement, let's create three more if statement for the other three edit
texts. If edit text, email dot get text.to string is equal to an empty string. txt warning
email, dot set visibility, once again, is also going to return false in here as well.
Also, in each one of these cases, before returning false, we are going to change the text of
our txt warning. Because if you remember, in the layout file, we didn't change the text
of that burning text view. So I can say txt warning name, for example, dot txt, let's
just say enter your name. Similarly for the other three cases. And after all of these
if statements after all of these cases, if we reach to this point we are going to return
true, it means that the user has entered all of the data. So inside this validate data
methods, we are validating that the user filled all of the blanks after that inside this init
register method inside this if statement, we are going to check that if the user agrees
to our license agreement. So let's say if agreement check that is checked this option
in here. If that's the case, we are going to continue. But in the else case, we are
just going to show a toast message. Let's say you need to agree to the license agreement.
But if the user reaches to this point where the user enters all of the data and also agree
to the license agreement, we are going to show a snack bar. Let's do that in another
method, let's say show a snack bar. Let's create that method down here. Private void
show snack bar. Once again, add a log. And then in here inside this method, first of
all, we need to change the visibility of all of our warning texts, because those warnings
are no longer valid. So let's say txt warning name that says visibility, let's say gone
This time, let's do the same thing for the other three remaining burning texts. After
that, we need to show our snack bar. If you remember, we can do something like this, we
can say snack bar that make First of all, we need to pass our constraint layout, which
is our parent in this case, after that we need to text in here right now I'm going to
show a dummy text. For example, I'm going to say user registered. But later on, I will
change this text for example, I will show the details of the newly registered user.
For now let's say user registered. After that we need the constant for the length of our
snack bar, I'm going to say snack bar dot length indefinite. Let's also define an action
button for our snack bar. I'm going to say that's an action. For the text, I'm just going
to say dismissed. Let's also create an onclicklistener, let's
say new onclicklistener. For the time being I'm not going to do inside this onClick method.
Later on, we will clear our edit text. Let's finish creating our snack bar. But before
that, we just need to show it. Let's say dot show. Let's run the application. And let's
see if we have right everything correctly. First of all, let's click on the speak Image
button, we should see a toast message. You can see that you have to be talked about.
Let's enter some data. And let's register a new user. Let's say Mesa, let's add an email.
Let's enter a password. Let's re type our passport. We also need to check that if these
two are the same. I forgot to do that. I will do that after the testing of this phase of
the application before registering the user. I'm going to uncheck this alone. License Agreement
checkbox, let's say register, you can see that you need to agree to the license agreement.
Let's check it once again. And let's register this time we should see this network user
register, it seems like our application is working fine. If we press dismiss, the snack
bar will be dismissed. Also, let's delete this email in here. And let's see if we get
the warning text. If we click on this register button, you can see that insert your email,
you're successfully validating our data. If we enter an email in here, for example, may
sound@gmail.com. And if we click on the Register button, we should see that the email warning
text disappears. Okay, now I'm going to change the application. First of all, I'm going to
check that these two are the same. After that, I'm also going to empty all of these for any
text. When I click on this dismiss button so that we can add a new user. Also, I'm going
to change the text of this snack bar to the details of our newly registered user. Let's
quickly do that. First of all, inside this validate data method, I'm going to add another
use case, let's say if edit text passport, this font dot get text to string. If that's
equal to our edit text, password, repeat that get text to string. If that's the case, or
let's change our logic, let's say if that's not the case. First of all, we are going to
change the visibility of this txt warning password repeat. And after that, we are going
to return false let's say p x the warning password repeat dot set visibility, let's
say visible after that, I'm going to change the text I'm going to say txt warning, repeat
that set text. Let's say password doesn't match. Up. After that I'm going to return
false. Okay, now that we have validated this data successfully, let's go to this onClick
method. And in here, let's clear our edit text. I'm going to say Edit Text email or
any text name, that's a text. Let's just pass an empty string. Similarly for the other three
edit text. Next thing that I'm going to do is that I'm going to change the text of this
snack bar. First of all, I'm going to create that text above in here, inside this short
snack bar method. Before everything I'm going to get the user's data. For example, let's
say the string name is equal to edit txt name, dot get text.to string. Similarly, for the
email, I'm going to say a string email is equal to edit text email dot get text.to string,
I'm also going to get users gender and also country, let's say a string country is equal
to countries a spinner that get selected item.to string for getting the user's gender, I'm
going to create a switch statement before that I'm going to create a string, let's say
string gender is equal to an empty string. After that, let's create a switch statement
on our radio group, or ad group gender that get checked radio button ID. Let's say in
case it's our.id dot radio button male, we are going to change the value of this gender
string, let's say gender is equal to make Sorry about that. Let's also add a break in
here. Another case our.id dot female. Let's say gender is equal to female. This default
case should never happen. But just for security purposes, if something goes wrong, I'm assigning
unknown to the gender a string. So after the switch statement, we have all of the data
about our user. Now we can create the text that we want to show inside the snack bar.
Let's say let's drink a snack text is equal to and let's create our text. First of all, I'm
going to say name, plus the name that we created, or we got from the Edit Text name. After that,
I'm going to add a backslash n in order to go to the next line, let's say email, plus
the email. Once again and backslash n. Let's also show the gender and country, let's say
gender, plus the gender, once again, backslash n and also let's show the country. Now that
we have created this text, we can show it in our snack bar. So this time, instead of
this text, I'm going to save the snack text. Let's run the application once again. And
let's see if we have fixed our application successfully. Let's test the different cases.
First of all, let's check that if we see the warning if we enter different passwords in
these to edit text. In the password field, I'm going to enter 123456 but in the reenter
password edit text, I'm going to say 12345. If we click on this register button, we should
see the warning text password doesn't match. Okay, let's add six in here. Now they do match,
let's change the country to, for example, Switzerland. And also let's change the gender
in here to female. And let's see if we can reduce there any user. In here you can see
that we are seeing the snack text that we have created. But we are not seeing all of
it, we are seeing only the first two lines. If you want to change the maximum line attribute
of your snack bar, you can do that. First of all, you need to get the instance of your
snack bar. After that, you need to get the text view of your snack bar. And after that,
you can change the max line attribute on your text view. This way, you can override the
maximum line attributes of the text view of your snack bar. But that seems like a lot
of work. And we are not going to do that in here. We will do that later on in the course
in other places when we use a snack bar. But in here, if you want to make sure that you
have created your snack tics successfully, you can simply log it. For example, in here,
I'm going to add a look. Let's say log D, let's say a snack bar text. Let's pass our
snack text. But before I run my application and test this, I'm going to click on this
dismiss button. If you remember, we write the logic so that we clear all of our edit
text. Let's click that. And you can see we are now ready to register a new user. Let's
run the application once again. And let's test this snack text. For that I'm going to
open the logcat. Let's enter some data in here. And let's click on this register. You
can see the snack text in here name may Some may be some@gmail.com gender male country,
Norway, it seems like we have created our text successfully. Okay, I think that's enough
for this video, I hope that you have solved the challenge. In the next section of the
course we are going to create the first of four of our applications. Now we know about
Java. Now we know about user interface. And in the next section of the course we are going
to combine these two and we are going to create our first real world application. Beside practicing
everything that we have learned so far, we are also going to learn a lot of new stuff
as well. So stay tuned for the next section of the course. And as always see you in the
next video. What's up everyone, I hope you're having fun. Before we start creating our sample
application, I would like to remind you that there is an extended version of this course
that you can watch. by enrolling in the extended course you will have lifetime access to more
than 60 hours of videos, you can ask your questions directly from me and I will come
back to you within hours, you will have access to all of the source codes that I wrote in
the videos. And also you can have access to all of the new videos that I upload, just
check out my code.org for more details about the course. And don't forget to use Free Code
Camp as the coupon code to get 20% discount. If you want to get serious in Android app
development. Taking the extended course is almost a necessity. Okay, everyone, I just
wanted to remind you that there is an extended version of this course that you can take without
further ado, let's start creating our sample application. Have fun learning. Hello, everyone, and welcome back. In this
section of the course we are going to create the first application of the for real world
application that I promised. It's important to say that in creating this application beside
practicing everything that we have talked so far, we are also going to learn a lot of
new stuff. You will see them in action when we create the application. Okay, now let's
talk about application itself, we are going to create an application that will help the
user to manage his or her library. In this application, we are going to show a list of
different books to the user. And the user can see the details of that book. later on.
If the user wants he or she can add that book to different lists, for example, at least
that indicates that the user has already read this book, or maybe a wish list or also a
favorites list. We will see all of them later on in the course. In the process of creating
this application, we are going to practice all of our knowledge about user interface
and Java. And beside that we are going to learn about a lot of new concepts. After watching
this section of the course you can change the application that we create together and
you can even publish it in the Play Store. So I highly suggest that you watch this section
of the course and don't skip it. Okay, without more talking, let's create our project and
let's start writing our application. I'm going to start with empty activity as before. Let's
change the name of this application to my library. For the other fields in here, I'm
not going to change anything For the package name, once again, I'm going to put my website's
name in backward, or dot maker dot project name, which is my library to save location
is fine languages Java, and we are going to save with API level 19. For the minimum SDK,
we are also not using the support library, so I'm not going to check this option in here.
Let's create our project. And let's start working on our layout file. Before everything,
I'm going to add material design library dependencies into my project, because we are going to need
them for that, let's go to material.io. Let's go to this Developer tab. Let's select Android
from here, documentation getting started. Let's copy this line of code. We have done
this previously. So I'm not going to export anything here in our Gradle scripts, build
that Gradle module app into dependencies. Let's add that. And also the latest version
is 1.1. Point. Oh, so let's change this one. And let's sync our project. It seems like
we have added the material components successfully. First of all, let's change the style of our
application in values as those that XML instead of this app compat theme, I'm going to use
theme that material components that light. Let's close this. And let's switch to our
activity main dot XML file. Our application is going to have multiple pages later on,
we will see how we can create multiple pages or to be specific multiple activities. But
for now, this is going to be the first page or the first activity of our application.
And let's quickly design that. First of all, I'm going to have a text view for the name
of this application. After that, I'm going to add a few buttons. One for the list of
all books, I'm going to show the list of all of books by clicking on this button. I'm going
to add five more buttons and I will talk about them. Let's also add an image view above in
here for our logo. For now I'm going to stay with one of our avatars. And also I'm going
to add a text view in here for licensing. Let's give some ideas to our elements. For
this one, I'm going to name it IMG logo, because it's going to be our logo. For the TextView
I'm going to say txt name, but I'm not sure that we need an ID for this one. This button
in here is going to show a list of all of our books. So let's say btn all books. Also,
let's change its text to show all books or see all books. Beside that I don't like that
this text is in all caps. If you want, you can change that you need to search for all
caps, this text all caps, and you can change its value. Let's change it to false. Now you can see
that this text is much more better. For the second button, I'm going to change its ID
to btn currently reading because this button is going to show the list of the books that
the user is currently reading, let's say btn currently reading. And let's change the text
to currently reading books as well. Like before, let's change the text all caps value to false
as well. For the third button, I'm going to change its ID to btn already read because
this button is going to show the list of books that the user already read. So let's say btn
already read. Let's change the text to already read books. Once again, let's change the text
all caps attribute to false. For the fourth button, I'm going to change its ID to btn
want to read book. Let's say btn want to read because this button is going to show the list
of different books that the user wants to list. Basically, this is the wish list. Let's
also change the text. Let's say your wish list. Let's change the all caps attributes.
That seems better. The fifth button I'm going to change its ID to btn favorite books, let's
say btn favorite. And for its text, I'm going to say see your favorites. Once again, let's
change the all caps attribute. And for the last button, I'm going to change its ID to
btn. About by clicking on this about button, we are going to show a dialog in which we
will show some information about this application, let's say within about, and let's change its
text to about. For this button, I'm not going to change its all caps attributes, because
I think it's better this way. Let's also give an ID to this text view as well. Let's see.
txt license, I'm going to change its text to developed by mesa@miko.org. I'm also going
to change the style of this book to atelic. Let's search for text style. Let's change
this font to its attic. Also, let's change the text of the first text view to the name
of our application. I'm just going to put my library in here. Later on, we will change
the font of this TextView as well. Okay, let's add our constraints. Also, you can see that
I'm using the constraint layout in here, but feel free to use the relative layout or linear
layout. I'm more comfortable with constraint layout. So I'm using constraint layout, let's
add our constraints. I'm going to add a margin top of maybe 70 dP for this image view. But
before that, I'm going to move my TextView because right now I cannot see that. Okay,
now let's add the margin top, I think 50 dP would be better. Now let's concentrate our
TextView to the bottom of our image view. And also to the both side of our screen. We
also need a margin top. I think once again 50 dP will be fine. It seems too much, let's
say 40 dP, let's concentrate all of these buttons. For this one, I'm going to constraint
it to the bottom of my TextView. And also to both sides of my screen, I need the margin
top, let's say 30 dP. After that, let's constrain the second one, I'm going to fast forward
the process in here. Sometimes like this, if the items are too close to each other as
before, we can select both of the items. And by right clicking we can use this right click
menu. Let's say we can currently reading top to bottom between all books. Let's add a margin
in here by selecting our button margin top I think 16 would be fine. It seems too much.
Let's say 10 db. Also for the second month. For this last TextView in here, first of all
I'm going to constrain to to the bottom of my screen. And also beside that I'm going
to concentrate it to the both edges of my screen so that it would be centered. Also,
let's add a margin bottom of maybe 16 db, that seems better. For this image view, I'm
not going to use a sample data. Instead, I'm going to show the actual image. I have prepared
an image in here on my desktop. Let's use that I'm going to copy this image. Let's add
it into our mid map folder. Resources map, right click and paste I think the name is
fine. And let's switch to our split view. For this image view, if you click on that,
first of all, let's delete this last attribute this tools source compat and instead of that,
let's use source. let's address the image that we just added into our project. It seems
too large, we need to pass the width and height manually. Let's see 150 dP I think that's
fine. And also 150 dP for the height. That seems a little bit better. For this mind library.
If you remember we had an attribute called font family. Let's search for that in the
design view. font family if we click on this arrow more fonts. Let's search for a good
font. Once again, these are the Google fonts, and you can use them in your projects free
of charge. I think this lemon font is good, let's add font to our project. And let's press
OK. You can see that the font has changed. Let's also increase the size a little bit.
Let's search for text size. And instead of 14 sp, let's say 18. So that seems better.
The next thing that I'm going to change in this layout file is the width of all of these
buttons. I want my buttons to have the same width right now you can see that these have
an ugly shape. If we click on one of our buttons, let's switch to a split view. Once again,
let's click on that. For the width. If we say 200 DPI, I think that would be fine. Yes.
For all of our buttons for the video, I'm going to say 200 DPI, you can see that it's much better now. Okay,
this is going to be the layout for the first page of our application. Let's quickly initialize
the necessary items in our Java file. By pressing double shift, you can search for main activity
dot java file. And in here, let's initialize our UI elements. Let's also initialize these buttons down below
inside this onCreate method. I'm going to do that inside another method, let's say you
need to be used. And let's create that method by pressing ALT plus enter. Once again, I'm
going to fast forward the process of initializing these buttons. By clicking on each one of these buttons beside
this within about I'm going to navigate the user to another activity. Up until this point,
our applications had only one activity, which was named main activity. But if we want, we
can create another activity in our application as well. We are going to talk about activities
and fragments in the next video. But creating an activity is really simple. There are a
lot more concepts regarding activities, we will talk about them later on. But in here,
if you want to create an activity, you can do something like this in your project inside
Java folder. Inside your project folder, you can right click on that by saying new activity.
In here you can see that you have few options. The names of some of these activities may
be familiar from that gallery view from where we created our project. But basically in here,
we need this empty activity. You can also select this gallery, in which you will get
the same dialog when you created your application. Let's select empty activity. Once again. In
here we can name our activities. The convention in here is that to use the keyword activity
in naming and also, you cannot use a spaces and also other strange characters. For the
name of this activity in here, I'm going to name it all books activity, because this is
going to be the activity that we are going to navigate the user when the user clicks
on that see all books button. So let's say all books activity. You can also see a checkbox in here it says
that if you want to generate a layout file for your activities, it is possible to create
an activity with only the Java file and not the XML file. We will talk about that in the
next section of the course. But in here, we do need a layout file. So I'm going to leave
this one checked in here. You can see that when I changed the name of my activity, also
the layout name changed as well. In the layout name, you cannot use upper cases letter. And
as you can see all the letters change to lower cases. Beside that you cannot have spaces.
You have another option in here to indicate that if this activity is going to be a launcher
activity. Basically, in every application, one of the activities can be launcher. Right
now the launcher activity in our application is this main activity. It means that when
we launch our application, this main activity is going to be shown. And for that I'm not
going to check this option in here. Also, if you don't check this option in here, if
you change your mind, you can change in your manifest file later, but more on that later
on in the course, the package name is fine, we are going to create this activity in our
package. And for the language of this activity once again, I'm going to use Java. Let's finish
creating our activity. And let's see what happened in our project. So first of all,
a new Java class has been added into our package, you can see that we have this all books activity
dot java file. Beside that in our Resources folder, in the layout folder, we have this
activity all books dot XML. Both of these has been created by the Android Studio. Beside
that if you take a look at your manifest file, this Android manifest dot XML, you can see
that in here we have a new line, we have a new activity tag in our application tag, it
means that now our application has two activities. If you want to create your activities yourself
without the help of Android Studio, that is possible. Basically, you can create a java
file. After that you can create a new layout file. And beside all of these, you need to
add this tag into your application tag inside the manifest file. Also, you need to link
the Java file and layout file in your onCreate method. We will take a look at that in a minute.
But instead of all of these, we have used the help of Android Studio. Okay, let's close
this manifest file. And let's switch to activity all books dot XML file, you can see that in
here we have another layout in which we can design for this activity. In this video, I'm
not going to design the layout for this activity, instead, I'm just going to change its background
color. If we switch to a split view in here, once again, you can see that we have a constraint
layout. And inside the opening tag of this constraint layout, I'm going to say background,
and I'm going to pass a color. For example, I think I'm going to pass this color accent.
I'm doing this because I'm just going to indicate that we have navigated the user from the main
activity to this artbooks activity. Okay, now let's see how we can navigate the user.
Let's close both of these files. These are all books activity dot XML file, and also
this albox activity dot java file. I said that we are going to navigate the user to
the other activity by clicking on this button all books activity, so we need to create an
onclicklistener in here, let's say btn. All books that set onclicklistener. Let's pass
in the onClick listener. And inside this onClick method is the place to write the logic to
navigate the user. In here, I'm going to use an object that I have never used so far, and
that object is called intent. You can see that it's coming from Android dot contents
package. Let's import that. Let's name it intent is equal to new intent. It's a simple
Java class that we have defined. It's like any other Java class. The constructor of this
intent needs two things. First of all, we need to pass a context in here, because we
are inside this main activity. And hopefully by now we know that activities are context,
we need to pass main activity dot this. Let's pass that main activity dot this. After that
we need to pass the destination activity where you want to navigate the user to for example,
I can say all books activity dot class. So this way, we are saying that this intent
is going to navigate us from the main activity to all books activity. After that when we
created our intent, we can call an inner method in here called start activity, you can see
that this start activity needs an intent. And we can pass our intent safely. This start
activity is an inner method like this fine view by ID which exists inside every activity.
Now if we run our application, we should see that when we click on this button, the user
will be navigated to all books activity. Let's quickly test that. Right now you can see that
we have few issues with our layout. First of all, we cannot see this license TextView
for that we need to decrease the margins from here. And also beside that this currently
reading books text does not fit in our button. We will increase the width of all of our buttons
as well. But for now, if we click on this see all books button, we can see that we are
navigating to the other activity. Beside that if you press this back button. Once again
we will be navigated to our main activity. It seems to be working perfect. Let's quickly
fix the issues with our layout and let's To finish off this video in our activity main
dot XML file. First of all, let's decrease the margins. For example, this margin top,
I'm going to change it to 30 dP beside that margin top of this my library text. Let's
decrease that to 30 dP. That seems better for all of my buttons. Instead of 200 dP,
I'm going to say 230 dP. For example, for the first one, let's say 230 dP. Let's run
the application once again. And let's see if we have fixed the issues successfully.
The layout seems better. Okay, I think that's enough for this video. Just before I finish
off, I'm going to say that you can check the source code for this application@maker.org
slash code. So feel free to check that if you need I upload the source code at the end
of every video. Also, we'd be very happy to see your feedback. Okay, in the next video,
first of all, we are going to create a model for our books beside that we will create a
recycler view and recycler view adapter to show a list of different books inside the
second activity. See you in the next video.