为什么导航列表返回到位置0?

问题描述:

我有这个片段活动,它使用其操作栏中的下拉导航列表。根据选择的选项,它显示服务器中的元素列表或调用其他活动(到目前为止,它显示“其他活动”的油葫芦)。为什么导航列表返回到位置0?

事情是,我发现如果我选择说选项2(第一个选项将为0),等待列表加载,然后旋转设备,导航列表返回到位置0(并加载了0选项列表)。我必须保存该选项,以便在旋转设备时,它仍会显示我选择的列表,但无论如何,导航列表都会返回到选项0。如果我现在重新旋转设备,它会加载0选项列表(因为它是那个时刻的选择)。

我的类从这个

public class TapabookListNavigationalActivity extends TapabookBaseActivity 
implements OnNavigationListener { 

protected Boolean esUnTablet = true; 
protected Fragment fragment1; 
protected Fragment fragment2; 

protected ActionBar bar; 
protected ActionBarDropDownAdapter dda; 

public static final int ID_TAPAS_RECIENTES = 0; 
public static final int ID_BUSCA_TAPA_MUNICIPIO = 1; 
public static final int ID_BUSCA_TAPA_PROVINCIA = 2; 
public static final int ID_BUSCA_TAPA= 3; 
public static final int ID_BUSCA_BAR = 4; 
public static final int ID_SUBE_TAPA= 5; 

protected ArrayList<ActionBarMenuItem> opciones; 
protected Dao mDao; 
//protected static int ID_NAVIGATIONAL_THIS = 0; 

public Dao getDao(){ 
    return mDao; 
} 

@Override 
protected void checkUserToken() { 
    if(ConfiguracionApp.getInstance().getTokenUsuario().equalsIgnoreCase("")){ 
     // no hay token 
     Intent intent = new Intent(this, EntryFA.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater menuInflater = getSupportMenuInflater(); 
    menuInflater.inflate(R.menu.menu, menu); 

    // Calling super after populating the menu is necessary here to ensure that the 
    // action bar helpers have a chance to handle this event. 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // si no está logado, que vuelva al login 
    checkUserToken(); 

    bar = getSupportActionBar(); 
    loadNavigationList(Tapabook.getProvincia(),Tapabook.getMunicipio()); 





} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    boolean handled = true; 
    Tapabook.d("TapabookListNavigationalActivity onNavigationItemSelected : " + itemId); 
    Intent intent = new Intent(this, TapaListFA.class); 
    if(itemPosition == ID_TAPAS_RECIENTES || 
      itemPosition == ID_BUSCA_TAPA_MUNICIPIO || 
      itemPosition == ID_BUSCA_TAPA_PROVINCIA || 
      itemPosition == ID_BUSCA_TAPA){ 
     croutonInfo("ID_TAPAS_RECIENTES"); 
     intent.putExtra(TapaListFA.TYPE_LIST,ID_TAPAS_RECIENTES); 
    }else if(itemPosition == ID_BUSCA_BAR){ 
     croutonInfo("ID_BUSCA_BAR"); 
    }else if(itemPosition == ID_SUBE_TAPA){ 
     croutonInfo("ID_SUBE_TAPA"); 
    }else{ 
     handled = false; 
    } 

    return handled; 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int itemId = item.getItemId(); 

    if (itemId == R.id.menu_item_acerca_de){ 

    }else if (itemId == R.id.menu_item_enviar_email){ 
     Intent intent = new Intent(Intent.ACTION_SENDTO); 
     intent.setData(Uri.parse(Tapabook.MAILTO)); 
     intent.putExtra(android.content.Intent.EXTRA_SUBJECT, Tapabook.SUBJECT); 
     startActivity(intent); 
    }else if (itemId == R.id.menu_item_privacidad){ 
     FragmentManager fm = getSupportFragmentManager(); 
     PrivacyDF pdf = new PrivacyDF(); 

     pdf.show(fm, "fragment_privacy"); 

    } 
    return false; 
} 

@Override 
public void onGeolocalizador(String direccion, String provincia, 
     String municipio, String region, float precisionMetros) { 
    super.onGeolocalizador(direccion, provincia, municipio, region, precisionMetros); 
    loadNavigationList(provincia,municipio); 

} 
protected void loadNavigationList(String provincia,String municipio){ 
    opciones = new ArrayList<ActionBarMenuItem>(); 
    opciones.add(
      new ActionBarMenuItem(
        ID_TAPAS_RECIENTES, 
        //R.drawable.ic_menu_buscar_bar, 
        getString(R.string.menu_nav_ver_últimas_tapas) 
        )); 
    opciones.add(
      new ActionBarMenuItem(
        ID_BUSCA_TAPA_MUNICIPIO, 
        //R.drawable.ic_menu_buscar_tapa, 
        getString(R.string.menu_nav_ver_tapas_municipio) 
        + " " + municipio 
        )); 
    Tapabook.d("ActionBarMenuItem Municipio " + municipio); 
    opciones.add(
      new ActionBarMenuItem(
        ID_BUSCA_TAPA_PROVINCIA, 
        //R.drawable.ic_menu_buscar_tapa, 
        getString(R.string.menu_nav_ver_tapas_provincia).replace("%%%", provincia) 
        //+ " " + provincia 
        )); 
    Tapabook.d("ActionBarMenuItem Provincia " + provincia); 
    opciones.add(
      new ActionBarMenuItem(
        ID_BUSCA_TAPA, 
        //R.drawable.ic_menu_buscar_tapa, 
        getString(R.string.menu_nav_buscar_tapas) 
        )); 
    opciones.add(
      new ActionBarMenuItem(
        ID_BUSCA_BAR, 
        //R.drawable.ic_menu_subir_tapa, 
        getString(R.string.menu_nav_buscar_bares) 
        )); 
    opciones.add(
      new ActionBarMenuItem(
        ID_SUBE_TAPA, 
        //R.drawable.ic_menu_subir_tapa, 
        getString(R.string.menu_nav_subir_tapa) 
        )); 

    dda 
    = new ActionBarDropDownAdapter(
      this, 
      R.layout.actionbar_menu_item, 
      opciones); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(dda, this); 
} 

} 

延伸,这是一个显示列表中的类

public class TapaListFA extends TapabookListNavigationalActivity { 

public static final String TYPE_LIST ="list_type"; 
public static final String LIST_LOADED ="list_loaded"; 
public static final String NAVIGATION_POINT ="navigation_point"; 
private static boolean loadedList = false; 
private static int navigationPoint = -1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tapa_list); 

    Bundle extras= getIntent().getExtras(); 
    int listType = extras.getInt(TYPE_LIST); 
    // 
    Tapabook.d("pre-prepareList >> " + listType); 
    if(!loadedList){ 
     Tapabook.d("TapaListFA.onCreate loadedList not loaded, load list"); 
     if(navigationPoint>=0){ 
      Tapabook.d("TapaListFA.onCreate navPoint: " + navigationPoint); 
      setNavigationPoint(navigationPoint); 
      //prepareList(navigationPoint); 
     }else{ 
      Tapabook.d("TapaListFA.onCreate listType: " + listType); 
      setNavigationPoint(listType); 
      //prepareList(listType); 
     } 
     loadedList = true; 
    } 


    Tapabook.d("TapaListFA.onCreate fin"); 
} 



