मैंने एक छोटा परीक्षण ऐप बनाया है जो मेरी समस्या का प्रतिनिधित्व करता है। मैं (शर्लक) टुकड़े के साथ टैब को लागू करने के लिए ActionBarSherlock का उपयोग कर रहा हूं।
मेरा कोड:
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();
}
}
मैंने Thread.sleep
डेटा डाउनलोड करने के लिए अनुकरण करने के लिए भाग जोड़ा है । का onPostExecute
उपयोग करने के लिए अनुकरण में कोड है Fragment
।
जब मैं परिदृश्य और पोर्ट्रेट के बीच बहुत तेज़ी से स्क्रीन को घुमाता हूं, तो मुझे onPostExecute
कोड में एक अपवाद प्राप्त होता है :
java.lang.IllegalStateException: खंड MyFragment {410f6060} गतिविधि से संबंधित नहीं
मुझे लगता है कि यह इसलिए है क्योंकि MyFragment
इस बीच एक नया बनाया गया है, और AsyncTask
समाप्त होने से पहले गतिविधि से जुड़ा था । onPostExecute
एक अनासक्त पर कॉल में कोड MyFragment
।
लेकिन मैं इसे कैसे ठीक कर सकता हूं?
Context
`mView` से जुड़ी है।
mView
onDestroy में शून्य पाने के बारे में?
mView = inflater.inflate(R.layout.my_layout, container, false)
और अब इस दृश्य का उपयोग तब करें जब आप संसाधन प्राप्त करना चाहते हैंmView.getResources().***
:। इस बग को ठीक करने में मेरी मदद करता है।