Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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

 <?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

  • Personalizar el relleno y el margen en IconPageIndicator
  • El indicador de paginación de círculo no se ve alrededor
  • ¿Cómo cambiar el fondo de la pestaña en las pestañas de viewpagerindicator?
  • ViewPagerIndicator - Establece TabPageIndicator en el centro
  • ViewPager con indicador sin la biblioteca de soporte de Android
  • Android: RecyclerView dentro de un ScrollView
  • No se pudo encontrar el estilo vpiCirclePageIndicatorStyle
  • ViewPager dentro de Fragmento pierde contenido al volver a él
  • 3 Solutions collect form web for “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”

    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" 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.