如何在Serializable中将Object值从片段发送到片段?

时间:2017-02-15 03:59:26

标签: java android android-fragments serializable

我的条件是我有三个片段A,B,C,我在Afragment中设置值并在Cfragment中获取值。

我希望在Afragment中将布局更改为Bfragment。

编译项目显示Bundle.getSerializable(java.lang.String)' on a null object reference我在Bfragment中将布局更改为Cfragment。

我想使用Serializable来让我在Cfragment中获得价值。

我如何完成它?任何帮助将不胜感激。

我的Serializable bean:

public class Book implements Serializable {
    String name;

    public Book(){

    }

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我的主要活动:

public class MainActivity extends AppCompatActivity {

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

        A a=new A();
        switchFragment(a);
    }

    public void switchFragment(Fragment fragment) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.main_frameLayout, fragment, null);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

Afragment:

public class A extends Fragment {

    B b=new B();

    public A() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view=inflater.inflate(R.layout.fragment_a, container, false);

        Book book=new Book();
        book.setName("Jerry");
        //try to send the value to Cfragment
        C c=new C();
        Bundle bundle=new Bundle();
        bundle.putSerializable("name",book);
        c.setArguments(bundle);


        //change layout into Bfragment
        Button button=(Button)view.findViewById(R.id.buttonA);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switchFragment(b);
            }
        });

        return view;
    }

    public void switchFragment(Fragment fragment) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.main_frameLayout, fragment, null);
        transaction.addToBackStack(null);
        transaction.commit();
    }

}

Bfragment:

public class B extends Fragment {

    C c=new C();

    public B() {
        // Required empty public constructor
    }


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

        View view=inflater.inflate(R.layout.fragment_b, container, false);
        //change layout into Cfragment
        Button button=(Button)view.findViewById(R.id.buttonB);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                switchFragment(c);
            }
        });

        return view;
    }

    public void switchFragment(Fragment fragment) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.main_frameLayout, fragment, null);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

Cfragment:

public class C extends Fragment {

    Book book;

    public C() {
        // Required empty public constructor
    }


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

        View view=inflater.inflate(R.layout.fragment_c, container, false);

        TextView textView=(TextView)view.findViewById(R.id.textC);
        //try to get the setting value from Aframent 
        Bundle bundle=getArguments();
        book=(Book) bundle.getSerializable("name");
        textView.setText(book.getName());

        return view;
    }

}

根据CoDFather的回应,我改变了这样:

public static C newInstance(String param1) {
        C fragment = new C();
        Bundle args = new Bundle();
        Book book=new Book();
        book.setName(param1);
        args.putSerializable("name", book);  // in your case it is serializable
        fragment.setArguments(args);
        return fragment;
    }

在A:

C.newInstance("Jerry");

在C onCreate中:

Book book=(Book) getArguments().getSerializable("name");
        textView.setText(book.getName());

当B到C时: 它在返回片段

中显示Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference

3 个答案:

答案 0 :(得分:0)

在Fragment A中你正在做那个

C c=new C();
Bundle bundle=new Bundle();
bundle.putSerializable("name",book);
c.setArguments(bundle);

但您没有使用c片段中的C个对象。

取而代之的是片段B 您定义了C c=new C();这是C片段的全新对象,然后您切换到这个新的c而没有设置参数。

简单地说,您正在设置对象的参数,然后再使用另一个对象! 这就是getArguments() returen null

的原因

如果您想将A的{​​{1}}传递给C,则需要先将A传递给B,然后再将其传递给C

B

中的onCreateView

c.setArguments(getArguments());

然后您可以切换到此c

答案 1 :(得分:0)

在你的片段A中执行此操作

<form action="" method="post">
        <input type="number" name="contact_ID" placeholder="Id" value="<?php echo $id;?>"><br><br>
        <input type="text" name="first_name" placeholder="First Name" value="<?php echo $fname;?>"><br><br>
        <input type="text" name="middle_name" placeholder="Middle Name" value="<?php echo $midname;?>"><br><br>
        <input type="text" name="last_namename" placeholder="Last Name" value="<?php echo $lname;?>"><br><br>
        <div>
            <input type="submit" name="insert" value="Add">
            <input type="submit" name="update" value="Update">
            <input type="submit" name="search" value="Find">
        </div>
    </form>
片段B中的

    B b=new B();
    Bundle bundle=new Bundle();
    bundle.putSerializable("name",book);
    b.setArguments(bundle);

并使用 C c=new C(); c.setArguments(getArguments());

  

switchFragment(c);返回null的原因是,您正在设置参数   一个人并使用另一个人。

但不建议这样做。请改用getArguments()

newInstance

并在创建

public static C newInstance(String param1, String param2) {
        C fragment = new C();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);  // in your case it is serializable
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

并使用@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } 。在你的情况下,用bundle替换它。

答案 2 :(得分:0)

我找到一个解决方案来保存我的问题,它是关于单身人士:

我将它用于我的Book类,如下所示:

Book book=Book.getBook();
book.setName("Jerry");

在A:

Book book=Book.getBook();
textView.setText(book.getName());

在C:

CREATE TABLE `cake_sessions` (
    `id` varchar(255) NOT NULL DEFAULT '',
    `data` text,
    `expires` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`)
);

然后我的问题结束了,我必须放弃Serializable。