Как заменить устаревшую TabActivity без вложения фрагментов в фрагменты? - PullRequest
1 голос
/ 26 января 2012

Мое приложение простое.У меня есть основной вид деятельности с некой док-станцией внизу, с 4 значками: A, B, C, D.

При запуске приложений значок A активен, а его содержимое отображается наэкран.Содержимое A - это ViewPager, содержащий 3 экрана, которые вы можете изменить, проводя по горизонтали.

Таким образом, моя основная деятельность - это FragmentActivity, которая имеет структуру содержимого «frame» и фрагмент «dock».Следовательно, разметка кадра надувается пейджером.

Проблема в том, что мой ViewPager содержит 3 фрагмента.Следовательно, эти 3 фрагмента вкладываются во фрагмент контента.Если я пытаюсь заменить Фрагмент содержимого (т. Е. ViewPager) другим Фрагментом (скажем, пользователь щелкнул значок B в доке), он вылетает, потому что Android не поддерживает вложенные Фрагменты.

Я пытался изменитьосновное действие для TabActivity, так что 3 фрагмента будут вложены в действие вместо фрагмента.Это здорово, это работает.

За исключением того, что TabActivity устарела, и мне рекомендуется использовать ... Фрагменты!

Что здесь можно сделать?

Редактировать: позвольте мневставьте трассировку стека

01-26 00:03:41.167 E/AndroidRuntime(32723): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addViewInner(ViewGroup.java:3344)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addView(ViewGroup.java:3215)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addView(ViewGroup.java:3172)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.view.ViewGroup.addView(ViewGroup.java:3152)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:874)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.os.Handler.handleCallback(Handler.java:605)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.os.Looper.loop(Looper.java:137)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at android.app.ActivityThread.main(ActivityThread.java:4340)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at java.lang.reflect.Method.invokeNative(Native Method)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at java.lang.reflect.Method.invoke(Method.java:511)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-26 00:03:41.167 E/AndroidRuntime(32723):     at dalvik.system.NativeStart.main(Native Method)

Edit2: больше кода

В XML у меня есть FrameLayout

В моей основной деятельности onCreate:

    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.main_contents, new HomeFragment());
    ft.commit();

Таким образом, ViewPager не реализован в XML, но программно добавлен в FrameLayout.

Сбой происходит, когда я пытаюсь создать новую транзакцию, которая .replace() s R.id.main_contents с new SurvivalFragment()

Ответы [ 2 ]

1 голос
/ 04 декабря 2012

Хорошая новость: теперь вложенные фрагменты поддерживаются в Jelly Bean и новейшем пакете поддержки

0 голосов
/ 26 января 2012

Извините. После поиска немного больше, я нашел это: Ошибка обмена / добавления фрагмента XML

Мне просто нужно было установить последний параметр inflate на false. Мой плохой.

РЕДАКТИРОВАТЬ: Я все еще на самом деле ищу лучшую альтернативу. Я использую устаревшую TabActivity. Я действительно хочу использовать API фрагментов, но я просто не могу делать то, что мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...