简体   繁体   English

如何传递ArrayList <Fragment> ?

[英]How to pass ArrayList<Fragment>?

To avoid creating multiple activities I have one Activity2 that has this code that allows me to just pass an array of Fragments from any Activity I want. 为了避免创建多个活动,我有一个Activity2 ,该活动的代码可以使我从想要的任何Activity中传递一组Fragments。

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();
}

In Activity1 I have this code (That I know doesn't work) 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);

The point is to make fragArrayList travel from any Activity to Activity2 . 关键是使fragArrayList从任何 Activity迁移到Activity2 And since the frags inside fragArrayList will be different depending on the activity they are coming from I cant just add them to the ArrayList inside Activity2 . 而且由于fragArrayList内的碎片根据活动而有所不同,因此它们不能来自我,只能将它们添加到Activity2内的ArrayList中。

And since there will be several activities is not efficient to create logic inside the Activity2 to handle from each Activity the user came from. 而且由于将存在多个活动,因此无法在Activity2内部创建逻辑来处理用户来自的每个Activity的效率。

How can I pass the ArrayList from Activity1 to Activity2? 如何将ArrayList从Activity1传递给Activity2?

Fragments are not Parcelable, so you won't be able to pass them via intent. 碎片不可包裹,因此您将无法通过意图传递它们。 You could pass the fully qualified fragment class name via intent and then instantiate the fragment(s) in Activity2 via reflection. 您可以通过intent传递完全限定的片段类名称,然后通过反射实例化Activity2中的片段。

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

Success Thank you to: Greg Moens & gicci for the insight 成功感谢您: Greg Moensgicci的见解

Activity1 活动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);

Activity2 活动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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM