不兼容的类型:无法将 AccessControlContext 转换为 ECartHomeActivity(MainActivity)

incompatible types: AccessControlContext cannot be converted to ECartHomeActivity(MainActivity)

我在 Activtiy 的这一部分遇到了错误(SearchActivity.java):

// Whenever a view in your cart is clicked
shoppinListAdapter.SetOnItemClickListener(new OnItemClickListener() {
           @Override
           public void onItemClick(View view, int position) {
             Utils.switchFragmentWithAnimation(
                                    R.id.frag_container,
                                    new ProductDetailsFragment("", position, true),
                                    ((ECartHomeActivity) (getContext())), null,
                                    Utils.AnimationType.SLIDE_LEFT);
                                   // ECartHomeActivity is the MainActivity
           }
});

这是在 Activity:

中使用的 Utils class 的方法
public static void switchFragmentWithAnimation(int id, Fragment fragment,
            FragmentActivity activity, String TAG, AnimationType transitionStyle) {

  FragmentManager fragmentManager = activity.getSupportFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

  if (transitionStyle != null) {
    switch (transitionStyle) {
       case SLIDE_UP:
         // Enter from Up
         fragmentTransaction.setCustomAnimations(R.anim.slide_in_up,
                        R.anim.slide_out_up);

         break;

       case SLIDE_LEFT:
         // Enter from left
         fragmentTransaction.setCustomAnimations(R.anim.slide_left,
                        R.anim.slide_out_left);

         break;

       default:
         break;
    }
  }

  CURRENT_TAG = TAG;

  fragmentTransaction.replace(id, fragment);
  fragmentTransaction.addToBackStack(TAG);
  fragmentTransaction.commit();
}

这段代码是我从我的一个片段中复制粘贴到这个 Searched_Product_Activtiy.java 中的。它在片段中工作正常。

问题是您正在尝试将 ECartHomeActivity 转换为具有 ((ECartHomeActivity) (getContext()) 的上下文,这将不起作用,因为它是 class 而不是 Activity 实例。

您可以使用 SearchActivity.this 作为 Utils 的 Activity,但将 activity 参数更改为 Activity,如下所示:

public static void switchFragmentWithAnimation(int id, Fragment fragment,
            Activity activity, String TAG, AnimationType transitionStyle) {
}

但这可能不是你想要的,我猜你想切换 MainActivity 中的 Fragment。如果这是您想要的,您应该使用 MainActivity 中的 startActivityForResult()。为此,首先您需要从 MainActivity:

启动 ActivitySearch
public static final int REQUEST_CODE = 1;
...
public void startSearch() {  
  Intent intent=new Intent(MainActivity.this, ActivitySearch.class);  
  startActivityForResult(intent, REQUEST_CODE);
}

其次,覆盖 MainActivity 中的 onActivityResult() 以接收来自 ActivitySearch:

的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // Check which request we're responding to
  if (requestCode == REQUEST_CODE) {
    // Make sure the request was successful
    if (resultCode == RESULT_OK) {
      // Call your util here
      Utils.switchFragmentWithAnimation(
               R.id.frag_container,
               new ProductDetailsFragment("", position, true),
               MainActivity.this, null,
               Utils.AnimationType.SLIDE_LEFT);

    }
  }
}

最后,在 ActivitySearch 中,无论何时单击搜索中的项目,都需要将结果发送到 MainActivity:

shoppinListAdapter.SetOnItemClickListener(new OnItemClickListener() {
       @Override
       public void onItemClick(View view, int position) {
          Intent intent=new Intent();
          // send data if you want
          //intent.putExtra("DATA", yourdata);  
          setResult(MainActivity.REQUEST_CODE, intent);  
          finish(); // close the SearchActivity
       }