方向改变后片段恢复状态

UneXp

我必须在我的应用程序中实现“标准”片段导航(请参阅link)。

问题是,当设备处于纵向模式时,应该只显示1个片段,而将其旋转到横向模式时,应该显示2个片段。

我尝试通过2种不同的方式进行操作:

1)我只使用1个具有不同纵向和横向布局的活动。

纵向布局xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/main_frame_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

这里的景观布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_left"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_right"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

活动的onCreate方法:

    private static ItemsFragment mItemsFragment;
    private static ItemDetailsFragment mItemDetailsFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (mItemsFragment == null) {
            mItemsFragment = ItemsFragment.newInstance();
        }
        if (mItemDetailsFragment == null) {
            mItemDetailsFragment = ItemDetailsFragment.newInstance();
        }

        if (isLandscape()) {
            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container_left, mItemsFragment)
                    .commit();
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
        } else {
            getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container, mItemsFragment)
                    .commit();
        }
    }

这就是我刷新第二个片段的方式:

Bundle bundle = new Bundle();
bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, response.getItem());
mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
if (isLandscape()) {
    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.main_frame_fragment_container, mItemDetailsFragment).addToBackStack(null).commit();
}

另外,我还保存和恢复fragment`s状态,因此旋转后我的数据不会消失。通常,在我的情况下,此代码可以正常工作。

2)我为第一个活动纵向和横向模式使用2个活动和相同的布局。

xml布局与横向布局中的xml布局相同:

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_left"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/main_frame_fragment_container_right"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

onCreate方法(请注意,片段实体不是静态的,就像在第一种情况下一样):private ItemsFragment mItemsFragment; 私人ItemDetailsFragment mItemDetailsFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        mItemsFragment = ItemsFragment.newInstance();
        mItemDetailsFragment = ItemDetailsFragment.newInstance();

        getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container_left, mItemsFragment)
        .commit();
        getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
    }
}

现在,如果设备处于纵向模式,我将开始新的活动:

if (isLandscape()) {
    Bundle bundle = new Bundle();
    bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, response.getItem());
    mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
    getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
    Intent intent = new Intent(getApplicationContext(), DetailsActivity.class);
    intent.putExtra(KEY_ITEM, response.getItem());
    startActivity(intent);
}

最后,第二个Activity的onCreate方法:

protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    setContentView(R.layout.activity_details);

    if (isLandscape()) {
        finish();
    }

    Item item = (Item) getIntent().getExtras().getSerializable(KEY_ITEM);

    Bundle bundle = new Bundle();
    bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, item);

    ItemDetailsFragment mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);

    getSupportFragmentManager().beginTransaction()
        .replace(R.id.main_frame_fragment_container, mItemDetailsFragment).commit();
}

当设备旋转到横向模式时,第二个活动结束,我看到我的第一个活动有2个片段(如预期)。

题:

在第一种情况下,我将片段另存为静态变量,因此,我不在乎是否以纵向或横向模式更改第二个片段的状态(使用相同的片段)。但是我认为将其保存为静态字段不是一个好主意。

在第二种情况下,我不知道如何同步活动A片段B(横向)和活动B片段B(纵向)。如果我更改片段中的某些内容(例如,切换按钮等)并旋转设备,则更改应应用于另一个片段中。

通常,哪种情况更好,如果是第二种,我该如何解决同步问题?也许还有另一种更简单的方法。感谢您的阅读,希望您能帮到我:)

普尔吉塞西

只需跟随该伴侣http://developer.android.com/guide/components/fragments.html即可不要将片段设为静态(那只是怪异的)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

方向改变后未调用片段的onActivityResult

来自分类Dev

方向更改后每次都会重新创建片段,无法恢复状态

来自分类Dev

方向更改后,无法恢复其中的片段

来自分类Dev

方向/配置更改后如何维护ListView片段状态?

来自分类Dev

保存和恢复片段状态?

来自分类Dev

每次方向改变,按钮状态改变

来自分类Dev

片段方向改变时应用崩溃

来自分类Dev

方向改变时显示错误的片段

来自分类Dev

在方向更改后恢复视图

来自分类Dev

ios-从后台状态恢复后保持特定活动 ViewController 的屏幕方向

来自分类Dev

使用片段保存和恢复状态

来自分类Dev

在 viewpager 中保存和恢复片段状态

来自分类Dev

片段恢复后,AsyncTask不更新UI

来自分类Dev

方向改变后碎片变成鬼影

来自分类Dev

方向改变后碎片变成鬼影

来自分类Dev

方向更改后未调用片段的onActivityResult

来自分类Dev

FragmentPagerAdapter在方向更改后未还原片段

来自分类Dev

设备方向更改后片段抛出IllegalStateException

来自分类Dev

引导后立即恢复小部件状态

来自分类Dev

恢复操作后获取更新状态

来自分类Dev

引导后立即恢复小部件状态

来自分类Dev

绘制后如何恢复QPainter的状态

来自分类Dev

从休眠状态恢复后,LTS暂停16.04

来自分类Dev

单击NSAttributedString后恢复其视觉状态

来自分类Dev

Gitlab在恢复后不返回初始状态

来自分类Dev

失败后make如何恢复状态

来自分类Dev

改变片段

来自分类Dev

防止Android(和MVVMCross)中的片段状态自动恢复

来自分类Dev

片段保存了以前的状态,但它没有正确恢复