开发者

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

开发者 https://www.devze.com 2023-04-09 07:05 出处:网络
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.

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:开发者_C百科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:

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

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?


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);


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);


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);


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


I had this problem as well, but with Fragments, when adding a fragment to a view, and the answer for me was to pass in getApplicationContext(), but I had to do it through a separate method after instantiating the fragment, since it was requiring the use of a Bundle.

I also had to do the following when inflating the view, using the context passed in above:

View v = inflater.from(context).inflate(R.layout.layout_name, ViewGroup container, T/F);

rather than just:

View v = inflater.from(context).inflate(R.layout.layout_name, ViewGroup container, T/F);

Hope this helps somebody struggling with Fragments.


viewToLoad = getLayoutInflater().inflate(R.layout.line_discount, null);
(viewToLoad.getContext(), android.R.layout.simple_spinner_item, proList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

This did the job for me

0

精彩评论

暂无评论...
验证码 换一张
取 消