如何获取字符串并将其转换为片段名称以启动一个类?

3

抱歉我的中文不太好,我是巴西人,正在使用翻译软件。

我有一个带有标签页的应用程序,并且我想简单而动态地添加具有标题、图标或标题和图标的选项卡。

因此,我开始构建以下类:

 public static class TabItens {
        TabLayout tabLayout;
        SectionsPagerAdapter mSPAdapter
        String titulo;
        int resId;

        public TabItens(TabLayout tabLayout, SectionsPagerAdapter mSPAdapter) {
            this.tabLayout = tabLayout;
            this.mSPAdapter = mSPAdapter;
        }

        public void AddTabItem(String tabfragment, String titulo) {
            tabLayout.addTab(tabLayout.newTab().setText(titulo));
            mSPAdapter.addFragment(new tabfragment);
        }

        public void AddTabItemIco(String tabfragment, String titulo, int resId) {
            tabLayout.addTab(tabLayout.newTab().setIcon(resId).setText(titulo));
            mSPAdapter.addFragment(new tabfragment);
        }
    }

我遇到了这样一行代码:mSPAdapter.addFragment(new tabfragment);

它必须与以下函数兼容:

 public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

我该如何解决这个问题呢?

如果需要,可以查看完整的activity类:https://pastebin.com/hFLUpHF2

1个回答

3
作为您代码中的一个字符串,tabfragment无法调用new tabfragment。如果按照您在此处发布的方式进行操作,则是不正确的,代码将无法编译。
您可以使用Class.forName()方法从片段类的名称创建片段对象。假设所有片段都位于同一个包中,并且您有该包的packagename(例如com.app.frags)以正确的格式存储在名为fragmentPackage的字符串中,则应按照以下步骤操作:
try{
   Fragment fragment = (Fragment) Class.forName(fragmentPackage+ "." + tabfragment).newInstance();
} catch(ClassNotFoundException e) {
   e.printStackTrace();
}

所以你的addFragment方法应该是这样的:
public void addFragment(String tabfragment) {
  try{
     Fragment fragment = (Fragment) Class.forName(fragmentPackage+ "." + tabfragment).newInstance();
     mFragmentList.add(fragment);
   } catch(ClassNotFoundException e) {
     e.printStackTrace();
  }       
}

谢谢您的回答。它几乎可以工作了,但在这一行中仍然出现错误:Fragment fragment = (Fragment) Class.forName(fragmentPackage+ "." + tabfragment);。我已经尝试了很多种方法,但总是出现相同的错误:不可转换类型;无法将'java.lang.Class<capture<?>>'转换为'android.support.v4.app.Fragment。从我所理解的来看,这是(Fragment)和Class.forName之间的不兼容性。我该如何解决这个问题? - Samanta Silva
现在我可以解决了。最后缺少了.newInstance()。我按照以下方式进行了修改,它起作用了:Fragment fragment = (Fragment) Class.forName(getPackageName()+".fragments."+tabfragment).newInstance();。谢谢^^ - Samanta Silva
抱歉,我忘记添加 newInstance,我已经更新答案进行更正。 - Akram
没问题。总之这帮了我很多,谢谢。 - Samanta Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接