2013-02-24 87 views
2

我有這個片段活動,它使用其操作欄中的下拉導航列表。根據選擇的選項,它顯示服務器中的元素列表或調用其他活動(到目前爲止,它顯示「其他活動」的油葫蘆)。爲什麼導航列表返回到位置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

回答

2

看看這個:

除非你指定,配置變化(如屏幕方向,語言,輸入設備等的變化 )將導致破壞你的 當前活動,正在經歷正常活動 生命週期過程

在某些特殊情況下,您可能希望基於一種或多種類型的配置更改,繞過重新啓動您的 活動。這是在其清單中使用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

相關問題