Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Spinner Error : android.view.WindowManager$BadTokenException: Unable to add window

Tags:

android

I want to set the spinner value using String[] or ArrayList.

I have done spinner in other activity working fine.In this activity inside the Tab acivityGroup another Tab activity.

My problem is setting values into spinner. Spinner is displaying correctly Thay means when load the activity, that is working fine but when I click On spinner its give error:

Error is :

    09-30 16:11:37.693: ERROR/AndroidRuntime(699): FATAL EXCEPTION: main
09-30 16:11:37.693: ERROR/AndroidRuntime(699): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@407f4de8 is not valid; is your activity running?
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.view.ViewRoot.setView(ViewRoot.java:527)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.app.Dialog.show(Dialog.java:241)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.widget.Spinner.performClick(Spinner.java:260)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.view.View$PerformClick.run(View.java:9080)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.os.Handler.handleCallback(Handler.java:587)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.os.Looper.loop(Looper.java:123)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at android.app.ActivityThread.main(ActivityThread.java:3683)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at java.lang.reflect.Method.invokeNative(Native Method)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at java.lang.reflect.Method.invoke(Method.java:507)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-30 16:11:37.693: ERROR/AndroidRuntime(699):     at dalvik.system.NativeStart.main(Native Method)

This is my code :

   View viewToLoad = LayoutInflater.from(this.getParent()).inflate(R.layout.line_discount, null);
    this.setContentView(viewToLoad); 

   ArrayList<String> productList = new ArrayList<String>();
    int size = products.size()+1;
    String[] proList = new String[size];
    proList[0] = "---Select----";

    for(int i = 1; i< size ;i++){
        productList.add(products.get(i-1).getDescription());
        proList[i] = products.get(i-1).getDescription();
    }

    sp = (Spinner)findViewById(R.id.spProList);
    ArrayAdapter<String> adapter = new ArrayAdapter<String> (LineDiscountActivity.this, android.R.layout.simple_spinner_item, proList);
    sp.setAdapter(adapter);

This is my image:

enter image description here

Problem in TabActivity.Because I have run this part Within the TabActivityGroup. Its was working.When I run this inside the Tab Activity within TabActivityGroup, then its a problem. I have TabActivtyGroup &Within that normal TabActivity.

How can I do in this situation?

like image 455
Piraba Avatar asked Sep 30 '11 11:09

Piraba


People also ask

What is badtokenexception in Android view?

android.view.WindowManager$BadTokenException: Unable to add window" This exception occurs when the app is trying to notify the user from the background thread (AsyncTask) by opening a Dialog.

How does the window manager protect against badtokenexception?

The window manager protects against this by requiring applications to pass their application's window token as part of each request to add or remove a window. If the tokens don't match, the window manager rejects the request and throws a BadTokenException.

What is the reason for this Android Runtime error message?

The reason for this exception is that, as the exception message says, the activity has finished but you are trying to display a dialog with a context of the finished activity. Since there is no window for the dialog to display the android runtime throws this exception.

Why am I getting asynctask finish() error in Android?

If you are trying to modify the UI from background thread (usually from onPostExecute () of AsyncTask) and if the activity enters finishing stage i.e.) explicitly calling finish (), user pressing home or back button or activity clean up made by Android then you get this error.


4 Answers

I think you have context problem.Try to get context using below method

you can create a new activity and set its theme to dialog theme so that when you start your activity it will display as dialog. For more information about dialog see below post

Click here

EDIT2

I found a solution for badTokenExcaption

In your activity's onCreate() method replace the line setContentView(R.layout.XXXXX) by

View viewToLoad = LayoutInflater.from(this.getParent()).inflate(R.layout.XXXXX, null);
this.setContentView(viewToLoad); 

and replace the spinner code by following lines

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.medicine_types, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
spDosageType.setAdapter(adapter);
like image 182
Dharmendra Avatar answered Nov 04 '22 15:11

Dharmendra


It's obvious from the error message that the problem is with context used for creating the spinner. Try this

viewToLoad = LayoutInflater.from(this).inflate(R.layout.line_discount, null);

Or:

viewToLoad = getLayoutInflater().inflate(R.layout.line_discount, null);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
                        android.R.layout.simple_spinner_item, proList);
sp.setAdapter(adapter);
like image 39
Ronnie Avatar answered Nov 04 '22 14:11

Ronnie


When you create your ArrayAdapter you should pass the Context of your ActivityGroup not the Context of your current Activity.

Here is an example of how I get it:

  public class MyActivityGroup extends ActivityGroup{
       pulbic static MyActivityGroup sGroup;

       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            sGroup=this;
            //...
       }
  }

  // Tab Implementation
  //.....
  ArrayAdapter<String> adapter = new ArrayAdapter<String> (
          MyActivityGroup.sGroup, android.R.layout.simple_spinner_item, proList);
like image 44
Ovidiu Latcu Avatar answered Nov 04 '22 14:11

Ovidiu Latcu


I tried with code.Its working fine:

 View viewToLoad;
 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    viewToLoad = LayoutInflater.from(getDialogContext(this)).inflate(R.layout.header_discount, null);
    this.setContentView(viewToLoad); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String> (viewToLoad.getContext(), android.R.layout.simple_spinner_item, proList);
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
     headerDisProdCode.setAdapter(adapter);

     headerDisProdCode.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view,int arg2, long arg3) {
            seletcedProductName = parent.getSelectedItem().toString();
            seletcedProductCode = (products.get((int) headerDisProdCode.getSelectedItemId())).getProductCode();

        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });

}

ArrayAdapter context I gave like : viewToLoad.getContext() viewToLoad is the inflate

like image 22
Piraba Avatar answered Nov 04 '22 15:11

Piraba