SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Custom UI Components
 
Widgets and Layouts are
used to construct a UI.
• A Widget is a UI element, like a text field or button
• Layouts are invisible containers, like LinearLayout or
  RelativeLayout
Widget != Widget
Widget
Layout
View Hierarchy
Why build custom
components? Isn't
there enough already?
Free
37 SEK
public void onCreate(Bundle savedInstanceState) {
    ....
    mPriceTextView = (TextView) findViewById(R.id.price);
    mPriceTextView.addTextChangedListener(new TextWatcher() {
         @Override
         public void onTextChanged(CharSequence s, int start,
                 int before, int count) {
             if (getText(R.string.free).equals(s.toString())) {
                 mPriceTextView.setTextColor(
                     getResources().getColor(R.color.free));
             } else {
                 mPriceTextView.setTextColor(
                     getResources().getColor(R.color.rent));
             }
         }

          @Override
          public void beforeTextChanged(CharSequence s, int start,
                  int count, int after) { }

          @Override
          public void afterTextChanged(Editable s) { }
    });
}
We can solve this
problem with custom
components.
When building a fully
customized component
extend View.
Need to override onDraw
to be able to show
something.
•   2D graphics
•   Text in different variations
•   Other components
•   Or pretty much anything else
onMeasure should be
overridden by subclasses
to provide measurement
of their contents.
Custom widgets can
really be as complicated
as you need them to be.
Not so fully customized
components.
PriceView
public class PriceView extends TextView implements TextWatcher {

    public PriceView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onTextChanged(CharSequence s, int start,
            int before, int count) {
        if (!TextUtils.isEmpty(s) && getResources()
                .getText(R.string.free).equals(s.toString())) {
            setTextColor(getResources().getColor(R.color.free));
        } else {
            setTextColor(getResources().getColor(R.color.rent));
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start,
            int count, int after) {
    }
}
<TextView 
    android:id="@+id/price"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/free"
    android:textSize="30sp"
    />

<com.markupartist.demo.ao11.demo2.PriceView 
    android:id="@+id/price"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/free"
    android:textSize="30sp"
    />
Demo
  
Compound Components




 priceView.setPrice(
     new Price(amount, currency)
 );
 
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
    <TextView
        android:id="@+id/amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/rent"
        android:textSize="30sp"
        />
    <TextView
        android:id="@+id/currency"
        android:paddingLeft="5dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        />
</LinearLayout>
public class PriceView extends LinearLayout {
    private TextView mAmount;
    private TextView mCurrency;
    public PriceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout priceView = (LinearLayout) inflater.inflate(
                R.layout.priceview, null);
        mAmount = (TextView) priceView.findViewById(R.id.amount);
        mCurrency = (TextView) priceView.findViewById(R.id.currency);
    }
    public void setPrice(Price price) {
        mAmount.setText(price.getAmount());
        mCurrency.setText(price.getCurrency());
    }
}
Demo
  
How to debug and
optimize the UI?
$ ./tools/layoutopt
$ ./tools/hierarchyviewer
Demo
Hiearchy Viewer
Reduce the number of
views in the view tree
with <merge>
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/rent"
        android:textSize="30sp"/>
    <TextView
        android:id="@+id/currency"
        android:paddingLeft="5dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"/>
</LinearLayout>
<merge
    <TextView
         android:id="@+id/amount"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textColor="@color/rent"
         android:textSize="30sp"/>
    <TextView
         android:id="@+id/currency"
         android:paddingLeft="5dip"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textSize="30sp"/>
</merge>
And...

inflater.inflate(
    R.layout.priceview,
    null
    this,
);
    true
);
Demo
Hiearchy Viewer
isInEditMode()
 
Photo by anarchosyn, http://www.flickr.com/photos/24293932@N00/4530523480/
Sets of properties that specifies the
look of a Widget. This can be
properties such a width, height and
colors. The concept is similar to
CSS and separates presentation
from the content.
Styles and Themes
• Custom attributes
• Styles
• Themes
Custom attributes
<com.markupartist.demo.ao11.demo5.PriceView
    android:id="@+id/price"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:amountText="37"
    app:currencyText="SEK"
    />
Goes into
res/values/attrs.xml
• Declared in the top <resources or in the <declare-stylable>
  element
