68

What is the advantage to using Fragments over using custom Views that are reused in different layouts?

In the original blog post introducing fragments, Dianne Hackborn says that

[Fragments] make it easier for developers to write applications that can scale across a variety of screen sizes, beyond the facilities already available in the platform.

and she goes on to explain Fragments in the context of making a tablet layout for an app that combines the UI of two activities from the phone version of the same app.

But it seems that the same reuse could be achieved using custom Views. The main different between Fragments and Views seems to be that they have differing lifecycles...

The Fragment lifecycle is:

onAttach(), onCreate(), onCreateView(), onActivityCreated(), onStart(), onResume(), onPause(), onStop(), onDestroyView(), onDestroy(), onDetatch().

The View lifecycle is:

ctor, onFinishInflate(), onAttachedToWindow(), onMeasure(), onLayout(), onDetatchedFromWindow()

I'd like to hear from developers with experience writing large apps about what benefits (if any) they've seen in using Fragments vs custom Views to divide up the UI into reusable pieces.

andr
  • 15,322
  • 10
  • 40
  • 54
avh4
  • 2,522
  • 1
  • 20
  • 23

6 Answers6

61

The main reason is that fragments are more reusable than custom views.

Sometimes you can't create a fully encapsulated UI component relying on views alone. This is because there are things you would want to put into your view but can't because only an Activity can handle them, thus forcing tight coupling between an Activity and a View.

Here is one such example. Lets say you want to create a reusable UI component that, among many things, want to capture a photo and do something with it. Traditionally you would fire an intent that starts the camera and returns with the captured image.

Notice that your custom UI component can't fully encapsulate this functionality because it will have to rely on hosting Activity's startActivityForResult because views don't accept activity results (they can indirectly fire an intent through context).

Now if you wanted to reuse your custom UI component in different activities you would be repeating the code for Activity.startActivityForResult.

Fragment on the other hand cleanly solve this problem.

Similarly your fragment can contribute items to your options menu, something traditionally only an Activity could do. Again this could be important if the state of your custom view dictates what goes in the menu.

numan salati
  • 18,866
  • 9
  • 58
  • 66
32

A fragment is way more than just a view. In fact it can even be totally without a view. It can have all sorts of stuff in it including AsyncTasks, various Listeners, file and database access and so on and so on.

Think of it as a small activity, but you can have multiple of them on the screen and work with them all including communicating with each other while they are visible.

E.g. you could have a list of shopping cart displayed in one fragment and the currently selected cart in detail in another fragment. You then e.g. change the quantity of an item in the detail view and the list view could be notified about it and update the total price in the list view. You can totally orchestrate interactions like that nicely while e.g. still having only one of them visible on a smaller screen device.

I have refactored a large business app (>15 activities) from activities to fragments to get good tablet support and I would never start a new app without fragments.

Update Feb 2016: While the above still holds true, there are complexities with fragments that caused many people to entirely avoid using them. Newer patterns such as usage of MVC approaches and more powerful views provide alternatives. As they say .. YMMV.

Manfred Moser
  • 28,342
  • 13
  • 87
  • 120
  • 13
    But I could implement that example you just gave using custom views as well. You could have views communicate with each other and check if either the tablet or phone layout is being used by the OS. Which is the same thing I see people do with fragments. What are the benefits of implementing it with fragments instead of views? – VIBrunazo Aug 21 '12 at 19:37
  • 1
    Maybe fragments offer more support for transitions, animations and are mandatory for some containers like a ViewPager, ActionBar and Tabs.. – Snicolas Feb 04 '13 at 19:12
  • 1
    @VIBrunazo see my answer below. http://stackoverflow.com/a/14912608/909956 – numan salati Feb 16 '13 at 16:44
9

Some description:

Imagine Activity as a plate that hold one big cake. Fragment would be a container that slices the same cake into pieces. Each slice contains it own logics (listeners, etc). And in total they are almost no different with the one big cake.

The benefit:

  1. When you plate can't hold a big cake. (Screen is small) You can easily use a a few plates (Activity) to hold each of them WITHOUT the need to move your logics into the new activity.

  2. Better re-usability. I have some instances where I could reuse a fragment entirely in another App. You might claim that a custom view could does that too. But refer to point 1, I could reuse it with just few lines of layout changes but for a custom view, it have to find a way to plug it into both layout and code.

  3. It is, in some sense, a more OO ways of organising your UI logics in Android programming. When you have a feature (A new partition on the screen for example), you create a new Fragment class, with minor modification to existing activity class. However if you are programming only with activity, you will need to add logics and make big modification on tested class.

