This course will be retired on July 14, 2025.
Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Preview
Start a free Courses trial
to watch this video
In this video we'll refactor IngredientsFragment and DirectionsFragment!
This video doesn't have any notes.
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
The app looks great.
0:00
We've got all our recipes and
we can easily keep track of which
0:01
ingredients we've already added and
which directions we've already followed.
0:04
All that's left is to
handle the tablet layout.
0:09
But before we get to that, let's take
another look at the ingredients and
0:11
directions fragments.
0:15
By this point you've probably realized
that the IngredientsFragment class and
0:17
the DirectionsFragment
class are pretty similar,
0:22
which makes this a good
opportunity to do a refactoring.
0:25
Let's start by figuring out exactly
where these two fragments differ.
0:29
If we look through the code, The two
0:34
big differences are the layout and
whether we're using Recipes.ingredients or
0:40
Recipes.directions to
populate the check boxes.
0:45
But actually the layouts, except for
the IDs, are exactly the same.
0:50
So the only real difference between
these two fragments is whether
1:00
we're using Recipes.ingredients or
Recipes.directions.
1:04
Let's refactor our app to instead just
use one class named CheckBoxesFragment.
1:09
Then when we create this fragment,
1:15
we can tell it what to display,
ingredients or directions.
1:17
So in addition to passing in the index,
we'll also be passing in a boolean.
1:21
If that boolean is true,
1:27
our CheckBoxesFragment
will show the ingredients.
1:28
And if that boolean is false,
1:32
our CheckBoxesFragment
will show the directions.
1:33
Over in ViewPagerFragment,
1:37
let's start by creating a new
key named KEY_IS_INGREDIENTS.
1:40
Psfs, Enter,
1:46
KEY_IS_INGREDIENTS =
1:49
"key_is_ingredients".
1:54
Next, let's create our
CheckBoxesFragment class.
2:02
But instead of actually
creating a new class,
2:06
let's just rename IngredientsFragment.
2:09
It's already most of the way there.
2:11
Right-click on IngredientsFragment
in the project pane on the left.
2:13
Select Refactor > Rename,
which has a shortcut of Shift+F6.
2:19
And then let's name it CheckBoxesFragment.
2:25
Then it asks if we want to
rename our variable as well.
2:32
But we don't, so let's just hit OK.
2:35
While we're at it,
2:39
let's also rename the ingredients
layout to fragment check boxes.
2:40
Shift+F6, fragment_checkboxes.
2:44
And inside this layout, let's rename
the id to checkBoxesLayout as well.
2:53
Shift+F6, checkBoxesLayout.
2:59
And make sure you're using
the actual rename option.
3:09
This way, these will be updated
everywhere and not just in this one file.
3:12
Then, back in our CheckBoxesFragment
class, which used to be the ListFragment
3:18
class, the layout name and
layout id should already be updated.
3:23
So let's start by retrieving the
isIngredients boolean from the arguments.
3:28
Right below where we set the index,
3:33
let's create a new boolean
variable named isIngredients.
3:35
And set it equal to
getArguments[].getBoolean[ViewPagerFragme-
3:43
nt.KEY_IS_INGREDIENTS].
3:50
And now that we know which type of
fragment this is, ingredients or
3:57
directions, we just need to grab
the right data from the Recipes class.
4:01
But first, since this class is
now a little less specialized,
4:06
let's rename the ingredients
array to contents.
4:10
Shift+F6, contents.
4:13
Then on the next line,
4:18
let's create an if statement to help
us populate our new contents are read.
4:20
if (isIngredients) is true,
4:26
we'll set the contents array
equal to the ingredients for
4:29
this recipe, which we can copy and
paste from up here.
4:33
Otherwise we'll set the contents
array equal to the directions.
4:44
Else, Copy and paste and change and
ingredients to directions.
4:49
And now, since our contents array
will always be overwritten,
4:58
we can delete the initial assignment.
5:01
Last, and definitely least,
5:06
let's update the setUpCheckBoxes
method to use better variable names.
5:08
Let's refractor ingredients to be
contents, and ingredient to be content.
5:14
Now back in our ViewPagerFragment class,
5:24
let's update our two bundles to include
the KEY_IS_INGREDIENT argument.
5:27
Right above where we set the arguments for
our ingredients fragment,
5:32
let's add
bundle.putBoolean(KEY_IS_INGREDIENTS,
5:35
true), because this is
the ingredientsFragment.
5:44
Then let's copy this,
Paste it down here and
5:49
change true to false, because this
isn't the IngredientsFragment.
5:54
And as the very last step, let's make
our DirectionsFragment be of type
6:00
CheckBoxesFragment instead
of DirectionsFragment.
6:04
Which also means that we don't need
our DirectionsFragment class or
6:13
layout anymore.
6:17
So let's delete those.
6:18
Now let's test the app and
6:28
make sure everything still works
just the same as it did before.
6:29
Nice, it looks exactly the same and
we've got a lot less code.
6:41
Great job!
6:46
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up