嗨我遇到操作欄和使用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
是實現該方法的最佳方式。
謝謝。
偉大的答案! ! – Hevski