12. 12
Auflösungsklassen
/res/drawable ist nur für XML!
Grafiken immer in Ordner mit
Auflösungs-Klassifizierer verwalten
๏ Projekt-Ressourcen
drawable-120dpi
drawable-160dpi
drawable-240dpi
drawable-320dpi
drawable-480dpi
?
Thursday, March 14, 13
13. Auflösungs un abhängigkeit
13
Resources res = getResources();
DisplayMetrics metrics = res.getDisplayMetrics();
float scale = metrics.density;
px
๏ Problem: px -basierte APIs?
๏ Lösung: DisplayMetrics.density
Thursday, March 14, 13
31. Multi-Screen-Support
31
res/layout/my_layout.xml // normal screen size ("default")
res/layout-small/my_layout.xml // small screen size
res/layout-large/my_layout.xml // large screen size
res/layout-xlarge/my_layout.xml // extra large screen size
res/layout-xlarge-land/my_layout.xml // extra large in landscape orientation
๏ optimierte Ressourcen
‣ screen size qualifier (small, normal, large, xlarge)
‣ orientation qualifier (port, land)
‣ locale, etc. qualifier
@Deprecated
Thursday, March 14, 13
32. Multi-Screen-Support
32
๏ optimierte Ressourcen
‣ sw<N>dp
‣ w<N>dp, h<N>dp
res/layout/main_activity.xml # smaller than 600dp available width
res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger)
res/layout-sw720dp/main_activity.xml # For 10” tablets (720dp wide and bigger)
seit 3.2
res/layout/main_activity.xml # smaller than 600dp available width
res/layout-w600dp/main_activity.xml # any screen with >=600dp available
Die allermeisten Tablets verwenden >=3.2
res/layout/main_activity.xml # For phones
res/layout-xlarge/main_activity.xml # For pre-3.2 tablets
res/layout-sw600dp/main_activity.xml # For 3.2 and up tablets
Thursday, March 14, 13
33. 33
Screen Sizes - Smallest Width
320dp 480dp 600dp 720dp
res/layout/main_activity.xml # For phones
res/layout-sw600dp/main_activity.xml # For tablet
res/layout-sw720dp/main_activity.xml # For 10” tablets
res/layout-w600dp/main_activity.xml # Multi-pane when enough width
Best practice
Thursday, March 14, 13
41. 41
Fragments - Implementierung
Activity A
src/
Activity B
Fragment A
Fragment B
Activity A
Fragment A
Fragment B
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find our fragments
mFragmentA = (FragmentA) getFragmentManager().findFragmentById(R.id.fragment_a);
mFragmentB = (FragmentB) getFragmentManager().findFragmentById(R.id.fragment_b);
// Determine whether we are in single-pane or dual-pane
mIsDualPane = mFragmentB != null;
}
ActivityA.java
@Override
public void onItemSelected(int index) {
if (mIsDualPane) {
// display it on the article fragment
mFragmentB.displayStuff(...);
}
else {
// use separate activity
Intent i = new Intent(this, ActivityB.class);
i.putExtra("stuff", ...);
startActivity(i);
}
}
Thursday, March 14, 13
42. 42
Fragments - Implementierung II
Activity A
src/
Activity B
Fragment A
Fragment B
Activity A
Fragment A
Fragment B
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
// Determine whether we are in single-pane or dual-pane
mIsDualPane = getResources().getBoolean(R.bool.has_two_panes)
}
ActivityA.java
Alternativer
Layout-Switch
<resources>
<bool name="has_two_panes">false</bool>
</resources>
<resources>
<bool name="has_two_panes">true</bool>
</resources>
res/values/layouts.xml
res/values-w600dp/layouts.xml
Thursday, March 14, 13
43. 43
Fragments - Implementierung III programmatisch
FragmentTransaction ftx = getFragmentManager().beginTransaction();
DetailFragment fragment = new DetailFragment();
ftx.add(R.id.fragment_container, fragment);
ftx.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ftx.addToBackStack(null);
ftx.commit();
add(), remove(), replace(), show(), hide()
kein remove(), replace() auf XML-deklarierten Fragments!
Thursday, March 14, 13
45. Fragments - Lifecycle
45
onAttach()
Activity/Context steht zur Verfügung.
onCreate()
Initialisierung essentieller Komponenten,
welcher während paused, stopped, resumed
beibehalten werden sollen.
onCreateView()
Initialisierung der Fragment-(Main)View
(LayoutInflater).
onPause()
Speicherung aller Zustände, die über die
aktuelle Session persistiert werden sollen.
Thursday, March 14, 13
47. ๏ pre 3.0 devices
‣ <sdk>/extras/android/support/v4/android-support-v4.jar.
http://developer.android.com/tools/extras/support-library.html
Support Library
47
• FragmentActivity
• Fragment
• FragmentManager
• FragmentTransaction
• ListFragment
• DialogFragment
FragmentActivity.getSupportFragmentManager()
Thursday, March 14, 13
48. Support Library + Fragments + Map (pre Maps v2)
48
“Maps + Fragments +
Support package =
headache”
http://nextlevelandroid.com/?p=114
public class MapFragment extends LocalActivityManagerFragment {
private TabHost mTabHost;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.map_fragment, container, false);
mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
mTabHost.setup(getLocalActivityManager());
TabSpec tab = mTabHost.newTabSpec("map")
.setIndicator("map")
.setContent(new Intent(getActivity(), MyMapActivity.class));
mTabHost.addTab(tab);
/*
* hack!!!
* view hierarchy is:
* PhomeWindow$DecorView$.../FrameLayout/LinearLayout/MapView
* findViewById() does not work directly on tab content view
*/
mMapView = (MyMapView) mTabHost.getTabContentView().getChildAt(0).findViewById(R.id.mapview);
...
return view;
}
public class LocalActivityManagerFragment extends Fragment {
private static final String KEY_STATE_BUNDLE = "localActivityManagerState";
private LocalActivityManager mLocalActivityManager;
protected LocalActivityManager getLocalActivityManager() {
return mLocalActivityManager;
}
...
}
Problem:
MapView ⇔ MapActivity
Thursday, March 14, 13
49. Support Library + MapFragment (Maps v2)
49
<fragment
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Installation über Google Play
Services SDK
Google Maps Android API v2
The Google Maps Android API
v2 Utopia
http://android.cyrilmottier.com/?p=855
Thursday, March 14, 13
50. Support Library + MapFragment + ActionbarSherlock
50
ActionbarSherlock-Erweiterung notwendig
public class SherlockMapFragment extends SupportMapFragment {}
http://stackoverflow.com/questions/13721929/using-actionbarsherlock-with-the-new-supportmapfragment
Thursday, March 14, 13
51. Nested Fragments
๏ seit November 2012, Version 4.2
51
Unterstützt nur programmatische Verwendung von Fragments
Child Fragment: getChildFragmentManager()
Asynchrone Initialisierung notwendig
(Bsp.: Fragment mit ViewPager mit
Fragments)
private class SetAdapterTask extends AsyncTask<Void,Void,Void>{
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setCurrentItem(mSelectedTab);
mViewPager.setOffscreenPageLimit(3);
}
}
ViewPagerFragment
Thursday, March 14, 13
65. 65
๏ Official Documentation
‣ Android Design Guide
http://developer.android.com/design/index.html
‣ Supporting Multiple Screens
http://developer.android.com/guide/practices/screens_support.html
‣ New tools for managing screen sizes
http://android-developers.blogspot.de/2011/07/new-tools-for-managing-screen-sizes.html
‣ Designing for Multiple Screens
http://developer.android.com/training/multiscreen/index.html
‣ Multi-pane Layouts
http://developer.android.com/design/patterns/multi-pane-layouts.html
‣ Building a Dynamic UI with Fragments
http://developer.android.com/training/basics/fragments/index.html
‣ Android Lint Tool
http://tools.android.com/tips/lint
http://developer.android.com/tools/help/lint.html
http://developer.android.com/tools/debugging/improving-w-lint.html
Ressourcen I
Thursday, March 14, 13
66. 66
๏ App Clinic
http://goo.gl/piLXJ
๏ Android Design in Action - Android Developers
http://goo.gl/skOPD
http://goo.gl/JGB4e
๏ Android Asset Studio
http://android-ui-utils.googlecode.com/hg/asset-studio/dist/index.html
Ressourcen II
Thursday, March 14, 13
67. 67
๏ Google I/O
‣ Schedule app
https://code.google.com/p/iosched/
‣ What's New in Android Developers' Tools
http://www.youtube.com/watch?v=Erd2k6EKxCQ
‣ Multi-Versioning Android User Interfaces
http://www.youtube.com/watch?v=amZM8oZBgfk
‣ Designing and Implementing Android UIs for Phones and Tablets
http://www.youtube.com/watch?v=WGIU2JX1U5Y
Ressourcen III
Thursday, March 14, 13
68. 68
๏ Juhani Lehtimäki
‣ Smashing Android UI
http://www.androiduipatterns.com/
http://eu.wiley.com/WileyCDA/WileyTitle/productCd-1118387287,descCd-buy.html
๏ Others
‣ Cyrill Mottier
http://android.cyrilmottier.com
‣ Android 4 - UI Design - Lars Röwekamp
http://www.openknowledge.de/publikationen/vortraege/mtc-2012/android-4-ui-design.html
‣ Flexibles UI-Design - Lars Röwekamp
http://it-republik.de/jaxenter/artikel/Flexibles-UI-Design-4770.html
‣ Deep dive into responsive mobile design - Kirill Grouchnikov
http://www.pushing-pixels.org/2011/11/08/deep-dive-into-responsive-mobile-design-
part-1.html
Ressourcen IV
Thursday, March 14, 13
69. 69
๏ Apps mit beispielhaftem Design
‣ Google I/O 2012
https://code.google.com/p/iosched/
‣ Gmail
com.google.android.gm
‣ TED
com.ted.android
‣ Evernote
com.evernote
‣ Flipboard
flipboard.app
‣ Pulse
com.alphonso.pulse
Ressourcen V
‣ Prixing
fr.epicdream.beamy
‣ Pattrn
org.lucasr.pattrn
‣ Glimmr
com.bourke.glimmr
‣ The Verge
com.verge.android
Thursday, March 14, 13