使用兼容包以使用片段的2.2为目标.

在将活动重新编码为在应用程序中使用片段后,我无法让方向更改/状态管理工作,因此我创建了一个带有单个片段活动和单个片段的小型测试应用程序.

来自方向更改的日志(log)很奇怪,有多个对片段OnCreateView的调用.

很明显,我遗漏了一些东西——比如删除片段并重新附加它,而不是创建一个新实例,但我看不到任何说明我哪里出了问题的文档.

谁能解释一下我做错了什么吗.

更改方向后的日志(log)如下所示.

Initial creation
12-04 11:57:15.808: D/FragmentTest.FragmentTestActivity(3143): onCreate
12-04 11:57:15.945: D/FragmentTest.FragmentOne(3143): OnCreateView
12-04 11:57:16.081: D/FragmentTest.FragmentOne(3143): OnCreateView->SavedInstanceState null


Orientation Change 1
12-04 11:57:39.031: D/FragmentTest.FragmentOne(3143): onSaveInstanceState
12-04 11:57:39.031: D/FragmentTest.FragmentTestActivity(3143): onCreate
12-04 11:57:39.031: D/FragmentTest.FragmentOne(3143): OnCreateView
12-04 11:57:39.031: D/FragmentTest.FragmentOne(3143): OnCreateView->SavedInstanceState not null
12-04 11:57:39.031: D/FragmentTest.FragmentOne(3143): OnCreateView
12-04 11:57:39.167: D/FragmentTest.FragmentOne(3143): OnCreateView->SavedInstanceState null


Orientation Change 2
12-04 11:58:32.162: D/FragmentTest.FragmentOne(3143): onSaveInstanceState
12-04 11:58:32.162: D/FragmentTest.FragmentOne(3143): onSaveInstanceState
12-04 11:58:32.361: D/FragmentTest.FragmentTestActivity(3143): onCreate
12-04 11:58:32.361: D/FragmentTest.FragmentOne(3143): OnCreateView
12-04 11:58:32.361: D/FragmentTest.FragmentOne(3143): OnCreateView->SavedInstanceState not null
12-04 11:58:32.361: D/FragmentTest.FragmentOne(3143): OnCreateView
12-04 11:58:32.361: D/FragmentTest.FragmentOne(3143): OnCreateView->SavedInstanceState not null
12-04 11:58:32.498: D/FragmentTest.FragmentOne(3143): OnCreateView
12-04 11:58:32.498: D/FragmentTest.FragmentOne(3143): OnCreateView->SavedInstanceState null

主要活动(FragmentActivity)

public class FragmentTestActivity extends FragmentActivity {
/** Called when the activity is first created. */

private static final String TAG = "FragmentTest.FragmentTestActivity";


FragmentManager mFragmentManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Log.d(TAG, "onCreate");

    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    FragmentOne fragment = new FragmentOne();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}

而这个碎片

public class FragmentOne extends Fragment {

private static final String TAG = "FragmentTest.FragmentOne";

EditText mEditText;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    Log.d(TAG, "OnCreateView");

    View v = inflater.inflate(R.layout.fragmentonelayout, container, false);

    // Retrieve the text editor, and restore the last saved state if needed.
    mEditText = (EditText)v.findViewById(R.id.editText1);

    if (savedInstanceState != null) {

        Log.d(TAG, "OnCreateView->SavedInstanceState not null");

        mEditText.setText(savedInstanceState.getCharSequence("text"));
    }
    else {
        Log.d(TAG,"OnCreateView->SavedInstanceState null");
    }
    return v;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    Log.d(TAG, "FragmentOne.onSaveInstanceState");

    // Remember the current text, to restore if we later restart.
    outState.putCharSequence("text", mEditText.getText());
}

舱单

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".activities.FragmentTestActivity" 
        android:configChanges="orientation">
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

推荐答案

你把你的碎片层层叠在另一个上面.

当配置发生更改时,旧片段会在重新创建新活动时将其自身添加到新活动中.这在大多数情况下都是后部的巨大疼痛.

您可以使用相同的片断而不是重新创建新片断来停止发生错误.只需添加以下代码:

if (savedInstanceState == null) {
    // only create fragment if activity is started for the first time
    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    FragmentOne fragment = new FragmentOne();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
} else {        
    // do nothing - fragment is recreated automatically
}

不过,请注意:如果您try 从片段内部访问活动视图,则会出现问题,因为生命周期会发生微妙的变化.(从片段中获取父活动的视图并不容易).

Android相关问答推荐

使用mvvm和jetpack的Android中的视图模型compose

更新画布上的绘图以具有水平填充

房间打开创建回调java.nio.channels. OverlappingFilLockResponse

在Android Studio Iguana 2023.2.1中,哪里可以找到能量分析器?

长流与长流的比较<>

推断的类型是片段,但应为上下文

Android Studio -未显示布局预览(不推荐使用安全管理器)

Jetpack Compose和Android Studio中的普通设计工具有什么不同?

用于小部件泄漏警告的伙伴对象中的Kotlin Lateinit

Android-LVL库始终返回NOT_SUBLISTED

如何将 Room Persistence 依赖项正确添加到我的 Jetack Compose Android 应用程序

相机2问题:设置AE区域、AF区域和AWB区域.

Android - 如何使 TextInputEditText 的高度恰好为 2 行?

compose 导航参数字符串包含花括号?

Jetpack Compose 动画性能问题

PayUCheckoutPro Android SDK 实现问题

MediumTopAppBar Material3 只更改大标题

处理程序 postDelayed 方法不起作用,kotlin 应用程序卡在启动画面上

使用 Jetpack Compose 时,如何以简单的方式在 Color.kt 中定义 colored颜色 ?

firebase-messaging和firebase-inappmessaging-display之间有什么区别?