我有一个主要 Activity ,其中包含一个用于浏览页面的菜单。为了动态化我的代码,我使用所有 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,但在那种情况下更简单,因为要更改 Activity,我们仅使用带有 Activity 名称的 startActivity,而不是其实例。
我需要使用反射吗?
最佳答案
只需调用 Class#newInstance()方法:
Fragment fragment = c.newInstance();
确保您的 Fragment 类具有默认构造函数。
您还需要将此构造包装到 try-catch 子句中,因为 newInstance()
会抛出几个异常 - InstantiationException
和 IllegalArgumentException
.
关于java - 通过类名动态实例化 Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25334353/