2014-07-03 16 views
8

Sto leggendo dati xml da un URL. Ha funzionato bene quando era in modalità verticale. Ma volevo cambiarlo in modalità orizzontale. Ma ottiene l'eccezione android.view.WindowLeaked.android.view.WindowLeaked exception

Per favore aiutatemi. Grazie in anticipo. Questo è il mio codice

package com.eisuru.abc; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.pm.ActivityInfo; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    TextView tvResponse; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

     tvResponse = (TextView) findViewById(R.id.tvResponse); 
     new PostAsync().execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 


    class PostAsync extends AsyncTask<Void, Void, Void> { 
     ProgressDialog pd; XMLHelper helper;  
     @Override 
     protected void onPreExecute() { 
      pd = ProgressDialog.show(MainActivity.this, "Exchange Rates", "Loading Exchange rates values ...", true, false); 
      } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      helper = new XMLHelper(); helper.get(); 
      return null; 
      } 

     @Override 
     protected void onPostExecute(Void result) 
     { 
      StringBuilder builder = new StringBuilder(); 
      for(Exrate_values post : helper.exrates) { 

       builder.append("\n\t " + post.getDate()); 
       builder.append("\t \t\t " + post.getFrom_currency()); 
       builder.append("\t \t\t " + post.getTo_Currency()); 
       builder.append("\t \t\t " + post.getExrt_buy()); 
       builder.append("\t \t\t\t " + post.getExrt_sell()); 


       builder.append("\n"); 

     } 
       tvResponse.setText(builder.toString()); 
       pd.dismiss(); 
       } 
     } 

} 

risposta

21

Quando una finestra di dialogo su un'attività è impostata su visibile ma su orientamento cambia l'attività stessa viene distrutta, quindi causa errore di finestra trapelata.

Ci sono due metodi per gestire questa situazione: -

Metodo 1
Pertanto, è necessario dismiss dialogo nel metodo onStop o onDestroy di attività. Per esempio:

@Override 
protected void onStop() { 
    super.onStop(); 

    if(pd!= null) 
     pd.dismiss(); 
} 

e dialogo in classe di attività definire

ProgressDialog pd; 

Questo link vi aiuterà a Handling progress dialogs and orientation changes

Metodo 2
Bisogna aggiungere questo alla dichiarazione attività nel manifest:

android:configChanges="orientation" 

modo che appaia come

<activity android:label="@string/app_name" 
     android:configChanges="orientation|keyboardHidden" 
     android:name="com.eisuru.abc.MainActivity"> 

La questione è che il sistema distrugge l'attività quando si verifica un cambiamento nella configurazione. Vedi ConfigurationChanges.

Quindi inserendolo nel file di configurazione si evita che il sistema distrugga la propria attività. Invece invoca il metodo onConfigurationChanged(Configuration).

+0

Grazie mille per il tuo utile commento. Ho fatto il secondo metodo. Ha funzionato molto bene. 'android: screenOrientation =" landscape "' 'android: configChanges =" tastiera | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize ">' – Isuru

+0

@Isuru Felice di aiutare, divertiti a programmare. –

+0

Il metodo 1 ha funzionato perfettamente per me. Nota interessante: avevo già dichiarato l'orientamento nelle configChanges nel mio manifest quando stavo ottenendo la fuga della finestra in origine. – LargeGlasses

1

Si sta provando a mostrare una finestra di dialogo dopo aver chiuso un'attività.

La soluzione è richiamare il comando dismiss() nella finestra di dialogo creata in Example.java:183 prima di uscire dall'attività, ad es. in onPause(). Tutte le finestre di dialogo & devono essere chiuse prima di lasciare un'attività.

O

Aggiungi questo al vostro manifesto:

android:configChanges="orientation|keyboardHidden 

Poi nella vostra attività aggiungere questo da qualche parte:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
{ 
    Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    //ur Code 
} 
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
{ 
    Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    //ur Code 
} 
} 
0

ho ottenuto questo errore perché stavo aggiungendo una vista a il onResume() di tutte le mie attività usando WindowManager.addView(). Per risolvere il problema ho dovuto chiamare WindowManager.removeView() in onPause() di tutte le mie attività.

1

dialog è un figlio che appartiene al thread principale e se vuoi mostrarlo o ucciderlo devi farlo su OnUiThread in questo modo. Sto usando il frammento e quando mostro il dialogo, ottieni questa eccezione. Ma questo metodo mi ha salvato.

getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      pDialog.show();//dismiss any dialog like this 
     } 
    }); 
+1

potresti modificare la tua risposta e spiegare come questo risolve il problema? – beresfordt