Java 如何初始化活动中定义的接口,该活动通过TabLayout通过ViewPager的3个片段设置来实现?
我有一个活动,其中包含带有3个片段的ViewPager的TabLayout设置 这3个片段包含每个片段特有的一些方法,需要在单击按钮时调用它们,该按钮是菜单中的一个菜单项,为这3个片段的父活动进行充气 现在,我无法初始化在名为OnMenuSaveButonClickListener的活动中定义的接口,因为我收到一个错误: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
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
我建议您也从活动中删除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();
}
}