Accidente después de agregar el elemento al menú de opciones de la barra de acción de Fragmento seguido de cambio de orientación
Estoy usando ActionBarSherlock y ViewPagerIndicator para mostrar Fragmentos como pestañas. Uno de esos fragmentos agrega elementos a ActionBar:
private String[] mapNames; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); // init an String array `mapNames` which is used when populating submenu // ... } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_maps, menu); SubMenu mapNamesMenu = menu.findItem(R.id.map_names).getSubMenu(); mapNamesMenu.clear(); for (int i=0; i<mapNames.length; i++) { mapNamesMenu.add(1, i, Menu.NONE, mapNames[i]); } super.onCreateOptionsMenu(menu, inflater); }
Y en res/menu/fragment_maps.xml
tengo
- Insertar páginas en el medio de un FragmentPageAdapter
- Imágenes en lugar de textos de título en las pestañas del widget ViewPagerIndicator
- Aparato de vista de Android con indicador de página
- Personalizar el relleno y el margen en IconPageIndicator
- Quitar TabIndicator de PagerTabStrip en un ViewPager
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/map_names" android:title="Maps" android:icon="@drawable/maps_32" android:showAsAction="always|withText"> <menu> <item android:id="@+id/placeholder_maps" /> </menu> </item> </menu>
Todo está funcionando bien hasta que gire mi teléfono. Después de cambiar la orientación, este menú se vuelve inaccesible (no ocurre nada cuando se hace clic en el icono). Entonces, si vuelvo a girar el teléfono, obtendré este error:
FATAL EXCEPTION: main android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? at android.view.ViewRoot.setView(ViewRoot.java:532) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) at android.view.Window$LocalWindowManager.addView(Window.java:424) at android.widget.PopupWindow.invokePopup(PopupWindow.java:912) at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:824) at com.actionbarsherlock.internal.widget.IcsListPopupWindow.show(IcsListPopupWindow.java:226) at com.actionbarsherlock.internal.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:129) at com.actionbarsherlock.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:102) at com.actionbarsherlock.internal.view.menu.ActionMenuPresenter.onSubMenuSelected(ActionMenuPresenter.java:273) at com.actionbarsherlock.internal.view.menu.MenuBuilder.dispatchSubMenuSelected(MenuBuilder.java:263) at com.actionbarsherlock.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:892) at com.actionbarsherlock.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:510) at com.actionbarsherlock.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:145) at android.view.View.performClick(View.java:2494) at android.view.View$PerformClick.run(View.java:9122) at android.os.Handler.handleCallback(Handler.java:587) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3806) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) at dalvik.system.NativeStart.main(Native Method)
¿Alguna idea de cómo resolverlo? Estoy usando Android 2.3.6
Editar: vea el repositorio de pruebas
- Fijar las pestañas con android.support.v4.view.PagerTabStrip o ViewPagerIndicator
- Cambiar el nombre de página en Android Viewpager
- ¿Cómo cambiar el fondo de la pestaña en las pestañas de viewpagerindicator?
- Excepción "recurso no es un dibujable" mientras infla com.viewpagerindicator.TabPageIndicator
- Cómo agregar una vista personalizada en ViewPager para un tutorial
- Resaltar o subrayar seleccionado TabPageIndicator
- Espacio entre elementos del indicador
- ViewPagerIndicator - Establece TabPageIndicator en el centro
Creo que este es un problema de Contexto . Es por BadTokenException
está produciendo BadTokenException
.
Hay muchas posibilidades detrás de esta excepción:
1) Es posible que esté utilizando " this
" como referencia de contexto en algún lugar donde realmente necesita YourActivity.this
o el contexto de la actividad primaria.
O
2) De la log-cat
estoy adivinando, que está tratando de mostrar una ventana Pop-up
.
El problema puede ser, está mostrando ventana emergente demasiado temprano (es decir, antes de completar el ciclo de vida de Activity
). Así que espere hasta que el ciclo de vida de la actividad termine.
Para aplazar la visualización de la ventana emergente, puede consultar este enlace .
En resumen este problema se debe al siguiente caso de uso:
La referencia de una actividad se pasa a algún componente (es decir, como
Toast
,alert dialog
,pop-up
etc.) y la actividad destruida, pero ese componente aún está vivo o está intentando usar el contexto de la actividad destruida.
Así que asegúrese de que no hay ninguna situación como esta.
Espero que esto le dará alguna pista sobre la solución del problema.
Esta es tu MainActivity:
public class BaseSampleActivity extends SherlockFragmentActivity { TestFragmentAdapter mAdapter; ViewPager mPager; PageIndicator mIndicator; protected ListFragment mFrag; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.themed_titles); //This adapter can load as many fragment as you want with different content, see later mAdapter = new TestFragmentAdapter(getSupportFragmentManager()); mPager = (ViewPager)findViewById(R.id.pager); mPager.setAdapter(mAdapter); mPager.setCurrentItem(1); mIndicator = (TitlePageIndicator)findViewById(R.id.indicator); mIndicator.setViewPager(mPager); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //This show how to set up a Searhbar SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); searchView.setQueryHint("Procure pelo nome"); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // TODO Auto-generated method stub // Intent search = new Intent(getApplicationContext(), SearchableActivity.class); // search.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // search.putExtra("query", query); // startActivity(search); return true; } @Override public boolean onQueryTextChange(String newText) { // TODO Auto-generated method stub return false; } }); menu.add("Search") .setIcon(R.drawable.ic_search_inverse) .setActionView(searchView) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); //This is how to set up a SubMenu SubMenu subMenu1 = menu.addSubMenu("Action Item"); subMenu1.add(0, 1, 0, "Sample"); subMenu1.add(0, 2, 0, "Menu"); subMenu1.add(0, 3, 0, "Sair"); MenuItem subMenu1Item = subMenu1.getItem(); subMenu1Item.setIcon(R.drawable.ic_title_share_default); subMenu1Item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { //This is a switch case to do when the SubMenu is clicked. case 1: Toast.makeText(BaseSampleActivity.this, "Now "+item.getItemId(), Toast.LENGTH_SHORT).show(); return true; case 2: Toast.makeText(BaseSampleActivity.this, "Now = "+item.getItemId(), Toast.LENGTH_SHORT).show(); return true; case 3: Toast.makeText(BaseSampleActivity.this, "Now = "+item.getItemId(), Toast.LENGTH_SHORT).show(); return true; } return super.onOptionsItemSelected(item); } }
Este es tu FragmentPagerAdapter:
class TestFragmentAdapter extends FragmentPagerAdapter implements IconPagerAdapter { //Here you set up the title of each fragment, its in portuguese. protected static final String[] CONTENT = new String[] { "CATEGORIAS", "PRINCIPAL", "AS MELHORES", }; protected static final int[] ICONS = new int[] { R.drawable.perm_group_calendar, R.drawable.perm_group_camera, R.drawable.perm_group_device_alarms, }; private int mCount = CONTENT.length; public TestFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) {Fragment f = null; switch(position){ case 0: { //Here you can set up a lot of diferent fragment content, here I just created a simple //arraylistfragment f = new ArrayListFragment(); // set arguments here, if required Bundle args = new Bundle(); args.putInt(ArrayListFragment.ARG_position, position); f.setArguments(args); break; } case 1: { f = new ArrayListFragment(); // set arguments here, if required Bundle args = new Bundle(); f.setArguments(args); break; } case 2: { f = new ArrayListFragment(); // set arguments here, if required Bundle args = new Bundle(); f.setArguments(args); break; } default: throw new IllegalArgumentException("not this many fragments: " + position); } return f; } @Override public int getCount() { return mCount; } @Override public CharSequence getPageTitle(int position) { return TestFragmentAdapter.CONTENT[position % CONTENT.length]; } @Override public int getIconResId(int index) { return ICONS[index % ICONS.length]; } public void setCount(int count) { if (count > 0 && count <= 10) { mCount = count; notifyDataSetChanged(); } } }
Acabo de hacer una muestra fácil que usted puede entender fácilmente cómo implementa ActionBarSherlock y ViewPagerIndicator.
Me gustaría subir esto a github, pero tomará un tiempo para entender cómo hacerlo, tal vez usted puede enseñarme más tarde.
Luego subo esto en 4shared. http://www.4shared.com/rar/zOWrvmyu/ViewpagerandSherlock.html
Si tiene alguna pregunta, pregúnteme más tarde.
Esto funcionó para mí, pero no sé si hay algunos efectos secundarios.
Añada esto a la creatividad de Fragment
setRetainInstance(true);
Y esto a AndroidManifest.xml a la actividad que contiene el fragmento
android:configChanges="orientation"
- Android 4.4.4 Moto G Bluetooth LE vuelve a conectar el problema
- Cómo desbloquear la pantalla cuando se llama BroadcastReceiver?