【问题标题】:How to pass ArrayList<Fragment>?如何传递 ArrayList<Fragment>?
【发布时间】:2018-11-13 18:02:09
【问题描述】:

为了避免创建多个活动,我有一个 Activity2,它的代码允许我从任何我想要的活动中传递一组片段。

privateArrayList<Fragment> fragArrayList;

fragArrayList = intent.getParcelableArrayListExtra("fragArrayList");

Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          setFragment(fragArrayList.get(i));
        }
    });

private void setFragment(Fragment fragment) {
    FragmentManager manager = getSupportFragmentManager();
    manager.beginTransaction()
            .replace(R.id.layout, fragment)
            .addToBackStack(null)
            .commit();
}

Activity1 我有这段代码(我知道这行不通)

Wrong 2nd argument type. Found: 'java.util.ArrayList<android.support.v4.app.Fragment>', required: 'java.util.ArrayList<? extends android.os.Parcelable>'

.

Intent intent= new Intent(Activity1.this, Activity2.class);

ArrayList<Fragment> fragArrayList = new ArrayList<>();
                fragArrayList.add(new frag1());
                fragArrayList.add(new frag2());
                fragArrayList.add(new frag3());
                fragArrayList.add(new frag4());
                fragArrayList.add(new frag5());

                intent.putParcelableArrayListExtra("fragArrayList"), fragArrayList);

关键是要让 fragArrayList 从 any Activity 移动到 Activity2。而且由于 fragArrayList 中的碎片会根据它们来自的活动而有所不同,因此我不能将它们添加到 Activity2 中的 ArrayList 中。

而且由于会有多个活动,因此在 Activity2 内部创建逻辑来处理用户来自的每个 Activity 的效率并不高。

如何将 ArrayList 从 Activity1 传递到 Activity2?

【问题讨论】:

标签: java android android-fragments arraylist


【解决方案1】:

片段不是 Parcelable,因此您将无法通过意图传递它们。您可以通过意图传递完全限定的片段类名称,然后通过反射在 Activity2 中实例化片段。

【讨论】:

  • 你也可以构建一个 Class 对象的 ArrayList,这些对象是可序列化的,然后使用 putExtra(name, arrayList),用 getSerializable(name) 恢复它们,然后直接从类中通过反射构建片段带有 newInstance() 的对象。
  • 谢谢你的回答我做到了!
【解决方案2】:

这是一个糟糕的设计传递片段对象列表,你只能传递 Parcelable 类对象的数组。

【讨论】:

    【解决方案3】:

    成功感谢:Greg Moensgicci 提供见解

    活动1

    Intent intent= new Intent(Activity1.this, Activity2.class);
    
    ArrayList<String> fragArrayList= new ArrayList<>();
    
    fragArrayList.add(String.valueOf(frag1.class.getName()));
    fragArrayList.add(String.valueOf(frag2.class.getName()));
    fragArrayList.add(String.valueOf(frag3.class.getName()));
    fragArrayList.add(String.valueOf(frag4.class.getName()));
    fragArrayList.add(String.valueOf(frag5.class.getName()));
    
    intent.putExtra("fragArrayList"), fragArrayList);
    

    活动2

    ArrayList<String> fragArrayList = new ArrayList<>();
    
    fragArrayList = intent.getStringArrayListExtra("fragArrayList");
    
    Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          setFragment(fragArrayList.get(i));
        }
    });
    
     private void setFragment(String fragClass) {
    
        Fragment fragment = Fragment.instantiate(this, fragClass);
    
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction()
                .replace(R.id.layout, fragment)
                .addToBackStack(null)
                .commit();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      相关资源
      最近更新 更多