片段之间的SavedInstanceStateNull为空

时间:2017-03-11 16:14:47

标签: java android android-fragments android-activity bundle

我有一个显示按钮列表的片段,每个按钮都有自己的ID。当用户单击该按钮时,我试图将当前片段替换为另一个片段。在我替换片段之后,我正在向bundle添加参数。从我从调试模式可以看出,该部分100%正常工作。但是,当我们到达新片段时," savedInstanceState" state始终为null。

我已经阅读了几篇关于此的帖子,但我感到很困惑,因为我试图设置捆绑包并以与从活动转到第一个片段时相同的方式替换片段,但它仍然无效。

MyActivity.java(这个工作正在设置所有值):

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
MyFirstFragment fragment = new MyFirstFragment();
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame,fragment);
        fragmentTransaction.commit();
        Intent i = getIntent();
        value = i.getExtras().getString("key");
        Bundle bundle = new Bundle();
        bundle.putString("key",value);
        fragment.setArguments(bundle);
}

MyFirstFragment.java(也在工作):

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false);
final String value = getArguments().getString("key");
myButton.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v){
                        String gid = Integer.toString(v.getId());

                        MySecondFragment secondfragment = new MySecondFragment();
                        Bundle secondFragmentBundle = new Bundle();
                        secondFragmentBundle.putString("key",value);
                        secondFragmentBundle.putString("id",id);
                        secondfragment.setArguments(secondFragmentBundle);

                        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,secondfragment);
                        fragmentTransaction.commit();
                    }
                });

MySecondFragment(对于savedInstanceState和所有捆绑包agruments获取null!):

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_second, container, false);

        value = getArguments().getString("key");
        id = getArguments().getString("id");
}

1 个答案:

答案 0 :(得分:0)

在片段附加到活动后,您无法在片段上设置参数。

您的问题是由于片段创建的混淆造成的。您在问题中提供的内容不是将参数发送到另一个Fragment类型的正确方法。

在创建Fragment时使用static factory method通常称为newInstance()的事件的事实标准方法。您应该以这种方式设置参数,并且应该在提交FragmentTransaction之前这样做 - 但是,从技术上讲,您可以在提交事务后立即执行此操作而不会产生任何不良影响。这是因为当提交片段时,它不会立即附加/创建,而是在主线程上排队。

您将如何做到这一点:

在Fragment类中编写一个名为new instance的方法。请确保为系统保留一个公共默认(无参数)构造函数,以便在后台处理事物。

public MyFirstFragment extends Fragment {

public MyFirstFragment(){
//constructor - don't use this to create a new fragment directly
}

public static MyFirstFragment newInstance(String argument1, String argument2) {

    // This is where you set the Fragment arguments:

    MyFirstFragment instance = new MyFirstFragment();
    Bundle arguments = new Bundle();

    // add whatever arguments you need to the bundle
    arguments.putString("ARGUMENT_1_KEY", argument1);
    arguments.putString("ARGUMENT_2_KEY", argument2);

    //Set the arguments on the new fragment instance
    instance.setArguments(arguments);

    return instance;
}

// recover the values in onCreate:
@Override
public void onCreate(Bundle savedInstanceState) {

    // an easy way to check if this is a new instance is to null-check the saved state Bundle
    if (savedInstanceState == null) {
        String argument1 = getArguments().getString("ARGUMENT_1_KEY");
        String argument2 = getArguments().getString("ARGUMENT_2_KEY");
    } else {
        // restore whatever you need from savedInstanceState bundle
    }

}

关键点 - 将参数传递给newInstance()方法(只要类型为allowed,这些方法可以是您想要的任何方法)。 newInstance()方法强制执行参数类型,并且还阻止在片段已附加到活动后设置它们。

在此之后,在Activity.onCreate()方法中:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String argument1 = "some information";
        String argument2 = "other information";

        MyFirstFragment fragment = MyFirstFragment.newInstance(argument1, argument2);
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.frame,fragment);
        fragmentTransaction.commit();
}