java - 通过类名动态实例化 Fragment

标签 java android list class fragment

我有一个主要 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() 会抛出几个异常 - InstantiationExceptionIllegalArgumentException.

关于java - 通过类名动态实例化 Fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25334353/

相关文章:

java - 用作方法参数的抽象内部类无法编译

android - Android ListView 中的弹出菜单问题

list - 如何刷新 ListView.builder flutter

python - 重新排列列表中的项目,使得没有两个相邻项目是相同的

java - 我在 GUI 中实现鼠标操作监听器时遇到问题

java - 等待 ScheduledExecutorService 中的事件

java - 如何使用 apache Camel 使用附加字段丰富 csv 内容数据并使用管道作为分隔符转换为文本文件

android - 更改 Android TV 应用程序 BrowseFragment 的 SearchView 默认图标?

java - 如何与 AlertDialog 内的适配器内的适配器内的 fragment 内的 AlertDialog View 进行交互?

python - 如何在python中的字典中搜索值