android development for phone and tablet

56
Android: vývoj pro telefon a tablet Tomáš Kypta @TomasKypta

Upload: tomas-kypta

Post on 17-Jul-2015

38 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Android Development for Phone and Tablet

Android: vývoj pro telefon a tablet

Tomáš Kypta@TomasKypta

Page 2: Android Development for Phone and Tablet
Page 3: Android Development for Phone and Tablet
Page 4: Android Development for Phone and Tablet

O čem to dnes bude

● vývoj pro Android tablety● co se změnilo příchodem tabletů● jak vyvíjet aplikace optimalizované pro

telefony i tablety

Page 5: Android Development for Phone and Tablet

Současný stav

Page 6: Android Development for Phone and Tablet

Telefon vs. tablet

● různé hardwarové vlastnosti– velikost displeje

● nutné vytvořit různý layout

– telefonní modul (data ano, volání a SMS ne), ... ● některé aplikace se na tablet nehodí (SMS jízdenka,

Free SMS Sender, ...)

– výdrž baterie

Page 7: Android Development for Phone and Tablet

Android komponenty

● 4 komponety:

1. Activity – vizuální komponenta

2. Service

3. ContentProvider

4. broadcast Receiver

Page 8: Android Development for Phone and Tablet

Telefon vs. tablet

● telefon = single-pane layout aktivit

Page 9: Android Development for Phone and Tablet

Telefon vs. tablet

● table = multi-pane layout aktivit

Page 10: Android Development for Phone and Tablet

Fragment

● část uživatelského rozhranní nebo programu, která může být umístěna v aktivitě

● od API level 11 (Android 3.0)

● backportován jako knihovna od API level 4 (Android 1.6)

● interakce přes FragmentManager

● fragment nelze použít bez Aktivity

Page 11: Android Development for Phone and Tablet

Fragmenty - telefon<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent">

<!-- "Fragment A" -->

<fragment class="com.example.android.NoteListFragment"

android:id="@+id/list_frag"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

</FrameLayout>

● aktivita A obsahuje fragment A● aktivita B obsahuje fragment B

Page 12: Android Development for Phone and Tablet

Fragmenty - tablet<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal"

android:layout_width="match_parent" android:layout_height="match_parent"

android:id="@+id/frags">

<!-- "Fragment A" -->

<fragment class="com.example.android.NoteListFragment" android:id="@+id/list_frag"

android:layout_width="@dimen/titles_size" android:layout_height="match_parent"/>

<!-- "Fragment B" -->

<fragment class="com.example.android.NoteEditFragment" android:id="@+id/details_frag"

android:layout_width="match_parent" android:layout_height="match_parent" />

</LinearLayout>

● aktivita A obsahuje fragmenty A i B

Page 13: Android Development for Phone and Tablet

Fragmenty - příklad

● aplikace pro správu poznámek● fragment A = seznam poznámek● fragment B = detail/editace poznámky

Page 14: Android Development for Phone and Tablet

Fragmenty

● nemanipulujte s jedním fragmentem z jiného● obsah fragmentu manipulujte zevnitř

fragmentu, ne z aktivity

Page 15: Android Development for Phone and Tablet

Fragmenty

● komunikace s aktivitou přes callback interface– pro každý fragment definujeme callback interface

– pokud chce být aktivita volána z fragmentu musí implementovat interface

Page 16: Android Development for Phone and Tablet

Fragmenty - callbackypublic class NoteListFragment extends ListFragment {

public interface NoteListEventsCallback { // callback interface

public void onShowDetails(int index);

public void onNoteDeleted();

}

private NoteListEventsCallback mContainerCallback;

@Override public void onAttach(Activity activity) {

super.onAttach(activity);

try { // check that the containing activity implements our callback

mContainerCallback = (NoteListEventsCallback) activity;

} catch (ClassCastException e) {

activity.finish();

throw new ClassCastException(activity.toString()+"must implement NoteSelectedCallback");

}

}

// implementace fragmentu

}

Page 17: Android Development for Phone and Tablet

