Разрабатывая свой виджет я захотел чтобы некоторая информация предоставлялась пользователю в виде всплывающего диалога(alertdialog), но столкнулся с особенность платформы. Android не позволяет вызывать alertdialog из AppWidgetProvider.
Как написать простой виджет можно посмотреть в этой статье. Пойдем дальше и сразу рассмотрим как обойти это ограничение.
Способ нашел очень простой: alertdialog вызвать нельзя, но можно вызвать activity.
Как написать простой виджет можно посмотреть в этой статье. Пойдем дальше и сразу рассмотрим как обойти это ограничение.
Способ нашел очень простой: 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/
Добавить комментарий