2016-07-22 1 views
0

Je fais une application dans laquelle je devrais utiliser le Service pour ouvrir une fenêtre PopUp à certains intervalles de temps. Je l'ai essayé en gardant le code de la fenêtre contextuelle dans une autre activité comme méthode et en l'appelant dans le service. Mais ça a fini en vain. J'ai donc copié tout le code popupWindow au service ici je ne peux pas utiliser findViewById.Impossible d'utiliser findViewbyId in Service

Mon code de service est le suivant

public class TimeService extends Service { 
View layout; 
LayoutInflater inflater; 
public PopupWindow pw; 
private RadioGroup options_group; 
private RadioButton option_button; 
Button submit_popup,close_popup; 

// constant 
public static final long NOTIFY_INTERVAL = 10 * 10000; // 100 seconds 

// run on another Thread to avoid crash 
private Handler mHandler = new Handler(); 
// timer handling 
private Timer mTimer = null; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    // cancel if already existed 


    if (mTimer != null) { 
     mTimer.cancel(); 

    } else { 
     // recreate new 
     mTimer = new Timer(); 
    } 
    // schedule task 
    mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL); 
} 

class TimeDisplayTimerTask extends TimerTask { 

    @Override 
    public void run() { 
     // run on another thread 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       // display toast 
       try { 

        inflater = (LayoutInflater) TimeService.this. 
          getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

        layout = inflater.inflate(R.layout.layout_popup, (ViewGroup) findViewById(R.id.popup_1)); 

        pw = new PopupWindow(layout, 300, 370, true); 
        pw.showAtLocation(layout, Gravity.CENTER, 0, 0); 

        submit_popup = (Button) layout.findViewById(R.id.popup_submit); 
        close_popup = (Button) layout.findViewById(R.id.popup_cancel); 
        options_group=(RadioGroup) layout.findViewById(R.id.radioGroup); 

        submit_popup.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          pw.dismiss(); 
         } 
        }); 
        submit_popup.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          int selectedId=options_group.getCheckedRadioButtonId(); 
          option_button=(RadioButton) layout.findViewById(selectedId); 

         } 
        }); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 

     }); 
    } 


} 
} 

Je reçois erreur dans la ligne

layout = inflater.inflate(R.layout.layout_popup, (ViewGroup) findViewById(R.id.popup_1)); 

et l'erreur ne peut pas résoudre méthode findViewById (int).

S'il vous plaît aidez-moi avec le code. Qu'est ce que je fais mal.

Merci d'avance.

J'ai essayé d'utiliser le code

layout = inflater.inflate(R.layout.layout_popup, null); 

Je reçois l'erreur ou stacktrace comme suit

07-22 01:17:39.789 940-957/system_process W/WindowManager: Attempted to add window with token that is not a window: null. Aborting. 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err:  at android.view.ViewRootImpl.setView(ViewRootImpl.java:562) 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err:  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:282) 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err:  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err:  at android.widget.PopupWindow.invokePopup(PopupWindow.java:1104) 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err:  at android.widget.PopupWindow.showAtLocation(PopupWindow.java:933) 
07-22 01:17:39.790 27060-27060/highski.developers.cflash W/System.err:  at android.widget.PopupWindow.showAtLocation(PopupWindow.java:897) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at highski.developers.cflash.service.TimeService$TimeDisplayTimerTask$1$override.run(TimeService.java:85) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at highski.developers.cflash.service.TimeService$TimeDisplayTimerTask$1$override.access$dispatch(TimeService.java) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at highski.developers.cflash.service.TimeService$TimeDisplayTimerTask$1.run(TimeService.java:0) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at android.os.Looper.loop(Looper.java:135) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5254) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at java.lang.reflect.Method.invoke(Method.java:372) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
07-22 01:17:39.791 27060-27060/highski.developers.cflash W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+0

Lire ce - http://stackoverflow.com/questions/6992748/android-findviewbyid-in-service –

+0

@ mayurvpatel110 J'ai lu cela et essayé cela mais il ne faut pas atteindre mes exigences et je l'ai fait pour. Vous pouvez voir l'erreur système que j'obtiens lorsque je rends le paramètre null. –

+0

@KarrthikReddy avez-vous résolu le problème – SaravInfern

Répondre

1

de valeurs NULL dans la 2e paramètre

layout = inflater.inflate(R.layout.layout_popup, (ViewGroup) findViewById(R.id.popup_1)); 

à

layout = inflater.inflate(R.layout.layout_popup, null); 

Mise à jour:

private Handler mHandler; 

@Override 
public void onCreate() { 
    mHandler = new Handler(Looper.getMainLooper()); 
    //... do like above and remove perivous updated 
} 
+0

J'ai fait une modification à la question s'il vous plaît jeter un oeil à elle. –

+0

@KarrthikReddy vérifier la mise à jour. –

+0

Cela ne m'a pas aidé a eu une autre erreur système java.lang.RuntimeException: Impossible de créer gestionnaire dans le thread qui n'a pas appelé Looper.prepare() –

1

vous ne pouvez pas faire directement les changements dans l'interface à l'intérieur d'un service utiliser à la place récepteur de radiodiffusion et filtre l'intention de notifier votre activité/fragment et mise à jour à partir de là

Comment fonctionne le service see how service works

Certaines référence utilisation onservices

http://www.vogella.com/tutorials/AndroidServices/article.html

https://androidexperinz.wordpress.com/2012/02/14/communication-between-service-and-activity-part-1/

+0

Merci @SaravInfern. Je le regarde. Je reviendrai quand je verrai cela complètement. –

+0

vous pouvez également consulter ici si vous essayez d'afficher une boîte de dialogue d'alerte http://stackoverflow.com/a/21929839/6414107 – SaravInfern

0

Vous devez utiliser Gestionnaire

private Handler handler = new Handler(new Handler.Callback() { 
    @Override 
    public boolean handleMessage(Message msg) { 
     if (msg.what == 0) { 
      // add your code here. 
     } 
     return false; 
    } 
}); 

ajouter appeler le gestionnaire de méthode ua Run().

handler.sendEmptyMessage(0); 

Tout le meilleur.

+0

votre réponse ne correspond pas du tout aux exigences de la question –

0

AlertDialog devrait être géré par activité qui a une fenêtre, puisque le service est une composante non-UI, de sorte que vous ne pouvez pas afficher une boîte de dialogue dans le service, sinon l'application se bloque:

causée par: android.view.WindowManager $ BadTokenException: Impossible d'ajouter la fenêtre - Token null n'est pas pour une application

à android.app.Dialog.show (Dialog.java:325)

Vous avez deux façons de montrer de dialogue en service:

1, une activité de démarrage thème de dialogue et afficher une boîte de dialogue dans la méthode onCreate de cette activité.

android:theme="@android:style/Theme.Holo.Light.Dialog" 

OU

2, la boîte de dialogue Définir comme système d'alerte:

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); 
    builder.setTitle("title") 
      .setMessage("message"); 
    AlertDialog dialog = builder.create(); 
    // set the dialog as system alert 
    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
    dialog.show();