Implementação de Interfaces gráficas
Elementos de UI Menus Dialogs Action bar Notifications
Menus
Menus Android oferece três tipos de menu Options Menu Menu padrão de aplicações Android Context Menu Menu flutuante e contextual Popup menu A partir da versão 3.0
Options Menu Modelo principal de menus no android Diretamente relacionado ao Activity em execução Ativado pelo botão MENU do aparelho ou na barra de ações (em aparelhos que rodam Android 3.x). A partir do Android 3.0 (API level 11), os aparelhos não são obrigados a ter um botão dedicado à opção de Menu Aparece na parte inferior da tela (Android 2.x) ou na barra de ações (Android 3.x)
Options Menu Android 2.x O menu de opções só apresenta 6 itens de menu. Se a quantidade de itens for maior que 6, a opção More é automaticamente adicionada.
Options Menu Android 3.x. Action Bar
Options Menu Quando o Android cria o Options Menu, o método oncreateoptionsmenu() da atividade em execução é invocado Para definir o menu de sua atividade basta redefinir esse método private int MENU_ADD = 1; private int MENU_RESET = 2; @Override public boolean oncreateoptionsmenu(menu menu) { menu.add(menu.none, MENU_ADD, Menu.NONE, "Add").setIcon(R.drawable.ic_menu_add); menu.add(menu.none, MENU_RESET, Menu.NONE, "Reset").setIcon(R.drawable.ic_menu_refresh); } return(super.oncreateoptionsmenu(menu)); Assinatura do método: add(int groupid, int itemid, int order, CharSequence title)
Definindo o Menu (Declarativo) Para criar um menu de maneira declarativa deve-se: Criar um arquivo XML no diretório res/menu/ Contendo os seguintes elementos <menu> - Elemento raiz do XML e deve conter os itens de menu <item> - Representa um item de menu e pode ter outro menu para representar um submenu <group> - Item opcional de agrupamento de itens (invisível e serve para definir propriedades comuns)
Menu XML <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" /> <item android:id="@+id/help" android:icon="@drawable/ic_help" android:title="@string/help" /> </menu> menu_basico.xml
Carregando o menu XML @Override public boolean oncreateoptionsmenu(menu menu) { MenuInflater inflater = getmenuinflater(); inflater.inflate(r.menu.menu_basico, menu); return true; }
Tratando as ações de menu @Override public boolean onoptionsitemselected(menuitem item) { // Handle item selection switch (item.getitemid()) { case R.id.new_game: newgame(); return true; case R.id.help: showhelp(); return true; default: return super.onoptionsitemselected(item); } }
Modificando os itens do menu É possível modificar os itens de menu durante a execução da Activity No Android 2.3 e inferior, o método onprepareoptionsmenu() é chamado toda vez que o usuário abre o Options Menu Deve-se redefinir este método para atualizar os itens de menu No Android 3.0 e superior, você deve chamar o método invalidateoptionsmenu() quando quiser atualizar o menu O Android chamará o onprepareoptionsmenu()
Context Menu Similar aos menus contextuais em PCs que são ativados ao se clicar com o botão direito do mouse No Android eles são ativados por um pressionamento demorado em um componente visual Diretamente relacionados ao View pressionado
Exemplo Context Menu
Formas do Context Menu 1. Flutuante Modelo padrão de menu contextual 2. Action mode Disponível a partir do Android 3 (API 11) (1) (2)
Menu flutuante - Passos Para criar um menu de contexto deve-se 1. Registrar a view através do método registerforcontextmenu() 2. Redefinir o método oncreatecontextmenu() da Activity para definir o menu 3. Redefinir o método oncontextitemselected() para tratar as ações de clique
Menu flutuante - Definição @Override public void oncreatecontextmenu(contextmenu menu, View v, ContextMenu.ContextMenuInfo menuinfo) { super.oncreatecontextmenu(menu, v, menuinfo); menu.setheadertitle("context Menu"); menu.add(0, menu.first, Menu.NONE,"Item 1").setIcon(R.drawable.menu_item); menu.add(0, menu.first+1, Menu.NONE, "Item 2").setCheckable(true); menu.add(0, menu.first+2, Menu.NONE, "Item 3").setShortcut( 3, 3 ); SubMenu sub = menu.addsubmenu("submenu"); sub.add("submenu Item"); } OU @Override public void oncreatecontextmenu(contextmenu menu, View v, ContextMenuInfo menuinfo) { } super.oncreatecontextmenu(menu, v, menuinfo); MenuInflater inflater = getmenuinflater(); inflater.inflate(r.menu.context_menu, menu);
Menu flutuante Tratando ações Contém informações sobre a View selecionada @Override public boolean oncontextitemselected(menuitem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getmenuinfo(); switch (item.getitemid()) { case R.id.edit: editnote(info.id); return true; case R.id.delete: deletenote(info.id); return true; default: return super.oncontextitemselected(item); } }
Menu no modo Action Mode - Passos 1. Implementar a interface ActionMode.Callback Possui métodos de callback para tratar o ciclo de vida e eventos dos itens de ação no ActionMode 2. Chamar o método startactionmode() quando desejar mostrar a barra de ações
Submenu Menu que o usuário pode abrir a partir da seleção de um item de outro menu Útil quando um sistema tem muitas opções de menu Android não permite submenus aninhados
Definindo submenus <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:icon="@drawable/file" android:title="@string/file" > <!-- "file" submenu --> <menu> <item android:id="@+id/create_new" android:title="@string/create_new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>
Itens de menu checkables <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkablebehavior="single"> <item android:id="@+id/red" android:title="@string/red" /> <item android:id="@+id/blue" android:title="@string/blue" /> </group> </menu>
Dialogs
Dialogs Android possui os seguintes tipos de Dialogs implementados AlertDialog ProgressDialog DatePickerDialog TimePickerDialog Você pode criar seus próprios Dialogs estendendo a classe Dialog
Mostrando um Dialog Deve-se chamar o método showdialog(int) no momento em que se deseja mostrar o Dialog showdialog(dialog_paused_id);
Criando um Dialog Deve-se redefinir os métodos: oncreatedialog(int) Chamado uma única vez, quando o Dialog é criado Deve-se instanciar o Dialog e retorná-lo onpreparedialog(int, Dialog) Chamado toda vez que o Dialog é aberto Pode-se alterar informações do Dialog
Criando um Dialog protected Dialog oncreatedialog(int id) { Dialog dialog; switch(id) { case DIALOG_PAUSED_ID: // do the work to define the pause Dialog break; case DIALOG_GAMEOVER_ID: // do the work to define the game over Dialog break; default: dialog = null; } return dialog; }
Criando um AlertDialog AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setmessage("are you sure you want to exit?").setcancelable(false).setpositivebutton("yes", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int id) { MyActivity.this.finish(); } }).setnegativebutton("no", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create();
Criando um ProgressDialog ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", "Loading. Please wait...", true); ProgressDialog progressdialog; progressdialog = new ProgressDialog(mContext); progressdialog.setprogressstyle(progressdialog.style_horizontal); progressdialog.setmessage("loading..."); progressdialog.setcancelable(false);
Action bar Widget que substitui a barra de título tradicional em aplicações Android 3.X Título da Activity Options Menu Logo da Aplicação Itens de ação
Adicionando/removendo a Action bar Automaticamente adicionado em aplicações Android 3.X AndroidManifest.xml <uses-sdk android:targetsdkversion="11" /> Pode ser removido para uma Activity específica <activity android:theme="@android:style/theme.holo.noactionbar"> ou ActionBar actionbar = getactionbar(); actionbar.hide();
Adicionando itens de ação Itens do Options Menu podem aparecer como itens de ação Menu em XML <?xml version="1.0" encoding="utf-8"?> <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" /> <item android:id="@+id/menu_delete" android:icon="@drawable/ic_menu_delete" android:title="@string/menu_delete" android:showasaction="ifroom withtext" /> </menu>
Mais sobre Action Bar Ícone da aplicação pode responder a ações do usuário Adicionar Action Views Adicionar Tabs Modificar o estilo Veja detalhes em: http://developer.android.com/guide/topics/ui/actionbar.html
Notifications Além do uso de Dialogs, existem mais duas formas de notificar o usuário Toast Notifications Status Bar Notification
Toast Notifications Mensagens de popup que aparecem e desaparecem automaticamente Não permitem interação com usuário Podem ser geradas por Activities e Services Context context = getapplicationcontext(); CharSequence text = "Hello toast!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show();
Status Bar Notifications Podem ser geradas por Activities e Services Para criar um Status Bar Notification, deve-se: 1. Obter uma referência para o NotificationManager 2. Criar uma instância de Notification 3. Definir a mensagem expandida e o Intent 4. Passar a instância de Notification para o NotificationManager
Exibindo uma notificação: Passo 1 Obter uma referência para o NotificationManager String ns = Context.NOTIFICATION_SERVICE; NotificationManager mnotificationmanager = (NotificationManager) getsystemservice(ns);
Exibindo uma notificação: Passo 2 Criar uma instância de Notification int icon = R.drawable.notification_icon; CharSequence tickertext = "Hello"; long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickertext, when);
Exibindo uma notificação: Passo 3 Definir a mensagem expandida e o Intent Context context = getapplicationcontext(); CharSequence contenttitle = "My notification"; CharSequence contenttext = "Hello World!"; Intent notificationintent = new Intent(this, MyClass.class); PendingIntent contentintent = PendingIntent.getActivity(this, 0, notificationintent, 0); notification.setlatesteventinfo(context, contenttitle, contenttext, contentintent);
Exibindo uma notificação: Passo 4 Passar a instância de Notification para o NotificationManager private static final int HELLO_ID = 1; mnotificationmanager.notify(hello_id, notification);
FIM