当前位置: 首页 > 知识库问答 >
问题:

片段调用片段在屏幕旋转时处于松动状态

步博厚
2023-03-14

您好,我创建了一个带有默认“导航抽屉活动”的项目。所以我有一个MainActivity,其中有一个片段,用于替换菜单上的每个项目。

菜单之一是“客户”,显示客户列表。

从客户片段中我可以看到这个客户的利益,其中是一个调用利益的片段。

还有更多的层次,但要简短,这就足够了。

这是MainActivity上的代码,我使用它从片段中调用片段并在之间传递数据

public void passData(Object[] data, Fragment f) {
    Bundle args = new Bundle();
    args.putSerializable("PASSED_DATA", data);
    f.setArguments(args);
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, f)
            .addToBackStack("")
            .commit();
}

我用的是:

mCallbacks.passData(new Object[]{c}, new OpportunityListFragment());

问题是,当我旋转手机时,无论我的活动级别如何,它都会返回到第一个片段(CustomerListFragment),如果我在手机上单击“后退”,它就会返回到我旋转手机时的位置。

我该怎么做才能避免这种问题?如果我替换片段,为什么会返回到第一个激活?

共有2个答案

燕实
2023-03-14

当您更改屏幕方向时,您的父活动将被销毁并重新创建。除非您以某种方式持久化级别结构,否则它将始终显示为您第一次启动活动时的样子。您可以使用捆绑对象,也可以使用更复杂的对象,您需要将其持久化到数据库中。

不管怎样,onSaveInstanceState是你的朋友。然后,在onCreate方法中,需要检查捆绑包或数据库,并相应地设置片段。

景康安
2023-03-14

ste-fu的答案是正确的,但让我们以编程方式探索。Google留档@Handling Runtime更改中有一个很好的工作代码。您必须执行2个代码片段。

1) 代码段:

public class MyActivity extends Activity {

private RetainedFragment dataFragment;

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

    // find the retained fragment on activity restarts
    FragmentManager fm = getFragmentManager();
    dataFragment = (DataFragment) fm.findFragmentByTag(“data”);

    // create the fragment and data the first time
    if (dataFragment == null) {

注意:代码使用FragmentManager查找当前片段。如果片段为null,则表示UI或应用程序尚未执行。如果不为null,则可以从RetainedFragment对象获取数据。

2) 需要保留片段状态。

public class RetainedFragment extends Fragment {

// data object we want to retain
private MyDataObject data;

// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // retain this fragment
    setRetainInstance(true);
}

注意:setRetainInstance在OnCreate中使用。建议子类化片段,将其命名为Retained片段,用于片段1。

 类似资料:
  • 我使用和来显示片段。最初增加了2个片段,Fragment1和Fragment2,在接收到服务器的响应后,在第二个位置增加了第三个片段Fragment3。因此,在添加所有页面之后,这应该是ViewPager中的片段序列-->Fragment1,Fragment3,fragment2。 下面是解决方案代码 代码:

  • 我有这个活动,它包含一个片段。这个片段布局由一个包含多个片段(实际上是两个)的视图寻呼机组成。 当创建视图分页器时,它的适配器被创建,被调用,我的子片段被创建。太棒了。 现在,当我旋转屏幕时,框架处理片段的重新创建,适配器从主片段在我的中再次创建,但是从未被调用,因此我的适配器持有错误的引用(实际上为空),而不是两个片段。 我发现片段管理器(即子片段管理器)包含一个名为的片段数组,这当然是代码无法

  • 我正在创建一个使用FragmentStatePagerAdapter的ViewPager活动。但当我试图旋转我的手机时,它崩溃了,并出现错误“片段尚未附加”。 这是我的适配器: 在我的活动onCreate中,我调用了SalesPagingAdapter=new SalesPagingAdapter(PreMainActivitySales.this,getSupportFragmentManage

  • 在需要动态添加和从viewpager中删除列表片段的应用程序中工作,当点击列表中的一个项目时,新的片段会添加到viewpager中,当需要删除swipe back片段时,这工作效果很好,但当我旋转屏幕时,页面中的片段会有两个实例,再旋转一次,实例会增加四倍。 同时,我需要持久化片段的状态(列表位置、加载的项数等),这意味着重写片段中的onsaveinstancestate并将相关数据保存在捆绑包中

  • 在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。是否有像这样的方法,每次片段出现在屏幕上时都会调用它?等是在创建片段之后调用的,而不是在片段出现在屏幕上时调用的,因此它们对我不起作用。我的问题可以用哪种方法?

  • 这件事我已经被难倒好一阵子了。我正在尝试将包含在框架布局中的片段移到右边,这样只有左边20%的片段是可见的。 我认为我遇到的问题是父级不允许片段移动到它的边界之外,或者我不知道如何移动它。我所尝试的一切都只是将碎片推到右边的墙上,并将碎片缩放到合适的位置。我需要它把碎片推到右边墙外。任何帮助都将不胜感激。