Mav*_*rik 19 android backwards-compatibility screen-orientation android-2.2-froyo
我正在开发一个针对2.x和3.0设备的Android应用程序,因此我正在使用compatiblebilty API.我在Android 2.0上测试.
我正在尝试将显示的片段替换为另一个片段(搜索结果与搜索结果一起),并且当显示第二个(结果)片段时,我遇到了方向更改的崩溃.
基本上,我有一个活动,包括在布局xml中定义的片段
<fragment class="org.prevoz.android.search.SearchFormFragment"
android:id = "@+id/search_form_fragment"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent" />
Run Code Online (Sandbox Code Playgroud)
第一个片段(SearchFormFragment)显示为默认值.当用户点击"搜索"按钮时,我将SearchFormFragment替换为SearchResultsFragment,后者运行AsyncTask(这就是我想保留它的原因)
// Show the search results fragment
SearchResultsFragment newSearch = new SearchResultsFragment(from, to, when);
newSearch.setRetainInstance(true);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
transaction.replace(R.id.search_form_fragment, newSearch);
transaction.addToBackStack(null);
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
但是,当显示SearchFormFragment并更改方向时,我的应用程序崩溃了
ERROR/AndroidRuntime(334): FATAL EXCEPTION: main
ERROR/AndroidRuntime(334): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.prevoz.android/org.prevoz.android.search.MainActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class fragment
ERROR/AndroidRuntime(334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
ERROR/AndroidRuntime(334): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
ERROR/AndroidRuntime(334): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815)
ERROR/AndroidRuntime(334): at android.app.ActivityThread.access$2400(ActivityThread.java:125)
ERROR/AndroidRuntime(334): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037)
ERROR/AndroidRuntime(334): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(334): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(334): at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(334): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(334): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(334): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/AndroidRuntime(334): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(334): at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(334): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class fragment
ERROR/AndroidRuntime(334): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:582)
ERROR/AndroidRuntime(334): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
ERROR/AndroidRuntime(334): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
ERROR/AndroidRuntime(334): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
ERROR/AndroidRuntime(334): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
ERROR/AndroidRuntime(334): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
ERROR/AndroidRuntime(334): at android.app.Activity.setContentView(Activity.java:1647)
ERROR/AndroidRuntime(334): at org.prevoz.android.search.MainActivity.onCreate(MainActivity.java:40)
ERROR/AndroidRuntime(334): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
ERROR/AndroidRuntime(334): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
ERROR/AndroidRuntime(334): ... 12 more
ERROR/AndroidRuntime(334): Caused by: java.lang.IllegalStateException: Fragment org.prevoz.android.search.SearchFormFragment did not create a view.
ERROR/AndroidRuntime(334): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:281)
ERROR/AndroidRuntime(334): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:558)
ERROR/AndroidRuntime(334): ... 21 more
WARN/ActivityManager(59): Force finishing activity org.prevoz.android/.search.MainActivity
Run Code Online (Sandbox Code Playgroud)
来自SearchFormFragment的相关onCreateView代码会被调用,并返回一个有效的视图:
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState)
{
View newView = inflater.inflate(R.layout.search_form_frag, container, false);
return newView;
}
Run Code Online (Sandbox Code Playgroud)
只有在显示SearchResultsFragment时才会发生崩溃,如果显示默认的SearchFormFragment,则更改正常.
那么如何通过方向改变保留第二个片段状态呢?关于API和状态变化的文档确实缺乏.
ale*_*lom 28
不要SearchFormFragment在XML中创建.而是FrameLayout在Activity.onCreate()没有将其添加到后台堆栈的情况下填充空.这样,Activity将保留当前Fragment而不是尝试添加XML中指定的那个.
此外,使用AsyncLoader可能是更好的方法,请参阅http://code.google.com/p/android/issues/detail?id=14944
| 归档时间: |
|
| 查看次数: |
14301 次 |
| 最近记录: |