【问题标题】:Android layout changeAndroid布局变化
【发布时间】:2013-07-22 17:31:13
【问题描述】:

我想为横向和纵向使用不同的布局。我已将 xml 文件分别放入 layout 和 layout-land 中。

对于我的父活动,我设置了 android:configChanges="keyboardHidden|orientation|screenSize" 所以我想自己处理方向更改。

我已经尝试过手动更改布局:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    getFragmentManager().beginTransaction().replace(R.id.content_frame, new FoodDashboardFragment()).commit();
}

它可以工作......但应用程序在进入主屏幕时崩溃......所以......我猜我错过了一些东西。还有另一种(简单)方法吗?

这是日志:

07-23 17:58:46.717: E/AndroidRuntime(862): FATAL EXCEPTION: main
07-23 17:58:46.717: E/AndroidRuntime(862): java.lang.IllegalStateException: Fragment FoodDashboardFragment{41a06e30} is not currently in the FragmentManager
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.support.v4.app.FragmentManagerImpl.putFragment(FragmentManager.java:546)
07-23 17:58:46.717: E/AndroidRuntime(862):  at com.android.restauranthanovra.MainActivity.onSaveInstanceState(MainActivity.java:167)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.Activity.performSaveInstanceState(Activity.java:1137)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2951)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3010)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.ActivityThread.access$900(ActivityThread.java:130)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1222)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.os.Looper.loop(Looper.java:137)
07-23 17:58:46.717: E/AndroidRuntime(862):  at android.app.ActivityThread.main(ActivityThread.java:4745)
07-23 17:58:46.717: E/AndroidRuntime(862):  at java.lang.reflect.Method.invokeNative(Native Method)
07-23 17:58:46.717: E/AndroidRuntime(862):  at java.lang.reflect.Method.invoke(Method.java:511)
07-23 17:58:46.717: E/AndroidRuntime(862):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-23 17:58:46.717: E/AndroidRuntime(862):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-23 17:58:46.717: E/AndroidRuntime(862):  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 发布崩溃的logcat

标签: android android-layout


【解决方案1】:

我建议不要使用onConfigurationChanged,而是使用onSaveInstanceState(Bundle)onRestoreInstanceState (Bundle),并将任何需要保留的数据保存到Bundle

这样,当 Activity 被销毁并重新创建时,将自动使用您的土地布局,并保留您只需要的数据。

onConfigurationChanged 的使用通常用于特定/特殊情况,在大多数情况下,onSaveInstanceStateonRestoreInstanceState 是合适的。

【讨论】:

  • 感谢您的建议,但是,正如我所说,我需要保持我的父活动完整,所以我正在使用 android:configChanges="orientation"。
【解决方案2】:

如果您有片段层次结构,请使用 getChildFragmentManager() 而不是 getFragmentManager()。例如。如果您的父片段中有片段寻呼机。

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    相关资源
    最近更新 更多