• The <attr> element has two attributes name and format
   – Name is used when referring from code e.g.
     R.stylable.PriceView_amountText
   – Format defines the value it represents
      •   Reference
      •   Color
      •   String
      •   Boolean
      •   And a few more
Custom Attributes
<resources>
    <attr name="amountStyle" format="reference" />
    <declare-styleable name="PriceView">
        <attr name="amountText" format="string" />
    </declare-styleable>
</resources>

public PriceView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray array = context.obtainStyledAttributes(
        attrs, R.styleable.PriceView, 0, 0);
    String amountText =
        array.getString(R.styleable.PriceView_amountText);
    // Set amount to the view...
    array.recycle();
}
Styles goes into
res/values/styles.xml
<merge>
    <TextView android:id="@+id/amount" style="@style/AmountText"/>
    <TextView android:id="@+id/currency" style="@style/CurrencyText"/>
</merge>

<style name="PriceText" parent="android:style/Widget.TextView">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">30sp</item>
</style>

<style name="AmountText" parent="@style/PriceText">
    <item name="android:textColor">@color/rent</item>
</style>

<style name="CurrencyText" parent="@style/PriceText">
    <item name="android:paddingLeft">5dip</item>
</style>
A problem with styles is
that it's hard to change
the style of an View
that's included within a
compound component.
And we can't change the
style in runtime.
Themes, a style that’s
 applied to a whole
 Activity or Application
• With custom attributes we can provide a way to
  style views within compound components
• Makes it easier for others to override default styles
• This can be hooks for styles, dimensions, colors...
<attr name="amountStyle" format="reference" />

<TextView android:id="@+id/priceview_amount"
  style="?attr/amountStyle" />

<style name="AO11Theme" parent="android:style/Theme">
  <item name="amountStyle">@style/AmountText</item>
</style>

android:theme="@style/AO11Theme"

<style name="AO11ThemeCustom"
       parent="android:style/Theme.Light">
  <item name="amountStyle">@style/CustomAmountText</item>
</style>

android:theme="@style/AO11ThemeCustom"
How do we make a custom
component available for
other applications.
• We can't use JAR
• We don't want to copy-paste resources
Library Projects
• Holds shared code and resources
• Resources are merged at build time
• Can be used for
  – Custom components
  – White label apps
  – Paid and free versions of the same app
Thank you

https://github.com/johannilsson/ao11

Mais conteúdo relacionado

Semelhante a Custom UI Components at Android Only 2011

Day 8: Dealing with Lists and ListViews
Day 8: Dealing with Lists and ListViewsDay 8: Dealing with Lists and ListViews
Day 8: Dealing with Lists and ListViews
Ahsanul Karim
 
Big Data for each one of us
Big Data for each one of usBig Data for each one of us
Big Data for each one of us
OSCON Byrum
 
Responsive mobile design in practice
Responsive mobile design in practiceResponsive mobile design in practice
Responsive mobile design in practice
Kirill Grouchnikov
 
Android tutorials8 todo_list
Android tutorials8 todo_listAndroid tutorials8 todo_list
Android tutorials8 todo_list
Vlad Kolesnyk
 
Android tutorials8 todo_list
Android tutorials8 todo_listAndroid tutorials8 todo_list
Android tutorials8 todo_list
Vlad Kolesnyk
 

Semelhante a Custom UI Components at Android Only 2011 (20)

Day 8: Dealing with Lists and ListViews
Day 8: Dealing with Lists and ListViewsDay 8: Dealing with Lists and ListViews
Day 8: Dealing with Lists and ListViews
 
Android 2
Android 2Android 2
Android 2
 
Big Data for each one of us
Big Data for each one of usBig Data for each one of us
Big Data for each one of us
 
SE2016 Android Mikle Anokhin "Speed up application development with data bind...
SE2016 Android Mikle Anokhin "Speed up application development with data bind...SE2016 Android Mikle Anokhin "Speed up application development with data bind...
SE2016 Android Mikle Anokhin "Speed up application development with data bind...
 
Android App Development - 04 Views and layouts
Android App Development - 04 Views and layoutsAndroid App Development - 04 Views and layouts
Android App Development - 04 Views and layouts
 
