Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何初始化活动中定义的接口,该活动通过TabLayout通过ViewPager的3个片段设置来实现?_Java_Android_Android Fragments_Android Activity_Android Viewpager - Fatal编程技术网

Java 如何初始化活动中定义的接口,该活动通过TabLayout通过ViewPager的3个片段设置来实现?

Java 如何初始化活动中定义的接口,该活动通过TabLayout通过ViewPager的3个片段设置来实现?,java,android,android-fragments,android-activity,android-viewpager,Java,Android,Android Fragments,Android Activity,Android Viewpager,我有一个活动,其中包含带有3个片段的ViewPager的TabLayout设置 这3个片段包含每个片段特有的一些方法,需要在单击按钮时调用它们,该按钮是菜单中的一个菜单项,为这3个片段的父活动进行充气 现在,我无法初始化在名为OnMenuSaveButonClickListener的活动中定义的接口,因为我收到一个错误: Caused by: java.lang.ClassCastException: com.blah.blah.EditProductInfoActivity cannot be

我有一个活动,其中包含带有3个片段的ViewPager的TabLayout设置 这3个片段包含每个片段特有的一些方法,需要在单击按钮时调用它们,该按钮是菜单中的一个菜单项,为这3个片段的父活动进行充气

现在,我无法初始化在名为OnMenuSaveButonClickListener的活动中定义的接口,因为我收到一个错误:

Caused by: java.lang.ClassCastException: com.blah.blah.EditProductInfoActivity cannot be cast to com.blah.blah.EditProductInfoActivity$OnMenuSaveButonClickListener
   at com.blah.blah.EditProductInfoActivity.onCreate(EditProductInfoActivity.java:53)

具有ViewPager的父活动的代码(在TabLayout中包含片段):

片段2的代码:

public class CatalogueItemInventoryFragment extends Fragment implements EditProductInfoActivity.OnMenuSaveButonClickListener {

...
...

    private void setItemInventoryInfo() { 
         productViewModel.setAvailableQuantity(Integer.parseInt(availableQtyText.getText().toString()));
         productViewModel.setIsOutOfStock(outOfStockSwitch.isChecked());
         productViewModel.setIsShowOutOfStock(showOutOfStockSwitch.isChecked());
         productViewModel.setIsForceAllowOrder(forceAllowOrderSwitch.isChecked());
    }

    @Override
    public void onMenuButonClick() {

        setItemInventoryInfo();

    }

}

片段3的代码:

public class CatalogueItemNotesFragment extends Fragment implements EditProductInfoActivity.OnMenuSaveButonClickListener {
    ...
    ...

    private void setItemMoreDetails() {

        mStaticProduct.setNotes(productNotesText.getText().toString());
        productViewModel.setNotes(productNotesText.getText().toString());

    }

    @Override
    public void onMenuButonClick() {
        setItemMoreDetails();
    }
}


片段正在实现接口,因此调用如下方法:

((OnMenuSaveButonClickListener)fragments.get(i)).onMenuButonClick();
然后拆下管路53

  • 从TabLayout中获取所选选项卡位置,以便可以将当前可见片段作为目标

    int selectedTab=tabLayout.getSelectedTabPosition()

  • 从该片段调用OnMenuSaveButonClickListener实现方法

    ((OnMenuSaveButonClickListener)fragments.get(selectedTab)).onMenuButonClick()

  • 此代码进入OnOptions ItemSelected中的活动 您可以将该逻辑放在函数中,以避免对其他menuitem选项重复相同的行

    确保从代码中删除mCallback及其赋值。


    我建议您也从活动中删除OnMenuSaveButonClickListener接口定义,并将其放在自己的.java(OnMenuSaveButonClickListener.java)>松耦合中。

    因此,如果适配器中有片段列表,请添加一个getter方法来获取片段列表

    public List<Fragments> getFragments(){
        return fragments;
    }
    
    public List getFragments(){
    返回碎片;
    }
    
    点击“像这样做”

    final List<Fragment> fragments = productTabs.getFragments();
        for (Fragment fragment : fragments) {
            if (fragment instanceof OnMenuSaveButonClickListener) {
                ((OnMenuSaveButonClickListener) fragment).onMenuButonClick();
            }
        }
    
    final List fragments=productTabs.getFragments();
    for(片段:片段){
    if(OnMenuSaveButonClickListener的片段实例){
    ((OnMenuSaveButonClickListener)片段);
    }
    }
    
    您的解决方案有效!!!但我想在单击菜单项(选中图标)时一次调用所有这些方法。目前,我需要在每个片段上反复按下该菜单按钮,以将数据保存到Viewmodel对象。看看我在这里想表达的意思:好吧,这是我认为你可以用抽象的方式做的事情。您可以为所有这些片段定义一个共享Viewmodel,定义一个实现SharedReferences的方法,并且在从一个片段移动到另一个片段(您可以注册选项卡更改侦听器)之前,从VM调用一个方法,让它将每个片段中的数据保存到SharedReference中。您可以稍后阅读。谢谢您的帮助!我也有同样的想法!。让我试试,然后再报告!!!
    ((OnMenuSaveButonClickListener)fragments.get(i)).onMenuButonClick();
    
    public List<Fragments> getFragments(){
        return fragments;
    }
    
    final List<Fragment> fragments = productTabs.getFragments();
        for (Fragment fragment : fragments) {
            if (fragment instanceof OnMenuSaveButonClickListener) {
                ((OnMenuSaveButonClickListener) fragment).onMenuButonClick();
            }
        }