Just my 2 cents. :)

Calvin
  • 3,233
  • 1
  • 28
  • 39
  • 2
    But you can easily encapsulate the logic inside each slice of cake u make without the use of fragments. i can make a nice clean activty that will only have one or two lines of code that creates and instaniates a piece of cake. all logic will be in the cakes class – Jonathan May 02 '13 at 17:10
  • So all in all fragments are just a way to **couple xml with related java source code** and have these inside one package independent from external world? I means apart from that, if we could imagine a case where graphics where also created from source code we could have used regular classes. *And by the way in Scala there is a really nice way to solve these issues just by using traits!* – George Pligoropoulos Mar 23 '14 at 14:51
  • 1
    The question is really about Fragment's vs Views, not Fragments vs. Activities. – user3614314 Jun 05 '15 at 16:25
  • Exactly that's the real thing.. Fragments Vs Views. And post 2016, there is very little I will credit to fragments being irreplaceable – user3833732 Jun 06 '19 at 19:55
4

The lifecycle methods are probably your biggest hint. If you think about it, they correlate closely to the activity lifecycle (with some hooks into the activity and views). In fact, in the article you linked, Hackborn says:

In some ways you can think of a Fragment as a mini-Activity

As with many things in software design/development, there are a multitude of ways to do things. There are many different places you could put your code. Yes, you could probably put a lot into a view, but keeping different concerns separated in different classes is a good thing though. The classic pattern of this is MVC and it applies in this scenario. You don't want to bake in too much controller logic into your view. It's better to keep it in controller-like classes which are the activity and now the fragment. This is why the fragment's lifecycle is more like the activity's than the view's--it was made to facilitate this kind of organization.

kabuko
  • 35,009
  • 7
  • 75
  • 92
  • 2
    It seems that Fragments and activities both play the controller role in MVC.. Why not use POJO classes as a way to split the controller rather than Fragments? – avh4 Mar 22 '12 at 17:28
2

I touched Fragments once and found them not very useful (see this post). From what I have read, A Fragment is really a fancy word for an Object with access to Activity Context. I like to ignore Fragments in my work, and just create these Objects myself. I have created very large, very demanding apps by passing an Activity to constructors, instead of Context. One major benefit, however, for using Fragments is that they are supported by the View layout system - so you can easily add them to Android xml (if you use it for your layouts).

Community
  • 1
  • 1
Phil
  • 34,061
  • 21
  • 117
  • 154
0

Custom views are much more work than just using fragments in place of your activities. if you decide to use Activities and custom Views, you have to create your custom view, and then you have to implement the same activity lifecycle methods in your activity (a very similar lifecycle is used for fragments).

Using Fragments also allows you to separate components into their own classes (Fragments), rather than having too much logic in a single Activity. Let me ground that with an example:

Say you're implementing a magazine reader application. using fragments, you could create a fragment: ArticleList, which displays a list of articles, and another fragment: ArticleDisplay, which handles the logic for displaying content. you can then specify how these fragments should interact using the fragments tools, so that on a handset, you can use the full screen real-estate for ArticleDisplay, while on a tablet, you can display the fragments side by side.

If you were to attempt this with an Activity/custom view, you'd have the logic for both Fragments in your monolithic Activity, you'd have to write a custom view, and you'd have to debug this unwieldy monster.

Fragments are, in general, a more sophisticated and powerful way to write your applications. They can do everything an Activity can do, and more. If you don't need the extra functionality, the defaults will probably get you where you need to go, and with less work.

Chris Bye
  • 1,028
  • 7
  • 17
  • 2
    As far as monolithic activities, why use Fragments over simply splitting the controller code out into other POJO controller classes? – avh4 Mar 22 '12 at 17:27
  • That works for the logic contained within the Fragment (and you probably should be doing this for activities and fragments both), but you still run into the issue where you have a single method call as the entry point for (at least) two control flows, that are best separated out. you only get to Override the method calls that Android uses to communicate with your class in one place, so if you have a monolithic activity, you have one OnCreateDialog() that is called for both sets of dialogs, one for each "screen". – Chris Bye Mar 22 '12 at 17:32
  • I should also add that there's hardly any downside to using Fragment instead of Activity. It's probable that won't need to write any additional code to get behavior identical to Activity with Fragment, and you have the capability to do so much more if you need to – Chris Bye Mar 22 '12 at 17:33
  • @avh see my answer below: http://stackoverflow.com/a/14912608/90995 – numan salati Feb 16 '13 at 16:46