片段在屏幕方向改变时不会被持久化。

3

我使用下拉导航,由于一些主题问题,我使用Spinner来实现。我使用以下方法设置Actionbar:

public void setupActionBar() {
    Spinner navSpinner = new Spinner(new ContextThemeWrapper(this, R.style.Theme_Apptheme_Widget_ActionBarSpinner));
    navSpinner.setSelection(getSharedPreferences(APP_NAME, MODE_PRIVATE).getInt(SELECTED_POSITION, 0));
    Log.d(getClass().getName(), navSpinner.getSelectedItemPosition() + "");
    navSpinner.setAdapter(new ActionBarSpinnerAdapter(getActionBar().getThemedContext(), dataSource.getAllShoppingLists()));
    navSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            if (position < dataSource.getAllShoppingLists().size()) {
                if(fragmentManager.findFragmentByTag("shoppinglist" + position) == null) {
                    ShoppingListFragment shoppingListFragment = ShoppingListFragment.
                            newInstance(dataSource.getShoppingListForPosition(position).getId());
                    fragmentTransaction.replace(R.id.container, shoppingListFragment, "shoppinglist" + position);
                    }
            } else if (position == dataSource.getAllShoppingLists().size()) {
                if(fragmentManager.findFragmentByTag("shoppinglistmanager") == null) {
                    ShoppingListManagerFragment shoppingListFragment = ShoppingListManagerFragment.newInstance();
                    fragmentTransaction.replace(R.id.container, shoppingListFragment, "shoppinglistmanager");
                }
            }
            fragmentTransaction.commit();
            SharedPreferences preferences = getSharedPreferences(APP_NAME, MODE_PRIVATE);
            preferences.edit().putInt(SELECTED_POSITION, position).commit();
        }
    });

    getActionBar().setCustomView(navSpinner);
}

我在FragmentonCreate()方法中调用了setRetainInstance(true);,但是仍然无法持久化Fragment。我通过编辑文本输入框并输入文本来验证这一点。为什么会发生这种情况?


@yiati 我正在旋转设备。 - user1178729
变量datasource来自哪里?你接收到的id可能不是你想要的。另外,恢复片段的替代方法是使用Fragment类中的onSaveInstanceState和onViewStateRestored来保存原始值,并使用它们重新创建片段。 - yiati
不确定是否缺少其他类,例如ShoppingListDataSource或Fragments。是的,setRetainInstance确实会自动保留片段中的信息,但如果您没有看到它们被恢复,则要么是您没有手动恢复视图的状态,要么是您正在使用错误的Fragments。 - yiati
@yiati 视图的状态也应该自动恢复。我确定我正在使用正确的 Fragment。 - user1178729
@ManishMulimani 看起来你是对的。我没有为EditText设置id,这样就解决了问题。如果你愿意,可以将它作为答案发布出来 :) - user1178729
显示剩余3条评论
1个回答

0

您需要为EditText设置标识符,以便Android系统保存和恢复视图状态。

来自docs:

注意:为了使Android系统能够恢复活动中视图的状态,每个视图都必须具有唯一的ID,由android:id属性提供。

如果您正在使用布局文件,请通过属性android:id指定它,或者如果您正在使用API创建EditText,则使用View.setId


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接