【发布时间】:2011-10-09 22:33:00
【问题描述】:
它是使用兼容包的小型 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 |
--------- ----------
在横向上,活动有一个包含 2 个片段的视图:“leftLand”和“rightLand”,如果您单击片段的按钮“leftLand" 然后它会更改创建一个新的 Fragment 并将 "rightLand" Fragment 实例替换为同一 FragmentActivity 类的另一个实例。这两个实例的不同之处在于传递给“newInstance(int)”的参数,它基于单击的按钮。
纵向:
----- -----
| | | |
| L | -> click -> | R |
| | | |
----- -----
在纵向时,它只显示片段“leftPort”(与“leftLand”具有相同的布局),如果你点击它的按钮,它就会启动一个 Intent启动 RightFragmentActivity,显示 Fragment "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”在被替换后并没有被破坏。这可能是我尝试替换它的错误方法的结果。
任何帮助将不胜感激。
提前致谢!
/安吉尔·加林多·穆尼奥斯
【问题讨论】:
-
您的初始 RightFragment 是通过编程方式还是通过 XML 添加的?如果您尝试删除(或替换)您在 XML 中定义的片段,您可以得到into trouble。
-
感谢您这么快的回复,theisenp。我读过一些类似的文章,但我认为如果我用其他 Fragment 类的实例替换片段,它只是适用。今天下午我将尝试以编程方式进行,然后发布结果。非常感谢!
-
我又回来了,没有运气。我正在以编程方式进行操作,在 RightFragment.onCreateView 上使用“inflater.inflate(...)”。我将视图简化为更简单的东西,但仍然失败:只是 LinearLayout 中的 TextView。看到了一些重要的东西:每次我按下一个按钮并更改 TextView 的文本它并没有完全替换它的内容,它只是在它上面绘制。它确认在“
ft.replace(...)”和提交之后,原始的 RightFragment istance 永远不会被破坏。我也非常感谢至少一个链接到替换片段的正确方法。非常感谢