Fragmenty - callbackypublic class NotepadActivity extends Activity implements NoteListEventsCallback {

// implementace aktivity

public void onShowDetails(int index) { ... }

public void onNoteDeleted() {

// pokud je položka selektovaná odstraní NoteEditFragment

FragmentManager fm = getFragmentManager();

NoteEditFragment edit = (NoteEditFragment) fm.findFragmentByTag("Edit");

if (edit != null) {

FragmentTransaction ft = fm.beginTransaction();

ft.remove(edit);

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

ft.commit();

}

}

}

Page 18: Android Development for Phone and Tablet

Fragmenty - callbackypublic void onShowDetails(int index) { // implementace callbacku funkce v aktivitě

if (mDualPane) {

// zkontrolujeme a případně vyměníme zobrazený fragment

NoteEditFragment edit = (NoteEditFragment)getFragmentManager().findFragmentById(R.id.edit);

if (details == null || details.getShownIndex() != index) {

// vytvoříme fragment s novým obsahem

edit = NoteEditFragment.newInstance(index);

// v transakci vyměníme fragment

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.edit, edit);

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

ft.commit();

}

} else { // v single-pane modu zobrazíme aktivitu B

Intent intent = new Intent();

intent.setClass(getActivity(), EditActivity.class);

intent.putExtra("index", index);

startActivity(intent);

} }

Page 19: Android Development for Phone and Tablet

Fragment

● NoteEditFragment vytvoří view a naplní ho daty

● stará se o editaci poznámky

Page 20: Android Development for Phone and Tablet

Fragment – aktivita Bpublic static class EditActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

// v dual-pane (v tomto případě v landscape), aktivitu nepotřebujeme

finish(); return;

}

if (savedInstanceState == null) {

// pokud mame data, vytvoříme edit fragment

NoteEditFragment edit = new NoteEditFragment();

edit.setArguments(getIntent().getExtras());

getFragmentManager().beginTransaction().add(android.R.id.content, edit).commit();

}

}

// ....

}

Page 21: Android Development for Phone and Tablet

DialogFragment

● nahrazuje Dialog● metody Activity.onCreateDialog(),

Activity.onPrepareDialog() jsou deprecated

Page 22: Android Development for Phone and Tablet

Fragment Back Stack

● výměny fragmentů v rámci aktivity si můžu ukládat na zásobník fragmentů

● uživatel se pak může vrace tlačítkem zpět

Page 23: Android Development for Phone and Tablet

Fragment Back Stack - přidávánívoid addFragmentToStack() {

mStackLevel++;

// vytvoříme nový fragment

Fragment newFragment = CountingFragment.newInstance(mStackLevel);

// přidáme fragment v aktivitě do zásobníku fragmentů

FragmentTransaction ft = getFragmentManager().beginTransaction();

ft.replace(R.id.simple_fragment, newFragment); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

ft.addToBackStack(null);

ft.commit();

}

Page 24: Android Development for Phone and Tablet

DialogFragment - vytvoření/** funkce v aktivitě */

void showDialog() {

// DialogFragment.show() přidá fragment do transakce

// odstraníme zobrazený dialog

FragmentTransaction ft = getFragmentManager().beginTransaction();

Fragment prev = getFragmentManager().findFragmentByTag("dialog");

if (prev != null) { ft.remove(prev); }

ft.addToBackStack(null);

// vytvoříme a zobrazíme dialog

DialogFragment newFragment = MyDialogFragment.newInstance();

newFragment.show(ft, "dialog");

}

Page 25: Android Development for Phone and Tablet

DialogFragmentpublic static class MyDialogFragment extends DialogFragment {

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment_dialog, container, false);

// kliknutí na tlačítko

Button button = (Button)v.findViewById(R.id.show);

button.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

// nějaká akce

}

});

return v;

} }

Page 26: Android Development for Phone and Tablet

AlertDialogpublic static class MyAlertDialogFragment extends DialogFragment {

public static MyAlertDialogFragment newInstance(int title) {

MyAlertDialogFragment frag = new MyAlertDialogFragment();

Bundle args = new Bundle(); args.putInt("title", title);

frag.setArguments(args); return frag;

}

@Override public Dialog onCreateDialog(Bundle savedInstanceState) {

int title = getArguments().getInt("title");

return new AlertDialog.Builder(getActivity()).setIcon(R.drawable.alert_dialog_icon).setTitle(title)

.setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

((FragmentAlertDialog)getActivity()).doPositiveClick();

}

}

).setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

