it-swarm.com.ru

Фрагмент получена ошибка "Активность была уничтожена"

Я сделал очень простой Activity , который показывает простой ListFragment как показано ниже:

Моя активность:

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));
    }
   ...
}

Когда я запускаю свое приложение, я получаю сообщение об ошибке :

 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)
...

Он жалуется, что Деятельность была разрушена , Почему ???

Постскриптум 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

Я также столкнулся с подобной проблемой.
Я понял, что это произошло потому, что действие было уничтожено, когда FragmentTransaction собирался получить .commit().

Решением этой проблемы было проверить, является ли Activity.isFinishing() истинным или нет.

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

Я понял сам, это потому, что я пропустил super.onCreate(savedInstanceState); в моем методе Activity onCreate (). После того, как добавил это, все в порядке. 

32
Leem.fin

Я столкнулся с той же проблемой и не смог ее исправить . Событие, которое я добавил, также проверяет isFinishing (). но не повезло.

затем я добавил еще одну проверку isDestroyed (), и теперь она работает нормально.

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

Чтобы дать объяснение:

Каркас создает Activity и вызывает Activity.onCreate().

Activity.onCreate() каким-либо образом присоединится к FragmentManager, чтобы сообщить ему о деятельности хостинга. Activity.onDestroy() снова отменит регистрацию.

Теперь вы расширяете Activity и переопределяете onCreate(). Вы делаете вызовы FragmentManager без вызова toActivity.onCreate(). Вся логика регистрации, описанная выше, не выполняется. Поэтому FragmentManager ничего не знает об операции и предполагает, что она уже уничтожена, и генерирует исключение с вводящим в заблуждение сообщением об ошибке.

4
sstn

Просто чтобы убедиться, что я вижу это правильно, MyActivity - это действие, которое вы пытаетесь запустить, а затем добавить экземпляр FirstFragment, верно?

Сразу же я вижу две вещи, на которые нужно посмотреть

1) В своей деятельности вы никогда не вызываете setContentView () или super.onCreate (). Первый вызов может быть для вас огромной проблемой, потому что это означает, что ваш макет никогда не был раздут, и, следовательно, переменная R не существует

2) Ваша MyActivity должна иметь свой собственный XML-файл макета, которого у него нет.

2
David C. Sainte-Claire

то, что я сделал, это сразу после совершения звонка 

fragmentManager.executePendingTransactions();

и никогда не пытайтесь зафиксировать после вызова onpause()

Прочитайте это Artical Фрагмент транзакций и деятельности State Loss

1
Asim Habib

Все еще плохо, потому что получил ошибку «Деятельность была уничтожена»

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

Так что мое решение - проверка на добавление if (!isFinishing()&&!isDestroyed())

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

Если кто-либо сталкивался с подобным типом проблемы:

Я столкнулся с тем же временем проблемы, но в моем случае из Main Activity я звонил Fragment1, а затем, если пользователь щелкнул на Fragment1 Layout, я хочу запустить еще один Fragment2 Layout.

Мне удалось запустить Fragment1 из основного действия, но Fragment1 to Fragment2 это не удавалось, за исключением того, что «действие было уничтожено»

Я решил вышеупомянутую проблему, поддерживая объект FragmentManager как статический в классе MainActivity . приватный статический FragmentManager mfragmentManager = null;

вызов обоих фрагментов с использованием одного и того же объекта, решил мою проблему.

Ниже приведен мой код переключения фрагментов из основной активности.

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 (saveInstanceState) вызовет метод onCreate во FragmentActivity, который вызовет функцию mFragments.attachHost(null /*parent*/);

Это предложение будет присваивать значение mHost во FragmentController, когда вы вызываете FragmentTransaction.commit (),

В методе enqueueAction() он имеет следующие предложения 

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

Так что, если вы не вызывали super.onCreate (saveInstanceState) до того, как вы передадите FragmentTransaction, вы получите это исключение, потому что mHost имеет значение null 

0
dx3904