Parça Aktiviteye bağlı MyFragment değil
Benim sorunum temsil eden küçük bir test uygulaması yaptım. ActionBarSherlock (Sherlock)Parçaları ile sekmeleri uygulamak için kullanıyorum.
Benim kod:
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();
}
}
İndirme veri simüle etmek için Thread.sleep
bölümü ekledim. onPostExecute
kodu Fragment
kullanımı simüle etmek için.
Ben ekranı yatay ve dikey arasında çok hızlı döndürmek onPostExecute
kod bir özel Durum alıyorum:
java.lang.İllegalStateException: Parça MyFragment{410f6060} değil Aktivite bağlı
Yeni MyFragment
Bu arada oluşturuldu ve AsyncTask
bitmeden Aktiviteye bağlı olduğunu düşünüyorum. onPostExecute
kod üzerine bir bekar MyFragment
çağırır.
Ama bu durumu nasıl düzeltebilirim?
CEVAP
Çok basit bir cevap buldum: isAdded()
:
Eğer parça şu anda faaliyet eklenirse
true
dönüş.
@Override
protected void onPostExecute(Void result){
if(isAdded()){
getResources().getString(R.string.app_name);
}
}
Fragment
Activity
bağlı değilken çağrıldığını onPostExecute
önlemek için Fragment
duraklatma, durdurma AsyncTask
iptal etmek için. Sonra isAdded()
artık gerekli olmaz.
Faaliyetlere karşı Parça iç İçe Parçal...
Bağlı giriş değeri bir WordPress kulla...
Neden C# 4 isteğe bağlı parametreler a...
Parçalı tanımlayıcısı bağlı değil...
JavaScript: `yeni` değil kullanmak içi...