((FragmentAlertDialog)getActivity()).doNegativeClick();

}

}

) .create();

}}

Page 27: Android Development for Phone and Tablet

Worker fragment

● fragment nemusí mít UI● může to být neviditelný worker● vytvoříme pomocí funkce

FragmentTransaction.add(Fragment fragment, String tag)● ve fragmentu nebude volán callback

onCreateView()

Page 28: Android Development for Phone and Tablet

Activity lifecycle

Page 29: Android Development for Phone and Tablet

Fragment lifecycle

Page 30: Android Development for Phone and Tablet

Compatibility library

● backportování funkcionality pro API level >= 4● <sdk>/extras/android/support/v4/android-support-v4.jar

● úprava manifestu<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />

● použití správných fragmentůimport android.support.v4.app.Fragment;

ne import android.app.Fragment;

● místo getFragmentManager() použít getSupportFragmentManager()

Page 31: Android Development for Phone and Tablet

Compatibility library

● implementuje:● Fragment, FragmentManger, FragmentTransaction, ListFragment,

DialogFragment

● LoaderManager, Loader, AsyncTaskLoader, CursorLoader

● neimplementuje:● ActionBar (zmíním dále), přesto jej částečně podporuje

Page 32: Android Development for Phone and Tablet

Rozlišení layoutů

● screen-size buckets– xlarge alespoň 960dp x 720dp

– large alespoň 640dp x 480dp

– normal alespoň 470dp x 320dp

– small alespoň 426dp x 320dp (Android menší displeje nepodporuje)

Page 33: Android Development for Phone and Tablet

Rozlišení layoutů

● numerické selektory– width dp – dostupná šířka layoutu

– height dp – dostupná výška layoutu

– smallest width dp – minimální kdykoliv dostupná šířka layoutu

● použítíres/layout/main_activity.xml # telefony

res/layout-sw600dp/main_activity.xml # 7” tablety

res/layout-sw720dp/main_activity.xml # 10” tablety

res/layout/main_activity.xml # Single-pane

res/layout-w600dp/main_activity.xml # Multi-pane pokud je dostatečná šířka (tablet v landscape modu)

Page 34: Android Development for Phone and Tablet

Telefonní aplikace bez fragmentů

● systém se sám snaží (trošku) vylepšit vzhled telefonní aplikace na tabletu

● Sceen Compatibility Mode– systém vykreslí aplikaci v rozlišení cca 320x480 a

pak roztáhne na celou obrazkovku

– od API level 13 (Android 3.2)

– systém sám nabídne pokud aplikace nepodporuje large obrazovky

Page 35: Android Development for Phone and Tablet

Screen Compatibility Mode

● lze disablovat na starších aplikacích<supports-screens android:xlargeScreens="true" />

● lze enablovat na novějších (používajících API level >= 13)<supports-screens android:compatibleWidthLimitDp="320" />

● zařízení s menší stranou vetší než 320dp navídne compatibility mode

● max hodnota 320

<supports-screens android:largestWidthLimitDp="320" />

● vynutí compatiblity mode (nelze vypnout)

Page 36: Android Development for Phone and Tablet

Problémy s fragmenty

● použití MapView je problematické– používá MapActivity

● lze vyřešit (ohackovat)– připojení okna aktivity do layoutu fragmentu

Page 37: Android Development for Phone and Tablet

Bez fragmentů

● lze vytvořit různá apk pro telefony a tablety● každé apk nutné zacílit pomocí parametrů v

AndroidManifestu– <supports-screens>

– <compatible-screens>

– ne <uses-sdk>

● do Play Marketu lze nahrát více apk

Page 38: Android Development for Phone and Tablet

<supports-screens>

<supports-screens android:smallScreens="false"

android:normalScreens="false"

android:largeScreens="true"

android:xlargeScreens="true"

android:requiresSmallestWidthDp="600" />

● obráceně – povolit malé displeje a zakázat velké

– může působit problém – Google Play to nerespektuje, aplikace bude dostupná i na zařízeních s velkým displejem

– řešení: <compatible-screens>

