Это небольшое приложение для тестирования Android 2.2 с использованием пакета совместимости. Это (неправильно, конечно) способ, которым я пытаюсь заменить фрагмент при получении щелчка. Я пытаюсь заменить его новым (другим) экземпляром того же класса Fragment. Как я объясню, он работает не так, как ожидалось, и мне нужна помощь:
public class MainFragmentActivity extends FragmentActivity {
...
public void myAction(View view) {
...
RightFragment newRightFrag = RightFragment.newInstance(myNewOption);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
ft.replace(R.id.landscape_right_fragment, newRightFrag);
ft.commit();
}
}
Вы наверняка увидели, что моя ошибка. В любом случае давайте немного разъясним, что должно делать приложение:
Ориентация ландшафта:
--------- ----------
| L | R | -> click -> | L | R2 |
--------- ----------
В альбомной ориентации активность имеет представление с двумя фрагментами: "leftLand" и "rightLand" , и если вы нажмете кнопку фрагмента "leftLand" , то он изменит создание нового фрагмента и заменит фрагмент "rightLand" экземпляр с другим экземпляром того же класса FragamentActivity. Что отличает эти два экземпляра, это параметр, переданный в "newInstance (int)", на основе щелкнутой кнопки.
Ориентация портрета:
----- -----
| | | |
| L | -> click -> | R |
| | | |
----- -----
В портретной ориентации он просто показывает фрагмент "leftPort" (имеет тот же макет, что и "leftLand" ), и если вы нажмете на его кнопку, тогда он запускает Intent и запускает RightFragmentActivity, в котором отображается фрагмент "rightLand"
Он отлично работает... если я не заменю правый фрагмент. Если я это сделаю (нажав кнопку в альбомной ориентации), то при последующем изменении ориентации (перезагрузка активности) FragmentActivity не может запускаться из-за "IllegalStateException: Fragment RightFragment did not create a view
" следующим образом:
D/AndroidRuntime( 1428): Shutting down VM
W/dalvikvm( 1428): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/AndroidRuntime( 1428): FATAL EXCEPTION: main
E/AndroidRuntime( 1428): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.agm.test/com.agm.test.MainFragmentActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class fragment
E/AndroidRuntime( 1428): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime( 1428): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 1428): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815)
E/AndroidRuntime( 1428): at android.app.ActivityThread.access$2400(ActivityThread.java:125)
E/AndroidRuntime( 1428): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037)
E/AndroidRuntime( 1428): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1428): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 1428): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 1428): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1428): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 1428): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 1428): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 1428): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1428): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class fragment
E/AndroidRuntime( 1428): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:582)
E/AndroidRuntime( 1428): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
E/AndroidRuntime( 1428): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime( 1428): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime( 1428): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime( 1428): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
E/AndroidRuntime( 1428): at android.app.Activity.setContentView(Activity.java:1647)
E/AndroidRuntime( 1428): at com.agm.test.MainFragmentActivity.onCreate(MainFragmentActivity.java:25)
E/AndroidRuntime( 1428): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime( 1428): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime( 1428): ... 12 more
E/AndroidRuntime( 1428): Caused by: java.lang.IllegalStateException: Fragment com.agm.test.RightFragment did not create a view.
E/AndroidRuntime( 1428): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:287)
E/AndroidRuntime( 1428): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:558)
E/AndroidRuntime( 1428): ... 21 more
W/ActivityManager( 59): Force finishing activity com.agm.test/.MainFragmentActivity
Я понял, что старый "RightFragment" не был уничтожен после замены. Вероятно, это следствие моего неправильного пути, чтобы попытаться заменить его.
Любая помощь будет действительно оценена.
Спасибо заранее!
/Ангел Галиндо Муньос