Я пишу приложение, которое показывает пропущенные звонки и непрочитанные смс во всплывающем окне. Он также имеет функцию напоминания (закрыть всплывающее окно и открыть его по истечении заданного времени). Это похоже на всплывающее окно any.do.
Я смог создать такое окно с помощью WindowManger, но по некоторым причинам, которые я не понимаю до сих пор, всплывающее окно исчезает через некоторое время (хотя оно должно быть открыто до тех пор, пока пользователь не закроет его или не нажмет на кнопку напоминания Что может занять несколько часов).
Так я создал существующее всплывающее окно
windowManager = (WindowManager) context.getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); this.inflater = LayoutInflater.from(context); params = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.BOTTOM; vgPopupWindow = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.popup_mainwindow, null); vgPopupContent = (ViewFlipper) vgPopupWindow.findViewById(R.id.popup_content); vgPopupAreaContent = (ViewGroup) vgPopupWindow.findViewById(R.id.popup_area_content); vgPopupAreaActions = (ViewGroup) vgPopupWindow.findViewById(R.id.popup_area_actions); vgPopupTabs = (LinearLayout) vgPopupWindow.findViewById(R.id.popup_tabs); vgPopupHeader = (LinearLayout) vgPopupWindow.findViewById(R.id.popup_main_header); windowManager.addView(vgPopupWindow, params);
Потому что я не был уверен, что WindowManager действительно подходит для этого, я также попытался сделать то же самое с деятельностью со следующим стилем
<style name="PopupWindow" parent="CustomTheme"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">false</item> <item name="android:windowIsTranslucent">true</item>
Теперь он выглядит так же, как версия WindowManager, но имеет одну проблему: я не могу получить доступ к окну моего приложения под ним, потому что полупрозрачные части окна выглядят идеально, но блокируют любые события щелчка в окне ниже, так что я могу Не прокручивайте его и не делайте с ним ничего. Как в any.do, я просто хочу, чтобы это окно появилось, но не блокировать любую возможность работать в окне ниже, пока всплывающее окно открыто.
EDIT: я хочу видеть всплывающее окно внизу, охватывающее 30% окна, но иметь возможность прокручивать под ним окно (а также выполнять события клика на нем) одновременно.
Поэтому мои вопросы:
Вот код, который я использовал, чтобы сделать то же самое
public class PopupActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AlertDialog.Builder adb = new Builder(this); AlertDialog dialogTest = adb.setTitle("Test title") .setMessage("Test message") .setNeutralButton("Button", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // do something PopupActivity.this.finish(); } }).create(); adb.setCancelable(false); dialogTest.show(); } }
И стиль XML (первоначально размещенный здесь https://stackoverflow.com/a/2700683/995020 )
<style name="Theme.Transparent" parent="AppTheme"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">false</item> </style>
Задайте стиль для действия в файле манифеста. А затем просто запустите действие в любое время, когда вы хотите показать всплывающее окно. Вы можете добавить EXTRA данные в намерение и использовать его для настройки всплывающего окна.