java - 如何初始化 Activity 中定义的接口,该接口由通过 TabLayout 使用 ViewPager 设置的 3 个片段实现?
问题描述
我有一个活动,其中包含带有 ViewPager 的 TabLayout 设置和 3 个片段这 3 个片段包含一些独特的方法,它们需要在单击一个按钮时调用,该按钮是菜单中的一个菜单项,为父活动膨胀这 3 个片段。
现在我无法初始化在名为 OnMenuSaveButonClickListener 的 Activity 中定义的接口,因为我收到一个错误:
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 的父 Activity 代码(在 TabLayout 中带有片段):
public class EditProductInfoActivity extends AppCompatActivity {
TabLayout tabLayout;
ViewPager mViewPager;
OnMenuSaveButonClickListener mCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_product_info);
tabLayout = (TabLayout) findViewById(R.id.tabs);
mViewPager = (ViewPager) findViewById(R.id.v_pager_prod);
mCallback = (OnMenuSaveButonClickListener) this; //line:53 with error
initViewPager();
private void initViewPager() {
ArrayList<Fragment> fragments = new ArrayList<>();
fragments.add(new CatalogueItemInfoFragment());
fragments.add(new CatalogueItemInventoryFragment());
fragments.add(new CatalogueItemNotesFragment());
ProductTabsViewPagerAdapter productTabs = new ProductTabsViewPagerAdapter(
getSupportFragmentManager(),this, fragments);
mViewPager.setAdapter(productTabs);
tabLayout.setupWithViewPager(mViewPager);
tabLayout.getTabAt(0).setText("Product Info");
tabLayout.getTabAt(1).setText("Inventory");
tabLayout.getTabAt(2).setText("Notes");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.item_info_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.item_check:
mCallback.onMenuButonClick();
return true;
default: return super.onOptionsItemSelected(item);
}
}
public interface OnMenuSaveButonClickListener{
void onMenuButonClick();
}
}
ViewPager Adpater 类的代码:
public class ProductTabsViewPagerAdapter extends FragmentPagerAdapter {
private Context context;
private List<Fragment> fragments;
public ProductTabsViewPagerAdapter(FragmentManager fm, Context context, List<Fragment> fragments) {
super(fm);
this.context = context;
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
片段 1 的代码:
public class CatalogueItemInfoFragment extends Fragment implements EditProductInfoActivity.OnMenuSaveButonClickListener {
...
...
public void setItemFromItemForm(){
productViewModel.setSize(productSizeText.getText().toString());
productViewModel.setSizeSelection(productSizeSelectionText.getText().toString());
productViewModel.setColor(productColorText.getText().toString());
}
@Override
public void onMenuButonClick() {
setItemFromItemForm();
}
}
片段 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();
}
}
解决方案
从 TabLayout 获取选定的选项卡位置,以便您可以定位当前片段可见
int selectedTab = tabLayout.getSelectedTabPosition();
从该片段调用OnMenuSaveButonClickListener实现方法
((OnMenuSaveButonClickListener) Fragments.get(selectedTab)).onMenuButonClick();
此代码进入onOptionsItemSelected中的活动, 您可以将该逻辑放入函数中,以避免为其他 menuitem 选项重复相同的行。
确保从代码中删除 mCallback 和它的分配。
我建议您还从您的活动中删除OnMenuSaveButonClickListener接口定义,并将其放在它自己的 .java (OnMenuSaveButonClickListener.java) > 松散耦合中。
推荐阅读
- react-native - 如何在 react-native 中获得 webview 上的滑动手势?
- java - 在上传到firebase android之前压缩图像
- php - PHP和MySQL中的随机用户ID
- python - 用 Celery 调度 Django 方法
- node.js - Node.js(Express.js)中用于登录的Access Token和Refresh Token的概念和用法
- amazon-web-services - 使用 boto3 在多个区域启动 EC2
- python - aiohttp-graphql AsyncioExecutor GraphQLLocatedError: 'NoneType' 对象不可调用
- java - Android Firebase如何处理实时服务器到本地数据库的连接
- java - Maven 忽略 ParameterizedTest
- java - SAP Cloud Foundry 中的远程调试