5

sto scrivendo un'app che mostra le chiamate perse e gli sms non letti in una finestra pop-up. ha anche una funzione di promemoria (per chiudere la finestra a comparsa e aprirla dopo un intervallo di tempo specificato). è simile alla finestra popup di any.do.finestra popup come any.do

Sono stato in grado di creare una finestra di questo tipo utilizzando WindowManger, ma per alcuni motivi che non capisco fino ad ora, la finestra pop-up scompare dopo un po 'di tempo (anche se dovrebbe essere aperta fino a quando l'utente non lo chiude o fa clic sul pulsante di promemoria che potrebbe richiedere ore).

Ecco come ho creato la finestra pop-up esistente

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

perché non ero sicuro se il WindowManager è davvero il modo giusto per questo, ho anche provato a fare lo stesso con un'attività con i seguenti stile

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

suo aspetto ora proprio come la versione WindowManager, ma ha un problema: non posso accedere alla finestra del mio app di sotto di essa, perché le parti traslucide della finestra look perfetto, ma bloccare tutti gli eventi click alla finestra di seguito, in modo che non possa scorrere o fare qualsiasi cosa con esso. come in any.do voglio solo che la finestra si mostri, ma non per bloccare alcuna possibilità di lavorare sulla finestra sottostante mentre la finestra popup è aperta.

MODIFICA: voglio vedere la finestra di pop-up in basso, che copre il 30% della finestra, ma essere in grado di scorrere la finestra sotto di esso (e anche eseguire eventi click su di esso) allo stesso tempo.

così le mie domande sono:

  1. è il WindowManager il modo giusto per creare questa PopupWindow?
  2. se sì, perché scompare a volte indesiderato? come posso prevenirlo?
  3. se no, come posso creare un'attività che si comporta come la finestra che ho creato con WindowManager?
  4. o entrambi i modi sono errati? in questo caso; che cosa è la strada giusta?
+0

hai fatto questo? Ho bisogno di alcune idee su questo. Quello che ho fatto è stato creare un'attività con un layout relativo e posizionare alcuni componenti sul fondo, impostare il tema come transpatent e impostare l'animazione dell'attività per entrare dal basso e uscire in basso. ma l'attività di background si blocca fino a quando la mia attività è in esecuzione. – prashantwosti

risposta

0

Ecco il codice che ho usato per fare la stessa cosa

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

e lo stile XML (originariamente postato qui 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> 

impostare lo stile per l'attività nel manifesto file. E poi avvia l'attività ogni volta che vuoi mostrare la finestra popup. È possibile aggiungere dati EXTRA a un intento e utilizzarlo per personalizzare il popup.

+0

Non sono sicuro di aver capito. vuoi dire che l'attività che hai scritto dovrebbe comportarsi come la finestra a comparsa che voglio o la finestra di avviso che inizia dopo la creazione dell'attività? nel link che hai inviato non c'è nulla su una finestra di avviso. – richard

+0

solo per essere sicuro di aver chiarito il mio problema. voglio vedere la finestra di pop-up in fondo, che copre il 30% della finestra, ma essere in grado di scorrere la finestra sotto di essa (e anche eseguire eventi click su di esso) allo stesso tempo. – richard

+0

@Richard Ti ho capito male, sfortunatamente.Per il tuo scopo, consiglierei un 'RelativeLayout' con due elementi: vista principale e popup (può essere un frammento), collega il secondo elemento in fondo e cambia la sua visibilità ogni volta che vuoi. Così l'utente vedrebbe il popup, la vista principale e sarà in grado di interagire con entrambi. –

Problemi correlati