2012-05-08 36 views
20

Tôi đang tạo ứng dụng sử dụng ActionBarSherlock. Ứng dụng bao gồm ba tab và trong mỗi tab, nhiều màn hình được hiển thị liên tục dựa trên đầu vào của người dùng. Tôi có thể chuyển đổi Phân đoạn giữa các tab nhưng việc chuyển đổi các đoạn trong các tab sẽ gây ra sự cố. Tôi đã thử nó như thế này:Chuyển đoạn trong tab

Trong lớp học chính:

SingleStationFragment singleStationFragment = new SingleStationFragment(); 
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(android.R.id.content, singleStationFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

này thay thế đoạn đầu tiên cho phần thứ hai, nhưng khi tôi thay đổi các tab, đoạn thứ hai là vẫn còn nhìn thấy, cho thấy nội dung của tab mới ở đầu nội dung của tab cũ. Tôi nghĩ rằng bằng cách nào đó tôi cần phải tách mảnh thứ hai trong onTabUnselected, nhưng tôi không có ý tưởng làm thế nào để có được một tham chiếu đến Fragment này.

Có ai có thể giúp tôi với điều này không?

Để rõ ràng, một số lớp học có ý nghĩa:

Lớp học của tôi chính:

public class TreinVerkeer extends SherlockFragmentActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setupTabs(savedInstanceState); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return true; 
    } 

    private void setupTabs(Bundle savedInstanceState) { 
     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class)); 
     actionBar.addTab(tab); 

     tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class)); 
     actionBar.addTab(tab); 

     tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class)); 
     actionBar.addTab(tab); 

     if (savedInstanceState != null) { 
      actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
    } 
} 

Các TabListener (từ "Adding Navigations Tabs" on the Android developer site với một số thay đổi nhỏ):

public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { 
    private SherlockFragment mFragment; 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    /** 
    * Constructor used each time a new tab is created. 
    * 
    * @param activity 
    *   The host Activity, used to instantiate the fragment 
    * @param tag 
    *   The identifier tag for the fragment 
    * @param clz 
    *   The fragment's Class, used to instantiate the fragment 
    */ 
    public TabListener(Activity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    /* The following are each of the ActionBar.TabListener callbacks */ 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 

    // Check if the fragment is already initialized 
    if (mFragment == null && preInitializedFragment == null) { 
     // If not, instantiate and add it to the activity 
     mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); 
     ft.add(android.R.id.content, mFragment, mTag); 
    } else if (mFragment != null) { 
     // If it exists, simply attach it in order to show it 
     ft.attach(mFragment); 
    } else if (preInitializedFragment != null) { 
     ft.attach(preInitializedFragment); 
     mFragment = preInitializedFragment; 
    } 
} 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      // Detach the fragment, because another one is being attached 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // User selected the already selected tab. Usually do nothing. 
    } 
} 

StationsFragment (RouteFragmentDelaysFragment giống nhau, chỉ với văn bản khác nhau)

public class StationsFragment extends SherlockFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.stationsfragment, container, false); 
    } 
} 

Trả lời

24

Vậy điều gì đã xảy ra là, trong TabListener, trong phương pháp onTabUnselected, các Fragment đã không tách ra, làm cho nó vẫn có chương trình trong khi một mới Fragment được hiển thị.

Nguyên nhân của việc này là, Fragment được tách ra là mảnh đầu tiên và không phải là đoạn thứ hai của tôi. Tôi đã thực hiện một số thay đổi.

Trong Activity:

SingleStationFragment singleStationFragment = new SingleStationFragment(); 
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(android.R.id.content, singleStationFragment, "STATIONS"); 
transaction.addToBackStack(null); 
transaction.commit(); 

Ở đây tôi đã thêm thẻ "STATIONS" trong phương pháp replace(), đó là thẻ giống như đoạn đầu tiên.
Các TabListener tại là như sau:

public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { 
    private final SherlockFragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    private SherlockFragment mFragment; 

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

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     if (preInitializedFragment == null) { 
      mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); 
      ft.add(R.id.treinverkeer_fragmentcontent, mFragment, mTag); 
     } else { 
      ft.attach(preInitializedFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 

     if (preInitializedFragment != null) { 
      ft.detach(preInitializedFragment); 
     } else if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // User selected the already selected tab. Usually do nothing. 
    } 
} 

Trong phương pháp onTabUnselected bây giờ tôi đầu tiên lấy đúng Fragment, sau đó tách nó.

Hy vọng điều này sẽ giúp ai đó!

+2

Cảm ơn người đàn ông, nó đã giúp một ai đó. – NotCamelCase

+0

Bạn có thể vui lòng gửi cho tôi một số mã không, đây chính xác là những gì tôi đang cố gắng làm. – user1730789

+0

+1 Điều đó hoạt động thực sự tốt, cảm ơn :)! – AgentKnopf

Các vấn đề liên quan