代码之家  ›  专栏  ›  技术社区  ›  Samanta Silva

如何获取字符串并转换为片段名称来启动类?

  •  2
  • Samanta Silva  · 技术社区  · 7 年前

    对不起,我的英语很差,我是巴西人,正在使用翻译。

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

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

     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);
        }
    

    我如何解决这个问题??

    如有必要,请遵循完整的活动课程: https://pastebin.com/hFLUpHF2

    1 回复  |  直到 7 年前
        1
  •  2
  •   Akram    7 年前

    tabfragment 是一个 String 在您的代码中,您不能调用 new tabfragment . 这是不正确的,如果它是您在这里发布的,那么您的代码将无法编译。

    您可以使用 Class.forName() 方法,假设所有片段都在同一个包中 packagename 在一个 名为的字符串 fragmentPackage 以正确的格式,例如 com.app.frags ,则应执行以下操作:

    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();
      }       
    }