通用添加片段的方法,如何实现

时间:2018-08-29 09:17:17

标签: android android-fragments

我正在尝试创建添加片段的方法,我可以使用很多次,但是遇到了一些错误。 这是我的方法:

// global variable
fragManager = getSupportFragmentManager();
private <T> void findFragmentByTagAndAdd(String fragmentTag, Class<?> cls, T t){
    Fragment fragm = fragManager.findFragmentByTag(fragmentTag);
    if (fragm == null) {
        fragm = cls.newInstance(t);
        fragManager.beginTransaction()
                .add(R.id.host_fragment_container, fragm)
                .commit();
    } 
}
     

T t是一些数据(例如某些模型类),必须将其传递到片段的newInstance方法的setArguments

我遇到下一个错误:

    cannot be applied to given types;
                    fragm = cls.newInstance(t);
                               ^   required: no arguments   
found: T#1   reason: actual and formal argument lists differ in length

4 个答案:

答案 0 :(得分:2)

替换此:

fragm = cls.newInstance(t);

类似:

Constructor constructor = cls.getConstructor(t.getClass());
fragm = (Fragment) constructor.newInstance(t);

答案 1 :(得分:1)

查看findFragmentByTagAndAdd方法的参数 Class cls ,无需使用它,这对您来说很容易。

以这种方式执行:

添加这样的界面。

interface IYourDesireClass<T>{
   T newInstance();
}

将其添加到所需的班级。

class YourDesireClass implements IYourDesireClass<YourDesireClass>

并像这样重构方法

private <T extends IYourDesireClass> void findFragmentByTagAndAdd(String fragmentTag, T t){
    Fragment fragm = fragManager.findFragmentByTag(fragmentTag);
    if (fragm == null) {
        fragm = t.newInstance();
        fragManager.beginTransaction()
                .add(R.id.host_fragment_container, fragm)
                .commit();
    } 
}

还有另一件事,请尝试避免反射。 Reflection has a negative effect on performance.

答案 2 :(得分:0)

尝试一下:

private void findFragmentByTagAndAdd(Fragment fragment, T t){
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    if(fragment != null){
        fragment.setArguments(t)
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();
      }
}

您可以通过setArguments()传递数据

也请参考此链接: https://developer.android.com/guide/components/fragments

答案 3 :(得分:0)

感谢Benoit的回答,我的方法终于开始起作用了,它看起来像这样:

    private <T> void findFragmentByTagAndAdd(String fragmentTag, Class<?> cls, T data){ 
    Fragment fragm = fragManager.findFragmentByTag(fragmentTag);
    if (fragm == null) {
        try{
            Constructor constructor = cls.getConstructor(data.getClass());
            fragm = (Fragment) constructor.newInstance(data);
        } catch (Exception e) {
        }
        fragManager.beginTransaction()
                .add(R.id.host_fragment_container, fragm, fragmentTag)
                .commit();
    }
}

然后我就叫它:

findFragmentByTagAndAdd(DogsListFragment.DOGS_TAG, DogsListFragment.class, (Owner)owner);

谢谢所有参与我的问题的人!

如果您使用多窗格UI且必须在主机活动中多次添加/替换片段,则此方法将非常有用