Responsive mobile design in practice
Responsive mobile design in practiceResponsive mobile design in practice
Responsive mobile design in practice
 
Android tutorials8 todo_list
Android tutorials8 todo_listAndroid tutorials8 todo_list
Android tutorials8 todo_list
 
Android tutorials8 todo_list
Android tutorials8 todo_listAndroid tutorials8 todo_list
Android tutorials8 todo_list
 
Android 3
Android 3Android 3
Android 3
 
Android Tutorials - Powering with Selection Widget
Android Tutorials - Powering with Selection WidgetAndroid Tutorials - Powering with Selection Widget
Android Tutorials - Powering with Selection Widget
 
Introduction to Spring MVC
Introduction to Spring MVCIntroduction to Spring MVC
Introduction to Spring MVC
 
JavaScript Refactoring
JavaScript RefactoringJavaScript Refactoring
JavaScript Refactoring
 
Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)
 
Android crashcourse
Android crashcourseAndroid crashcourse
Android crashcourse
 
Nicola Corti - Building UI Consistent Android Apps - Codemotion Milan 2017
Nicola Corti - Building UI Consistent Android Apps - Codemotion Milan 2017Nicola Corti - Building UI Consistent Android Apps - Codemotion Milan 2017
Nicola Corti - Building UI Consistent Android Apps - Codemotion Milan 2017
 
What's New in Android
What's New in AndroidWhat's New in Android
What's New in Android
 
MVVM & Data Binding Library
MVVM & Data Binding Library MVVM & Data Binding Library
MVVM & Data Binding Library
 
Academy PRO: React native - building first scenes
Academy PRO: React native - building first scenesAcademy PRO: React native - building first scenes
Academy PRO: React native - building first scenes
 
07_UIAndroid.pdf
07_UIAndroid.pdf07_UIAndroid.pdf
07_UIAndroid.pdf
 
Knockoutjs UG meeting presentation
Knockoutjs UG meeting presentationKnockoutjs UG meeting presentation
Knockoutjs UG meeting presentation
 

Mais de Johan Nilsson

Mais de Johan Nilsson (11)

Utmaningar som tredjepartsutvecklare för kollektivtrafikbranchen - Kollektivt...
Utmaningar som tredjepartsutvecklare för kollektivtrafikbranchen - Kollektivt...Utmaningar som tredjepartsutvecklare för kollektivtrafikbranchen - Kollektivt...
Utmaningar som tredjepartsutvecklare för kollektivtrafikbranchen - Kollektivt...
 
GTFS & OSM in STHLM Traveling at Trafiklab
GTFS & OSM in STHLM Traveling at Trafiklab GTFS & OSM in STHLM Traveling at Trafiklab
GTFS & OSM in STHLM Traveling at Trafiklab
 
STHLM Traveling Trafiklab
STHLM Traveling TrafiklabSTHLM Traveling Trafiklab
STHLM Traveling Trafiklab
 
JavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & BrowserifyJavaScript Dependencies, Modules & Browserify
JavaScript Dependencies, Modules & Browserify
 
Spacebrew & Arduino Yún
Spacebrew & Arduino YúnSpacebrew & Arduino Yún
Spacebrew & Arduino Yún
 
Trafiklab 1206
Trafiklab 1206Trafiklab 1206
Trafiklab 1206
 
new Android UI Patterns
new Android UI Patternsnew Android UI Patterns
new Android UI Patterns
 
FOSS STHLM Android Cloud to Device Messaging
FOSS STHLM Android Cloud to Device MessagingFOSS STHLM Android Cloud to Device Messaging
FOSS STHLM Android Cloud to Device Messaging
 
Android Cloud to Device Messaging Framework at GTUG Stockholm
Android Cloud to Device Messaging Framework at GTUG StockholmAndroid Cloud to Device Messaging Framework at GTUG Stockholm
Android Cloud to Device Messaging Framework at GTUG Stockholm
 
Android swedroid
Android swedroidAndroid swedroid
Android swedroid
 
GTUG Android iglaset Presentation 1 Oct
GTUG Android iglaset Presentation 1 OctGTUG Android iglaset Presentation 1 Oct
GTUG Android iglaset Presentation 1 Oct
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 

Custom UI Components at Android Only 2011