2013-07-11 25 views
2

嗨我遇到操作欄和使用ABS的選項卡問題。我有兩個選項卡,第一個選項卡,「收藏夾」,只是延伸Fragment,並沒有顯示任何內容。第二個「行」擴展了SherlockListFragment並實現了LoaderManager.LoaderCallbacks(從數據庫加載用戶列表)。Android操作欄選項卡:屏幕旋轉

該應用程序工作正常(或者至少,我認爲是這樣),但是當我旋轉屏幕時出現問題。如果我選擇了LinesTab(顯示列表)並處於縱向模式,然後切換到橫向,則FavouritesTab的內容(最初爲空)將填充LinesTab的內容。

這是代碼的重要部分。

Main.java(創建兩個標籤)

public class Main extends SherlockFragmentActivity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(true); 

    Tab tab = actionBar 
      .newTab() 
      .setText("Favourites") 
      .setTabListener(new FavouritesTab()); 
    actionBar.addTab(tab); 

    tab = actionBar 
      .newTab() 
      .setText("Lines") 
      .setTabListener(new LinesTab()); 
    actionBar.addTab(tab); 
    } 
} 

LinesTab.java(即使用LoaderManager加載用戶數據庫的選項卡)

public class LinesTab extends SherlockListFragment implements ActionBar.TabListener, 
    LoaderManager.LoaderCallbacks<ArrayList<User>> { 
UserAdapter adapter; 
Database db; 

public void onCreate(Bundle savedInstanceState) { 
    adapter = new UserAdapter(getActivity(), new ArrayList<User>()); 
    setListAdapter(adapter); 
    getActivity().getSupportLoaderManager().initLoader(0, null, this); 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { 
    return super.onCreateView(inflater, container, state); 
} 

@Override 
public void onActivityCreated(Bundle state) { 
    super.onActivityCreated(state); 
} 

// TabListener callbacks 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    ft.add(android.R.id.content, this, "LinesTabTag"); 
    ft.attach(this); 
} 

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 
    ft.detach(this); 
} 

public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {} 

// LoaderCallbacks 
@Override 
public Loader<ArrayList<User>> onCreateLoader(int id, Bundle args) { 
    db = new Database(getActivity()); 
    return new UserLoader(getActivity(), db); 
} 

@Override 
public void onLoadFinished(Loader<ArrayList<User>> loader, 
          ArrayList<User> usuarios) { 
    ((UserAdapter) getListAdapter()).update(usuarios); 
    ((UserAdapter) getListAdapter()).notifyDataSetChanged(); 
} 

@Override 
public void onLoaderReset(Loader<ArrayList<User>> loader) { 
    setListAdapter(null); 
} 
} 

FavouritesTab.java(其他選項卡,不顯示任何東西)

public class FavouritesTab extends Fragment implements ActionBar.TabListener { 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { 
    return super.onCreateView(inflater, container, state); 
} 

// TabListener callbacks 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    ft.add(android.R.id.content, this, "LinesTabTag"); 
    ft.attach(this); 
} 

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 
    ft.detach(this); 
} 

public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {} 
} 

此外,我不太相當確定是否所有代碼都以正確的方式實現。具體爲onTabSelected方法。在Android documentation他們實現了一個監聽器來管理所有的片段,但我在每個片段中都實現了一個監聽器。所以我不知道ft.add然後ft.attach是實現該方法的最佳方式。

謝謝。

回答

3

最後我找到了解決方案。我實現了在Main.java一般TabListener並保存當前選項卡索引每次屏幕旋轉:和

Main.java

public class Main extends SherlockFragmentActivity { 
int pos = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(true); 

    if (savedInstanceState != null) { 
     // Restore the last tab position 
     pos = savedInstanceState.getInt("pos"); 
    } 

    Tab tab = actionBar 
      .newTab() 
      .setText("Favourites") 
      .setTabListener(new TabListener<FavouritesTab>(this, "Favourites", FavouritesTab.class)); 
      //.setTabListener(new FavouritesTab()); 
    actionBar.addTab(tab); 

    tab = actionBar 
      .newTab() 
      .setText("Lines") 
      .setTabListener(new TabListener<LinesTab>(this, "LinesTab", LinesTab.class)); 
      //.setTabListener(new LinesTab()); 
    actionBar.addTab(tab); 

    // Set the last tab position, or zero by default 
    getSupportActionBar().setSelectedNavigationItem(pos); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // Save the current tab position 
    super.onSaveInstanceState(outState); 
    outState.putInt("pos", getSupportActionBar().getSelectedNavigationIndex()); 
} 

// The TabListener 
static class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private Fragment mFragment; 
    private SherlockFragmentActivity mActivity; 
    private String mTag; 
    private Class<T> mClass; 

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // Check if the fragment is already initialized 
     if (mFragment == null) { 
      // If not, instantiate and add it to the activity 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      // If it exists, simply attach it on order to show it 
      ft.attach(mFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) {} 
} 
} 

我在LinesTab.java刪除裝載機回調FavouritesTab.java

+0

偉大的答案! ! – Hevski