当前位置: 首页 > 知识库问答 >
问题:

创建多个片段的通用方法

万俟均
2023-03-14

我想写一个为我创建多个片段的方法,但我不知道如何做到这一点。几次尝试之后,我变得更加困惑。

这是我通常如何创建两个片段

private void createFragDog(Animals animals) {
    DogFragment frag = DogFragment.newInstance(ArrayList<Dogs> animals.getDogs());
    ...    
    *frag.(do fragment manager stuff and commit())*
    ...
}

创建片段的第二次调用

private void createFragCat(Animals animals) {
    CatFragment frag = CatFragment.newInstance(ArrayList<Cats> animals.getCats());
    ...    
    *frag.(do fragment manager stuff and commit())*
    ...
}

由于newInstance方法是静态的,我似乎不知道如何创建一个泛型方法并只传入类类型。另外,传入newInstance的对象并不总是数组。以下是我的尝试:

private <T,E> void animalFragments(Class<T> frag, Class<E> animalType, Object obj){
    if (obj == null) return;
    if (obj instanceof List<?>) {
        if (((List<E>)obj).isEmpty()) return;
    }

    try {
        T fragment = (T) frag.newInstance();
        ?? Not sure what to do now or how to call up method that is static but specific to both.

    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

共有1个答案

齐高寒
2023-03-14

是这样做的希望这有帮助。

private <T,E> void animalFragments(Class<T> frag, Object obj){
    Method m = null;
    try {
        m = frag.newInstance().getClass().getDeclaredMethod("newInstance", obj.getClass());
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    if (m != null) {
        T fragment = null;
        try {
            fragment = (T) m.invoke(null, obj);

            if (fragment != null) {
                FragmentTransaction trans = this.getSupportFragmentManager().beginTransaction();
                trans.add(R.id.ll_fragments_container, (Fragment) fragment, fragment.getClass().getSimpleName());
                trans.commit();
                return true;
            }
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}
 类似资料:
  • 此时,Frag2在堆栈上,是唯一可见的片段。我使用了replace和addToBackStack,因为我需要后退导航。我的问题是,当我在Frag2内旋转屏幕时,活动中的super.oncreate(savedInstanceState)方法调用frag1的构造函数。 在用户按下后退按钮之前,有没有什么方法可以避免调用Frag1的构造函数?

  • 知道TargetFragment现在已被弃用,如何从DialogFragment调用片段的方法? 过去,我可以这样做: 父级碎片 对话框碎片 这不再可能,因为目标碎片现已弃用。 我读到可以使用setFragmentResultListener()传递变量,但是如何从DialogFragment调用ParentFragment.myMethod()方法呢?

  • 我想创建一个包含“上一个”和“下一个”按钮的类。类将有助于减少我必须为每个类中的每个按钮编写的重复代码的数量。例如,在FirstPage.Class片段内部调用以下代码。 PageTransition.PageContents(CaseContent.GetSize(),getArguments().GetString(ARG_ITEM_ID),button_next,button_prev);

  • YQL(简化): 结果(简化): 如何告诉Vespa从“计算机”而不是“de”创建代码段?

  • 问题内容: 我想从fragmentA调用FragmentB(Class)的方法,我试图通过在fragmentA(class)中创建fragmentb的对象来尝试,但是在这里它不起作用是该类中fragmentA的代码,我有一个方法可以通过FragmentB类的方法 我想称这个为fragmentB的方法 我尝试通过fragmentA方法编写此代码,但出现错误 问题答案: 试试这个解决方案:

  • MainActivity(扩展了fragmentActivity)有listview,它调用listviewadapter,其中有一个带有ViewpagerAdapter的ViewPager。现在,如果我需要在ViewPager中生成5个片段,如何将getFragmentManager()传递给适配器。 MainActivity[fragmentActivity]---->Listview----