5

Piszę aplikację, która pokazuje nieodebrane połączenia i nieprzeczytane SMS-y w wyskakującym okienku. ma również funkcję przypomnienia (aby zamknąć wyskakujące okno i otworzyć je po określonym czasie). jest podobny do okna wyskakującego any.do.popup window jak any.do

Udało mi się stworzyć takie okno za pomocą WindowMangera, ale z pewnych przyczyn, których nie rozumiem do tej pory, okno pop-up znika po jakimś czasie (chociaż powinno być otwarte dopóki użytkownik go nie zamknie lub kliknie na przycisku przypomnienia, który może zająć kilka godzin).

to jest jak stworzony istniejącą okienko

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); 

bo nie był pewien, czy managerem okien jest rzeczywiście właściwym sposobem na to, próbowałem też zrobić to samo z działalności z następujących styl

<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> 

jego wygląd teraz podobnie jak w wersji managerem okien, ale ma jeden problem: nie mogę otworzyć okno mojej aplikacji pod nim, bo prześwitujące części okna wyglądać dobrze, ale blokują każde kliknięcie zdarzenia do okna poniżej, aby nie przewijać to lub coś z nim zrobić. tak jak w any.do po prostu chcę, aby to okno się pojawiło, ale żeby nie blokować żadnej możliwości pracy w oknie poniżej podczas otwierania okna popupwindow.

EDYCJA: chcę zobaczyć wyskakujące okno u dołu, obejmujące 30% okna, ale można przewijać okno pod nim (a także wykonywać zdarzenia kliknięcia na nim) w tym samym czasie.

więc moje pytania są następujące:

  1. jest managerem okien właściwa droga do stworzenia tego popupwindow?
  2. jeśli tak, dlaczego znika czasami niechciane? jak mogę temu zapobiec?
  3. jeśli nie, w jaki sposób mogę utworzyć działanie, które zachowuje się jak okno, które utworzyłem za pomocą WindowManager?
  4. lub są dwa sposoby nie tak? w tym przypadku; jaka jest właściwa droga?
+0

zrobiłeś to? Potrzebuję pomysłów na ten temat. To, co zrobiłem, stworzyło działanie ze względnym układem i umieściło niektóre komponenty na dnie, ustawi motyw jako transpatentny i ustawi animację aktywności na wejście od dołu i wyjście na dół. ale aktywność w tle utknie, dopóki moja aktywność nie zostanie uruchomiona. – prashantwosti

Odpowiedz

0

Oto kod kiedyś zrobić to samo

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(); 
    } 
} 

i styl XML (pierwotnie opublikowany tutaj 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> 

Ustawia styl dla aktywności w manifeście plik. A następnie po prostu rozpocznij działanie za każdym razem, gdy chcesz wyświetlić okno wyskakujące. Możesz dodać dane EXTRA do intencji i użyć go do dostosowania popup.

+0

Nie jestem pewien, czy rozumiem. masz na myśli to, że aktywność, którą napiszesz, powinna zachowywać się jak okno wyskakujące, które chcę, lub okno alertu, które zaczyna się po utworzeniu działania? w linku, który wysłałeś, nie ma nic w oknie alertu. – richard

+0

tylko po to, aby upewnić się, że mój problem jest jasny. Chcę zobaczyć u dołu okno wyskakujące, obejmujące 30% okna, ale jednocześnie można przewijać okno pod nim (a także wykonywać na nim zdarzenia kliknięcia). – richard

+0

@Richard Tęsknię za tobą, niestety.Dla twojego celu poleciłbym 'RelativeLayout' z dwoma elementami - głównym widokiem i wyskakującym okienkiem (może to być fragment), dołącz drugi element do dołu i zmieniaj jego widoczność, kiedy tylko chcesz. W ten sposób użytkownik zobaczy okienko wyskakujące, główny widok i będzie mógł wchodzić w interakcje z nimi. –