Tôi đã tạo một ứng dụng thử nghiệm nhỏ thể hiện vấn đề của mình. Tôi đang sử dụng ActionBarSherlock để triển khai các tab với (Sherlock) Fragment.
Mã của tôi:
TestActivity.java
public class TestActivity extends SherlockFragmentActivity {
private ActionBar actionBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupTabs(savedInstanceState);
}
private void setupTabs(Bundle savedInstanceState) {
actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
addTab1();
addTab2();
}
private void addTab1() {
Tab tab1 = actionBar.newTab();
tab1.setTag("1");
String tabText = "1";
tab1.setText(tabText);
tab1.setTabListener(new TabListener<MyFragment>(TestActivity.this, "1", MyFragment.class));
actionBar.addTab(tab1);
}
private void addTab2() {
Tab tab1 = actionBar.newTab();
tab1.setTag("2");
String tabText = "2";
tab1.setText(tabText);
tab1.setTabListener(new TabListener<MyFragment>(TestActivity.this, "2", MyFragment.class));
actionBar.addTab(tab1);
}
}
TabListener.java
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;
public TabListener(SherlockFragmentActivity 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 (preInitializedFragment == null) {
// If not, instantiate and add it to the activity
SherlockFragment mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content, mFragment, mTag);
} else {
ft.attach(preInitializedFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
if (preInitializedFragment != null) {
// Detach the fragment, because another one is being attached
ft.detach(preInitializedFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// User selected the already selected tab. Usually do nothing.
}
}
MyFragment.java
public class MyFragment extends SherlockFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
}
return null;
}
@Override
protected void onPostExecute(Void result){
getResources().getString(R.string.app_name);
}
}.execute();
}
}
Tôi đã thêm Thread.sleep
phần để mô phỏng dữ liệu tải xuống. Các mã trong onPostExecute
là để mô phỏng việc sử dụng Fragment
.
Khi tôi xoay màn hình rất nhanh giữa ngang và dọc, tôi nhận được Ngoại lệ ở onPostExecute
mã:
java.lang.IllegalStateException: Fragment MyFragment {410f6060} không được đính kèm với Activity
Tôi nghĩ rằng đó là bởi vì một cái mới MyFragment
đã được tạo ra trong thời gian đó và đã được đính kèm với Hoạt động trước khi AsyncTask
kết thúc. Các mã trong onPostExecute
các cuộc gọi khi không được chú ý MyFragment
.
Nhưng làm thế nào tôi có thể sửa lỗi này?
Context
cái được gắn vào `mView` của bạn.
mView
trong onDestroy?
mView = inflater.inflate(R.layout.my_layout, container, false)
Và bây giờ sử dụng chế độ xem này khi bạn muốn nhận tài nguyên :mView.getResources().***
. Nó giúp tôi sửa lỗi này.