我正在尝试创建添加片段的方法,我可以使用很多次,但是遇到了一些错误。 这是我的方法:
// 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
答案 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且必须在主机活动中多次添加/替换片段,则此方法将非常有用