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:
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?
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.
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With