Вызов Alertdialog из виджета

от автора

Разрабатывая свой виджет я захотел чтобы некоторая информация предоставлялась пользователю в виде всплывающего диалога(alertdialog), но столкнулся с особенность платформы. Android не позволяет вызывать alertdialog из AppWidgetProvider.
Как написать простой виджет можно посмотреть в этой статье. Пойдем дальше и сразу рассмотрим как обойти это ограничение.

Способ нашел очень простой: alertdialog вызвать нельзя, но можно вызвать activity.

Создаём разметку activity. Файл layout/act.xml.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="fill_parent"  android:layout_height="fill_parent">  </LinearLayout> 

Регистрируем activity в AndroidManifest.xml добавив в секцию application

<activity android:name="act" android:label="@string/app_name" /> 

Создаём класс нашего activity. Файл act.java. При вызове activity оно покажет alertdialog и закроется после нажатия на любую из кнопок.

import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.view.Window; import android.widget.Toast;  public class act extends Activity  { 		   		final int DIALOG_EXIT = 1; 	 		  @Override 		  protected void onCreate(Bundle savedInstanceState) { 			   			  super.onCreate(savedInstanceState);  //скрываем заголовок activity 			  requestWindowFeature(Window.FEATURE_NO_TITLE); 			  setContentView(R.layout.act); //вызываем alertdialog			 			   			  showDialog(DIALOG_EXIT); 			   		  } 		   		    protected Dialog onCreateDialog(int id) { 		        if (id == DIALOG_EXIT) { 		          AlertDialog.Builder adb = new AlertDialog.Builder(this); 		          //описание диалога 		          adb.setTitle("Title"); 		          		          adb.setMessage("Message"); 		           		          adb.setIcon(android.R.drawable.ic_dialog_info);  //описание кнопок 		          adb.setPositiveButton("Yes", myClickListener);  		          adb.setNegativeButton("No", myClickListener);  //диалог нельзя закрыть кнопкой назад(иначе диалог закроется а activity нет) 		          adb.setCancelable(false); 		           		          return adb.create(); 		        } 		        return super.onCreateDialog(id); 		      } 		       		      OnClickListener myClickListener = new OnClickListener() { 		      public void onClick(DialogInterface dialog, int which) { 		        switch (which) {  //нажатие кнопки "Yes" 		        case Dialog.BUTTON_POSITIVE: 		        Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT).show();  //закрываем activity 		        finish(); 		        break; 		        		        case Dialog.BUTTON_NEGATIVE: 		        Toast.makeText(getApplicationContext(), "No", Toast.LENGTH_SHORT).show(); 		        finish(); 		        break; 		        } 		      } 		    }; 		   } 

В событие нажатие на кнопку виджета указываем вызов activity

Intent i = new Intent(context, act.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); 

Самая важная часть, делаем activity прозрачным изменив в AndroidManifest.xml тему

<activity android:name="act" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent" /> 

Результат:

ссылка на оригинал статьи http://habrahabr.ru/post/164851/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *