it-swarm.asia

Çok basit bir kod, ancak Fragment kullandığınızda "Etkinlik yok edildi" hatası aldı 

Çok basit yaptım Etkinlik basit bir gösterir ListFragment like:

Faaliyetim:

public class MyActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
          FragmentManager fragMgr = getSupportFragmentManager();

          FirstFragment list = new FirstFragment();
          fragMgr.beginTransaction().add(Android.R.id.content, list).commit();
    }

}

ListFragment:

public class FirstFragment extends ListFragment{

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        inflater.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        View view = inflater.inflate(R.layout.main, null);
        return view;
    }


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

        String listContent[] = {"Larry", "Moe", "Curly"}; 
        setListAdapter(new ArrayAdapter<String>(getActivity(), R.layout.list_item, listContent));
    }
   ...
}

Uygulamama başladığımda, hata mesajını aldım :

 Java.lang.IllegalStateException: Activity has been destroyed
E/AndroidRuntime(  947):    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2496)
E/AndroidRuntime(  947):    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2512)
E/AndroidRuntime(  947):    at Android.app.ActivityThread.access$2200(ActivityThread.Java:119)
E/AndroidRuntime(  947):    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1863)
E/AndroidRuntime(  947):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
E/AndroidRuntime(  947):    at Android.os.Looper.loop(Looper.Java:123)
E/AndroidRuntime(  947):    at Android.app.ActivityThread.main(ActivityThread.Java:4363)
E/AndroidRuntime(  947):    at Java.lang.reflect.Method.invokeNative(Native Method)
...

Faaliyetin imha edildiğinden şikayetçi , Neden ???

Not; main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:orientation="vertical"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent"
  Android:paddingLeft="8dp"
  Android:paddingRight="8dp">

  <Button
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="next" />

  <ListView
    Android:id="@Android:id/list"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="#00FF00"
    Android:layout_weight="1"
    Android:drawSelectorOnTop="false" />

  <TextView
    Android:id="@Android:id/empty"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="#FF0000"
    Android:text="No data" />
</LinearLayout>
18
Leem.fin

Ben de benzer bir problemle karşılaştım.
Bunun olduğunu gördüm, çünkü FragmentTransaction.commit() almak üzereyken aktivite yok edildi.

Bunun bir çözümü Activity.isFinishing() öğesinin doğru olup olmadığını kontrol etmektir.

if (!isFinishing()) {
  FragmentTransaction ft = getSupportFragmentManager()
     .beginTransaction();
  ft.replace(SOME_RES_ID, myFragmentInstance);
  ft.commit();
}
67
rishabhmhjn

Kendimi anladım, çünkü Activity onCreate () yöntemimde super.onCreate(savedInstanceState); işlevini özledim. Bunu ekledikten sonra her şey yolunda. 

32
Leem.fin

Aynı sorunla karşılaştım ve bu sorunu çözemedim. Eklenen olay isFinishing () kontrolünden de geçti. ama hayır şans.

sonra bir tane daha çek ekledim isDestroyed () ve şimdi iyi çalışıyor.

if (!isFinishing() && !isDestroyed()) {
  FragmentTransaction ft = getSupportFragmentManager()
     .beginTransaction();
  ft.replace(LAYOUT_ID, myFragmentInstance);
  ft.commit();
}
12
vikoo

Bir açıklama yapmak için:

Çerçeve Activity oluşturur ve Activity.onCreate() öğesini çağırır.

Activity.onCreate() bir şekilde, barındırma etkinliği hakkında bilgi vermek için FragmentManager öğesine eklenecektir. Activity.onDestroy() tekrar kaydını silecek.

Şimdi, Activity öğesini uzatır ve onCreate() öğesini geçersiz kılarsınız. ToActivity.onCreate() işlevini çağırmadan FragmentManager çağrıları yaparsınız. Yukarıda açıklanan tüm kayıt mantığı yürütülmemektedir. Bu nedenle FragmentManager, aktivite hakkında hiçbir şey bilmez ve zaten tahrip edildiğini varsayar ve yanıltıcı hata mesajıyla istisna yaratır.

4
sstn

Bu hakkı gördüğümden emin olmak için, MyActivity, başlatmaya çalıştığınız etkinlik ve ardından içine bir FirstFragment örneği ekliyor, değil mi?

Hemen bakmanız gereken iki şey görüyorum

1) Etkinliğinizde asla setContentView () veya super.onCreate () öğesini çağırmazsınız. İlk görüşme sizin için çok büyük bir sorun olabilir çünkü bu, düzeninizin hiç şişirilmediği ve dolayısıyla R değişkeni bulunmadığı anlamına gelir

2) MyActivity'nizin, sahip olmadığı kendi xml düzen dosyasına sahip olması gerekir.

yaptığım şey hemen sonra aradığımı 

fragmentManager.executePendingTransactions();

ve onpause() çağrısından sonra asla işlem yapmayı denemeyin

Bu Makaleyi Okuyun Parça İşlemleri ve Aktivite Durum Kaybı

1
Asim Habib

Yine de kötü, çünkü “Etkinlik yok edildi” hatası aldı.

ava.lang.IllegalStateException: Activity has been destroyed fragmentTransaction.commitAllowingStateLoss();

Bu yüzden benim çözüm benim kontrol if (!isFinishing()&&!isDestroyed()) eklemek

 if (!isFinishing()&&!isDestroyed()) {
                        fragmentTransaction.commitAllowingStateLoss();
                    }
                }
1
Serg Burlaka

Herhangi biri benzer türde bir sorunla karşılaşırsa:

Aynı zamanda sorunla karşı karşıya kalıyordum, fakat benim durumumda Ana Faaliyet'ten Fragment1'e çağırıyordum ve ardından kullanıcı Fragment1 Layout'a tıklarsa başka bir Fragment2 Layout başlatmak istiyorum.

Fragment1'i Ana faaliyetten başlatmayı başardım, ancak Fragment1'den Fragment2'ye "Aktivite yok edildi" istisnası ile başarısız oldu. 

MainActivity sınıfında FragmentManager nesnesini statik olarak tutarak yukarıdaki sorunu çözdüm. Private static FragmentManager mfragmentManager = null;

her iki parçayı da yukarıdaki nesneyi kullanarak aramak, sorunumu çözdü.

Ana Aktivitedeki Fragman değiştirme kodum aşağıdadır.

public void switchToFragment(String fragmentName){
        Fragment fragment = null;
        switch (fragmentName) {
            case "Fragment1":{
                fragment = new Fragment1();
                break;
            }
            case "Fragment2": {
                fragment = new Fragment2();
                break;
            }
        }

        FragmentTransaction transaction = mfragmentManager.beginTransaction();
        transaction.replace(R.id.fragment_container, fragment);
        transaction.commit();
    }
0
Rohan J Mohite

super.onCreate (savedInstanceState), FragmentActivity'de onCreate yöntemini çağırır; bu, mFragments.attachHost(null /*parent*/); işlevini çağırır.

Bu cümle, FragmentTransaction.commit () işlevini çağırdığınızda FragmentController'da mHost öğesine bir değer atar.

enqueueAction() yönteminde şu cümlelere sahiptir: 

 if (mDestroyed || mHost == null) {
        throw new IllegalStateException("Activity has been destroyed");
 }

Eğer bir fragmanTransaction yapmadan önce super.onCreate (savedInstanceState) öğesini çağırmadıysanız, mHost boş olduğundan bu istisnayı alırsınız. 

0
dx3904