2013-07-11 4 views
2

안녕하세요 저는 작업 표시 줄 및 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이 방법을 구현하는 가장 좋은 방법인지는 알 수 없습니다.

감사합니다.

답변

3

마지막으로 해결책을 찾았습니다. 나는 Main.java에서 일반 TabListener을 구현하고, 매번 화면이 회전 현재 탭 인덱스 저장 한 : 나는 LinesTab.java에 로더 콜백을 제거했습니다

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) {} 
} 
} 

FavouritesTab.java

+0

멋진 대답을! !! !! – Hevski

관련 문제