public void prepareList(int type){ 
    Tapabook.d("TapaListFA.prepareList: " + type); 
    ListaTapasParametros ltparam = new ListaTapasParametros(); 
    ltparam.setPagina(0); 
    switch (type){ 
    case ID_BUSCA_TAPA_MUNICIPIO: 
     ltparam.setProvincia(Tapabook.getProvincia()); 
     break; 
    case ID_BUSCA_TAPA_PROVINCIA: 
     ltparam.setProvincia(Tapabook.getMunicipio()); 
     break; 
    case ID_BUSCA_TAPA: 
     croutonInfo("Buscador"); 
     break; 
    case ID_TAPAS_RECIENTES: 
     break; 
    default: 
     Tapabook.wtf("¿qué tipo está entrando? " + type); 
    } 
    Tapabook.d("TapaListFA.prepareList: showTapaList" + type); 
    showTapaList(type, ltparam); 
} 

private void showTapaList(int typeOfList, ListaTapasParametros params) { 
    Tapabook.d("TapaListFA.showTapaList" + typeOfList); 
    FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    TapaListFragment tlf = new TapaListFragment(); 

    // Replace whatever is in the fragment_container view with this fragment, 
    // and add the transaction to the back stack 
    ft.replace(R.id.tla_container, tlf); 
    ft.addToBackStack(null); 
    Bundle args = new Bundle(); 
    args.putInt(TYPE_LIST, typeOfList); 
    // Commit the transaction 
    tlf.setRetainInstance(true); 
    ft.commitAllowingStateLoss(); 
    tlf.setArguments(args); 
    tlf.loadTapaList(typeOfList, params, 0); 
    Tapabook.d("TapaListFA.showTapaList fin " + typeOfList); 
} 