Page 39: Android Development for Phone and Tablet

<compatible-screens>

<compatible-screens>

<!-- malé displeje -->

<screen android:screenSize="small" android:screenDensity="ldpi" />

<screen android:screenSize="small" android:screenDensity="mdpi" />

<screen android:screenSize="small" android:screenDensity="hdpi" />

<screen android:screenSize="small" android:screenDensity="xhdpi" />

<!-- střední displeje -->

<screen android:screenSize="normal" android:screenDensity="ldpi" />

<screen android:screenSize="normal" android:screenDensity="mdpi" />

<screen android:screenSize="normal" android:screenDensity="hdpi" />

<screen android:screenSize="normal" android:screenDensity="xhdpi" />

</compatible-screens>

Page 40: Android Development for Phone and Tablet

ActionBar

● příchod s API level 11 (Android 3.0)● asi nejdůležitější designový prvkek

● vizuální komponenta identifikující aplikaci● navigace uživatele v rámci aplikace● větší konzistence navigace napříč aplikacemi● zvýraznění důležitých akcí

Page 41: Android Development for Phone and Tablet

ActionBar

1. aplikační ikona

2. přepínač (účty/časové intervaly/...)

3. akční tlačítka

4. prostor pro zbylá tlačítka

Page 42: Android Development for Phone and Tablet

ActionBar

Page 43: Android Development for Phone and Tablet

ActionBar

1. hlavní ActionBar

2. vrchní panel

3. spodní panel

Page 44: Android Development for Phone and Tablet

ActionBar● dříve: akce z ActionBaru se nacházely v

options menu● na tabletu options menu “není”

Page 45: Android Development for Phone and Tablet

ActionBar

<uses-sdk android:minSdkVersion="4"

android:targetSdkVersion="11" />● na androidu 3.0 a výš automaticky použije

ActionBar

Page 46: Android Development for Phone and Tablet

ActionBar

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.main_activity, menu);

return true;

}

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/menu_save"

android:icon="@drawable/ic_menu_save"

android:title="@string/menu_save"

android:showAsAction="ifRoom|withText" />

</menu>

Page 47: Android Development for Phone and Tablet

ActionBar – složitější prvky

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.options, menu);

SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();

// konfigurace hledání

...

return super.onCreateOptionsMenu(menu);

}

Page 48: Android Development for Phone and Tablet

ActionBar - ActionProvider

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/menu_share"

android:title="@string/share"

android:showAsAction="ifRoom"

android:actionProviderClass="com.example.android.SomeActionProvider" />

...

</menu>

● pro složitější akce● mediator pattern

Page 49: Android Development for Phone and Tablet

ActionBar

● rozdělení ActionBaru● od API level 14● povolení přidáním atributu

uiOptions="splitActionBarWhenNarrow"

do tagu <activity>

nebo <application>

Page 50: Android Development for Phone and Tablet

Compatibility library

● neimplementuje ActionBar● přesto nabízí možnost určit, že položka option

menu má být v ActionBaru, pokud je dostupný● třída MenuCompat

Page 51: Android Development for Phone and Tablet

ActionBarSherlock

● 3rd party rozšíření compatibility Library● implementuje ActionBar i pro API level >= 4

Page 52: Android Development for Phone and Tablet

Vývoj pro telefony i tablety - shrnutí

● snažit se stavět aktivity na fragmentech– lze mít pouze 1 aktivitu, ve které se mění

fragmenty

● pokud chceme můžeme vytvořit samostatná apk

● používat ActionBar● používat flexibilní layouty

Page 53: Android Development for Phone and Tablet

Odkazy

● developer.android.com● android-developers.blogspot.com● source.android.com● stackoverflow.com

● developer.android.com/design/patterns/actionbar.html

● actionbarsherlock.com

Page 54: Android Development for Phone and Tablet

Literatura

● Reto Meier: Professional Android 4 Application Development

Page 55: Android Development for Phone and Tablet

Google TV

● aneb tabletem to nekončí● tvDpi● harwarové odlišnosti

– pouze landscape

– GPS, telefonní modul, NFC, proximity senzor, ...

– neřešíme výdrž baterie

– ovladač

Page 56: Android Development for Phone and Tablet

Dotazy?