【问题标题】:How to get a string and convert to a fragment name to start a Class?如何获取字符串并转换为片段名称以启动类?
【发布时间】:2018-03-04 09:51:09
【问题描述】:

抱歉英语不好,我是巴西人,我正在使用翻译。

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

于是我开始构建以下类:

 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

【问题讨论】:

    标签: java android class fragment


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。它几乎可以工作,但它仍然在这一行中给出错误:Fragment fragment = (Fragment) Class.forName(fragmentPackage+ "." + tabfragment);。我尝试了很多方法,但总是犯同样的错误:Inconvertible types; cannot cast 'java.lang.Class<capture<?>>' to 'android.support.v4.app.Fragment。据我了解,它与(片段)和 Class.forName 不兼容。我该如何解决这个问题?
    • 现在我可以解决了。最后缺少.newInstance()。我按照以下方式做到了,并且成功了:Fragment fragment = (Fragment) Class.forName(getPackageName()+".fragments."+tabfragment).newInstance();。谢谢你^^
    • 对不起,我忘记添加newInstance,我更新了答案以更正它。
    • 没问题。无论如何,它对我帮助很大。谢谢
    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 2023-02-10
    • 2011-06-09
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多