我有一个主要活动,其中有一个菜单可以浏览页面。为了动态化我的代码,我用我的所有片段的名称和类创建了我的适配器。
public class MenuItem {
private String title;
private Class className;
...
}
我以这种方式创建了我的适配器:
ArrayList<MenuItem> menuItems=new ArrayList<MenuItem>();
menuItems.add(new MenuItem("Home", null, HomeFragment.class, R.drawable.ic_drawer, true));
menuItems.add(new MenuItem("Schedule", null, ScheduleFragment.class, R.drawable.ic_drawer, false));
在我的菜单onClickListener中,我想直接打开页面而不做任何条件语句:
private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Class c = ((MenuItem) mMenuAdapter.getItem(position)).getClassName();
Fragment fragment = ??? //How do I create a Fragment dynamically ?
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fl_container, fragment).commit();
这种编码方式用于Activity,但在这种情况下更简单,因为要更改活动,我们只使用startActivity和活动的名称,而不是它的实例。
我需要使用反射吗?
答案 0 :(得分:3)
只需调用Class#newInstance()方法:
Fragment fragment = c.newInstance();
确保您的Fragment类具有默认构造函数。
您还需要将此构造包装到try-catch子句中,因为newInstance()
会引发一些异常 - InstantiationException
和IllegalArgumentException
。