안녕하세요 저는 작업 표시 줄 및 ABS를 사용하는 탭에 문제가 있습니다. 두 개의 탭이 있습니다. 첫 번째 탭은 "즐겨 찾기"로, Fragment
으로 확장되어 아무 것도 표시되지 않습니다. 두 번째 행 인 "Lines"는 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
(A 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