public void startSearch(ListaTapasParametros params){ 
    showTapaList(ID_BUSCA_TAPA, params); 
} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    boolean handled = true; 
    Intent intent; 
    Tapabook.d("TapaListFA.onNavigationItemSelected : " + itemId); 
    if(itemId == ID_TAPAS_RECIENTES || itemId == ID_BUSCA_TAPA_MUNICIPIO 
      || itemId == ID_BUSCA_TAPA_PROVINCIA){ 
     if(navigationPoint >= itemPosition){ 
      Tapabook.d("TapaListFA.onNavigationItemSelected prepareList navigationPoint : " + navigationPoint); 
      prepareList(navigationPoint); 
     }else{ 
      Tapabook.d("TapaListFA.onNavigationItemSelected prepareList itemPosition: " + itemPosition);  
      prepareList(itemPosition); 
     } 

    }else if (itemId == ID_BUSCA_TAPA){ 
     FragmentManager fm = getSupportFragmentManager(); 
     TapaSearchDF tsdf = new TapaSearchDF(); 
     tsdf.setRetainInstance(true); 
     tsdf.show(fm, "tapa_search_fragment"); 

    }else if(itemId == ID_BUSCA_BAR || itemId == ID_SUBE_TAPA){ 
     croutonInfo("ID_BUSCA_BAR/ID_SUBE_TAPA"); 
     Tapabook.d("TapaListFA.onNavigationItemSelected buscabar/subetapa : " + itemId); 
     super.onNavigationItemSelected(itemPosition, itemId); 
    }else{ 
     handled = false; 
     Tapabook.d("TapaListFA.onNavigationItemSelected (unhandled) : " + itemId); 
    } 
    navigationPoint = (int) itemId; 
    return handled; 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    Tapabook.d("TapaListFA.onSaveInstanceState loadedList=" + loadedList); 
    outState.putBoolean(LIST_LOADED,loadedList); 
    navigationPoint = bar.getSelectedNavigationIndex(); 
    Tapabook.d("TapaListFA.onRestoreInstanceState navigationPoint=" + navigationPoint); 
    outState.putInt(NAVIGATION_POINT, navigationPoint); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    loadedList = savedInstanceState.getBoolean(LIST_LOADED); 
    Tapabook.d("TapaListFA.onRestoreInstanceState loadedList=" + loadedList); 
    navigationPoint = savedInstanceState.getInt(NAVIGATION_POINT); 
    Tapabook.d("TapaListFA.onRestoreInstanceState navigationPoint=" + navigationPoint); 
    setNavigationPoint(navigationPoint); 

} 


private void setNavigationPoint(int navPoint) { 
    Tapabook.d("TapaListFA.setNavigationPoint navPoint: " + navPoint); 
    if(navPoint>=0){ 
     bar.setSelectedNavigationItem(navPoint); 
     navigationPoint = navPoint; 
    }else 
     Tapabook.w("TapaListFA.setNavigationPoint navPoint: " + navPoint); 
} 

} 

这是logcat的当活动开始

02-24 11:37:23.491: D/TAPABOOK(31943): activities.TapaListFA.onCreate 
02-24 11:37:23.511: D/TAPABOOK(31943): TapaListFA.onCreate loadedList not loaded, load list 
02-24 11:37:23.511: D/TAPABOOK(31943): TapaListFA.onCreate listType: 0 
02-24 11:37:23.511: D/TAPABOOK(31943): TapaListFA.setNavigationPoint navPoint: 0 
02-24 11:37:23.511: D/TAPABOOK(31943): TapaListFA.onCreate fin 
02-24 11:37:23.511: D/TAPABOOK(31943): activities.TapaListFA.onStart 
02-24 11:37:23.511: D/TAPABOOK(31943): activities.TapaListFA.onResume 
02-24 11:37:24.182: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected : 0 
02-24 11:37:24.182: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected prepareList navigationPoint : 0 
02-24 11:37:24.182: D/TAPABOOK(31943): TapaListFA.prepareList: 0 
02-24 11:37:24.182: D/TAPABOOK(31943): TapaListFA.prepareList: showTapaList0 
02-24 11:37:24.182: D/TAPABOOK(31943): TapaListFA.showTapaList0 
02-24 11:37:24.212: D/TAPABOOK(31943): TapaListFA.showTapaList fin 0 
02-24 11:37:24.882: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected : 0 
02-24 11:37:24.882: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected prepareList navigationPoint : 0 
02-24 11:37:24.882: D/TAPABOOK(31943): TapaListFA.prepareList: 0 
02-24 11:37:24.882: D/TAPABOOK(31943): TapaListFA.prepareList: showTapaList0 
02-24 11:37:24.882: D/TAPABOOK(31943): TapaListFA.showTapaList0 
02-24 11:37:24.882: D/TAPABOOK(31943): TapaListFA.showTapaList fin 0 
02-24 11:37:24.923: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected : 0 
02-24 11:37:24.923: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected prepareList navigationPoint : 0 
02-24 11:37:24.923: D/TAPABOOK(31943): TapaListFA.prepareList: 0 
02-24 11:37:24.923: D/TAPABOOK(31943): TapaListFA.prepareList: showTapaList0 
02-24 11:37:24.923: D/TAPABOOK(31943): TapaListFA.showTapaList0 
02-24 11:37:24.923: D/TAPABOOK(31943): TapaListFA.showTapaList fin 0 

