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.
}
}
Và StationsFragment
(RouteFragment
và DelaysFragment
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);
}
}
Cảm ơn người đàn ông, nó đã giúp một ai đó. – NotCamelCase
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
+1 Điều đó hoạt động thực sự tốt, cảm ơn :)! – AgentKnopf