Android Spinner Error: android.view.WindowManager $ BadTokenException: No se puede agregar la ventana
Quiero establecer el valor de spinner usando String [] o ArrayList.
He hecho spinner en otra actividad que trabaja fino. En esta actividad dentro de la actividad de la tabulación acivityGroup otra actividad de la lengüeta.
Mi problema es establecer valores en spinner. Spinner está mostrando correctamente Thay significa que cuando carga la actividad, que está funcionando bien, pero cuando hago clic en el hilandero su error de dar:
El error es:
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)
Este es mi código:
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);
Esta es mi imagen:
Problema en TabActivity.Because he ejecutado esta parte Dentro de la TabActivityGroup. Su estaba working.When ejecutar esto dentro de la actividad Tab en TabActivityGroup, entonces su un problema. Tengo TabActivtyGroup y dentro de ese TabActivity normal.
¿Cómo puedo hacer en esta situación?
Por favor, que alguien me ayude
Gracias
Creo que tiene problema de contexto.Trate de obtener el contexto utilizando el método de abajo
Puede crear una nueva actividad y establecer su tema en tema de dialog theme
para que al iniciar su actividad se muestre como diálogo. Para obtener más información sobre el diálogo, vea más adelante la publicación
haga clic aquí
EDIT2
Encontré una solución para badTokenExcaption
En el método onCreate()
su actividad, sustituya la línea setContentView(R.layout.XXXXX)
por
View viewToLoad = LayoutInflater.from(this.getParent()).inflate(R.layout.XXXXX, null); this.setContentView(viewToLoad);
Y reemplace el código del hilandero siguiendo las siguientes líneas
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);
Su obvio del mensaje de error que el problema es con el contexto usado para crear el hilandero. Prueba esto
viewToLoad = LayoutInflater.from(this).inflate(R.layout.line_discount, null);
O
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);
Cuando crea su ArrayAdapter
debe pasar el Context
de su ActivityGroup
no el Context
de su Activity
actual.
He aquí un ejemplo de cómo lo obtengo:
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);
He intentado con el código. Está funcionando bien:
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 He dado como: viewToLoad.getContext()
viewToLoad es el inflar
Tuve este problema también, pero con Fragments, al agregar un fragmento a una vista, y la respuesta para mí era pasar en getApplicationContext()
, pero tuve que hacerlo a través de un método separado después de instanciar el fragmento, ya que era Requiriendo el uso de un paquete.
También tuve que hacer lo siguiente al inflar la vista, usando el contexto pasado arriba:
View v = inflater.from(context).inflate(R.layout.layout_name, ViewGroup container, T/F);
En vez de simplemente:
View v = inflater.from(context).inflate(R.layout.layout_name, ViewGroup container, T/F);
Espero que esto ayude a alguien que lucha con Fragmentos.
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);
Esto hizo el trabajo para mí