web-dev-qa-db-fra.com

IllegalArgumentException: le type de fenêtre ne peut pas être modifié une fois la fenêtre ajoutée

J'ai essayé le conseil ici , le conseil ici , le conseil ici , j'ai commenté onOttachedToWindow () dans mon activité de base. J'ai deux activités héritant de cette classe, BaseActivity. On court, on ne court pas. Quelle pourrait être la différence? Ma cible SDK est 19; le changer en 12 ne fait aucune différence. Voici mon onCreate for BaseActivity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onAttachedToWindow();
    super.onCreate(savedInstanceState);

    ....
    }

Lors de la navigation vers la deuxième activité, en parcourant le code, il le fait via onCreate (), onResume (), puis se bloque. 

Quel pourrait être le problème?

Trace de la pile: 

06-26 13:41:57.963  28667-28667/com.assistek.ediary E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.assistek.ediary, PID: 28667
Java.lang.IllegalArgumentException: Window type can not be changed after the window is added.
        at Android.os.Parcel.readException(Parcel.Java:1550)
        at Android.os.Parcel.readException(Parcel.Java:1499)
        at Android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.Java:903)
        at Android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.Java:5301)
        at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1507)
        at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1061)
        at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5885)
        at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:767)
        at Android.view.Choreographer.doCallbacks(Choreographer.Java:580)
        at Android.view.Choreographer.doFrame(Choreographer.Java:550)
        at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:753)
        at Android.os.Handler.handleCallback(Handler.Java:739)
        at Android.os.Handler.dispatchMessage(Handler.Java:95)
        at Android.os.Looper.loop(Looper.Java:135)
        at Android.app.ActivityThread.main(ActivityThread.Java:5254)
        at Java.lang.reflect.Method.invoke(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:372)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)

EDIT: si je passe à l'API cible 12 et que je mets toutes les modifications de onCreate dans onAttachedToWindow, je peux faire en sorte que cette exception disparaisse, mais j'aimerais que le SDK cible soit 19. 

Mon new onCreate ():

@Override
protected void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
...
}

Mon new onAttachedToWindow ():

@Override
public void onAttachedToWindow() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
}

Cela ne fonctionne qu'avec l'API cible 12. 

RéponseLa cible minimale doit être inférieure à 14 lorsque WindowManager.LayoutParams.TYPE_KEYGUARD a utilisé

17
Kristy Welsh

Essayez d'utiliser ceci pour la fenêtre:

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_adjectives);
6
parik dhakan

Je me heurte à la même question. Mais après avoir arrêté d'ajouter

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
requestWindowFeature(Window.FEATURE_NO_TITLE);

avant super.onCreate(savedInstanceState); of BaseActivity, cela fonctionne bien. Je coupe et colle les codes ci-dessus avant super.onCreate(savedInstanceState); des descendants de BaseActivity.

BTW, je ne pense pas que vous deviez appeler super.onAttachedToWindow(); dans les méthodes de cycle de vie de Activity. Parce que onAttachedToWindow(); est appelé lorsque la vue est attachée à une fenêtre lorsque vous remplacez une View.

2
SilentKnight

J'ai également eu ce problème, mais je l'ai résolu en supprimant la fenêtre, en modifiant les paramètres, puis en rajoutant la fenêtre. C'était assez bien pour moi.

WindowManager.removeView(View); params = params2; //changed the params to something else WindowManager.updateViewLayout(View, params); WindowManager.addView(View, params);

1
Anonymous

Désolé pour la réponse tardive. Vous devriez ajouter: 

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

dans onCreate method si vous utilisez un api de niveau 15 ou supérieur. Ça marche pour moi.

0
Farhan Ghaffar

Retirer

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG|WindowManager.LayoutParams.FLAG_FULLSCREEN);

De votre onAttachedToWindow(), comme ceci:

 @Override
     public void onAttachedToWindow() {
        //this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG|WindowManager.LayoutParams.FLAG_FULLSCREEN);

          super.onAttachedToWindow();
     }
0
Sanjay sharma