按类名动态实例化片段

时间:2014-08-15 21:17:54

标签: java android list class fragment

我有一个主要活动,其中有一个菜单可以浏览页面。为了动态化我的代码,我用我的所有片段的名称和类创建了我的适配器。

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和活动的名称,而不是它的实例。

我需要使用反射吗?

1 个答案:

答案 0 :(得分:3)

只需调用Class#newInstance()方法:

Fragment fragment = c.newInstance();

确保您的Fragment类具有默认构造函数。

您还需要将此构造包装到try-catch子句中,因为newInstance()会引发一些异常 - InstantiationExceptionIllegalArgumentException