2011-08-08 10 views
5

Próbuję umieścić okno dialogowe postępu na zdarzeniu Click z ListView, jak wspomniano w poniższym kodzie, ale pojawia się błąd "WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?" czy możesz mi podać jakieś rozwiązanie?

kod

final ListView lv1 = (ListView) findViewById(R.id.list); 
    lv1.setAdapter(new EfficientAdapter(this)); 

    lv1.setTextFilterEnabled(true); 

    lv1.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> a, View v, 
       final int position, long id) { 
      final ProgressDialog pd = ProgressDialog.show(Add_Entry.this, 
        "", "Please Wait...."); 
      new Thread() { 
       public void run() { 

        if (lv1.getItemAtPosition(position).equals(0)) { 

         Intent edit = new Intent(getApplicationContext(), 
           SourceOfStress.class); 
         TabGroupActivity parentActivity = (TabGroupActivity) getParent(); 
         edit.putExtra("currActi", "AddEntry"); 
         parentActivity.startChildActivity("SorceOfStress", 
           edit); 

        } 
        if (lv1.getItemAtPosition(position).equals(1)) { 
         Intent edit = new Intent(getParent(), 
           SourceOFSymptoms.class); 
         TabGroupActivity parentActivity = (TabGroupActivity) getParent(); 
         edit.putExtra("currActi", "AddEntry"); 
         parentActivity.startChildActivity(
           "SourceOFSymptoms", edit); 
        } 
        if (lv1.getItemAtPosition(position).equals(2)) { 
         Intent edit = new Intent(getParent(), 
           Stress_Resilliance.class); 
         TabGroupActivity parentActivity = (TabGroupActivity) getParent(); 
         edit.putExtra("currActi", "AddEntry"); 
         parentActivity.startChildActivity(
           "Stress_Resilliance", edit); 
        } 
        pd.dismiss(); 
       } 
      }.start(); 
     } 

    }); 

Nazywam plik jest Add_Entry.java i błąd występuje w wierszu

ProgressDialog.show(Add_Entry.this, 
        "", "Please Wait...."); 

Odpowiedz

4

Próbujesz zaktualizować UI z wątku. Nie możesz tego zrobić.

Użyj Handler mechanism, aby zaktualizować składniki interfejsu użytkownika.

Kod zaczerpnięty ze strony internetowej: Tutaj klasa handlera służy do aktualizacji widoku ProgressBar w wątku tła.

package de.vogella.android.handler; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

public class ProgressTestActivity extends Activity { 
    private Handler handler; 
    private ProgressBar progress; 
    private TextView text; 


/** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    progress = (ProgressBar) findViewById(R.id.progressBar1); 
    text = (TextView) findViewById(R.id.textView1); 

    } 

    public void startProgress(View view) { 
    // Do something long 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
     for (int i = 0; i <= 10; i++) { 
      final int value = i; 
      try { 
      Thread.sleep(2000); 
      } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 
      progress.post(new Runnable() { 
      @Override 
      public void run() { 
       text.setText("Updating"); 
       progress.setProgress(value); 
      } 
      }); 
     } 
     } 
    }; 
    new Thread(runnable).start(); 
    } 

} 
+0

Myślę, że ta część artykułu zniknęła . –

+0

@Brias Poprawiłem to. Wygląda na to, że Vogella przeorganizował swoją stronę. – Reno

0

Zastosowanie jak ten

final ProgressDialog pd = new ProgressDialog(Add_Entry.this).show(Add_Entry.this,"","Please wait...", true); 
+0

ojej Rasel gdy PD jest zdefiniowany jako końcowy niż w jaki sposób możemy przypisać wartość do PD? (Według mojej wiedzy) –

+0

Oh.really? Użyj jak above.Thing trzeba dbać tworzy obiekt ProgressDialog korzystania nowy – Rasel

+1

@Jignesh Ansodariya używasz niewłaściwego kontekstu, więc spróbuj użyć właściwego kontekstu. –

3
WindowManager$BadTokenException 

ten występuje głównie z powodu zły odniesienie do kontekstu. Aby tego uniknąć, należy spróbować wymienić swój kod,

ProgressDialog.show(Add_Entry.this, "", "Please Wait...."); 

z tym,

ProgressDialog.show(v.getRootView().getContext(), "", "Please Wait...."); 
+0

ok ale próbując tego dostałem inny błąd, taki jak "Powodowany przez: java.lang.RuntimeException: Nie można utworzyć programu obsługi wewnątrz wątku, który nie nazwał Looper.prepare() " on line parentActivity.startChildActivity ("SorceOfStress", \t \t \t \t \t \t \t \t \t edycja); –

+0

Co oznacza, że ​​nie korzystasz z funkcji obsługi. Zapoznaj się z moją odpowiedzią tutaj.http: //stackoverflow.com/questions/6894698/rotating-wheel-progress-dialog-while-deleting-folder-from-sd-card/6894744#6894744 –

Powiązane problemy