这里我选择选项1中的下拉菜单

02-24 11:38:04.234: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected : 1 
02-24 11:38:04.234: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected prepareList itemPosition: 1 
02-24 11:38:04.234: D/TAPABOOK(31943): TapaListFA.prepareList: 1 
02-24 11:38:04.234: D/TAPABOOK(31943): TapaListFA.prepareList: showTapaList1 
02-24 11:38:04.244: D/TAPABOOK(31943): TapaListFA.showTapaList1 
02-24 11:38:04.244: D/TAPABOOK(31943): TapaListFA.showTapaList fin 1 

现在我旋转设备。它显示正确的清单,但下拉菜单回到选项0

02-24 11:38:25.838: D/TAPABOOK(31943): activities.TapaListFA.onPause 
02-24 11:38:25.838: D/TAPABOOK(31943): TapaListFA.onSaveInstanceState loadedList=true 
02-24 11:38:25.838: D/TAPABOOK(31943): TapaListFA.onRestoreInstanceState navigationPoint=1 
02-24 11:38:25.848: D/TAPABOOK(31943): activities.TapaListFA.onStop 
02-24 11:38:25.888: D/TAPABOOK(31943): activities.TapaListFA.onCreate 
02-24 11:38:25.948: D/TAPABOOK(31943): TapaListFA.onCreate fin 
02-24 11:38:25.968: D/TAPABOOK(31943): activities.TapaListFA.onStart 
02-24 11:38:25.968: D/TAPABOOK(31943): TapaListFA.onRestoreInstanceState loadedList=true 
02-24 11:38:25.968: D/TAPABOOK(31943): TapaListFA.onRestoreInstanceState navigationPoint=1 
02-24 11:38:25.968: D/TAPABOOK(31943): TapaListFA.setNavigationPoint navPoint: 1 
02-24 11:38:25.968: D/TAPABOOK(31943): activities.TapaListFA.onResume 
02-24 11:38:26.028: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected : 1 
02-24 11:38:26.028: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected prepareList navigationPoint : 1 
02-24 11:38:26.028: D/TAPABOOK(31943): TapaListFA.prepareList: 1 
02-24 11:38:26.028: D/TAPABOOK(31943): TapaListFA.prepareList: showTapaList1 
02-24 11:38:26.028: D/TAPABOOK(31943): TapaListFA.showTapaList1 
02-24 11:38:26.028: D/TAPABOOK(31943): TapaListFA.showTapaList fin 1 
02-24 11:38:26.358: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected : 0 
02-24 11:38:26.358: D/TAPABOOK(31943): TapaListFA.onNavigationItemSelected prepareList navigationPoint : 1 
02-24 11:38:26.358: D/TAPABOOK(31943): TapaListFA.prepareList: 1 
02-24 11:38:26.358: D/TAPABOOK(31943): TapaListFA.prepareList: showTapaList1 
02-24 11:38:26.358: D/TAPABOOK(31943): TapaListFA.showTapaList1 
02-24 11:38:26.358: D/TAPABOOK(31943): TapaListFA.showTapaList fin 1 

为什么它会一直回到选项0?

+0

'loadedList'被声明为false,并且看起来它在'onCreate()'之后永远不会被修改。 – 2013-02-24 10:47:18

+0

我将'loadedList = true'从'onCreate'改为'showTapaList'方法的末尾(以确保它在每次加载新列表时都会更改),但问题仍然存在...... – Frank 2013-02-24 11:54:28

看看这个:

除非你指定,配置变化(如屏幕方向,语言,输入设备等的变化 )将导致破坏你的 当前活动,正在经历正常活动 生命周期过程

在某些特殊情况下,您可能希望基于一种或多种类型的配置更改,绕过重新启动您的 活动。这是在其清单中使用android:configChanges属性完成的 。对于任何 类型的配置更改,您说您在那里处理,您将 接收到对当前活动的 onConfigurationChanged(Configuration)方法的调用,而不是正在重新启动 。但是,如果配置更改涉及任何不是 句柄,则该活动仍会重新启动,并且不会调用 onConfigurationChanged(Configuration)

+0

嗯,我想这就是我试图通过'onSaveInstanceState' /'onRestoreInstanceState'方法实现。当更改操作栏下拉列表时(或者通过用户选择或通过setSelectedNavigationItem),必须调用其他东西。 – Frank 2013-02-24 19:38:44

+0

好吧,使用onConfigurationChanged确实有窍门。如果你正在对版本13+进行版本控制,那么请记住使用android:configChanges =“orientation | screenSize” – Frank 2013-02-25 10:40:07