首页 > 解决方案 > 无法将 Activity 投射到片段中的接口

问题描述

我的代码有 Class Cast Exception 错误。

当字符串通过接口从适配器发送到片段时。在片段中,如果选择了特定的字符串,界面将转到特定的活动。

这是接口代码:

public interface StringListener {
 void sendStr(String title);
  }

所以这是适配器代码:

public class StringRecyclerViewAdapter extends RecyclerView.Adapter<StringRecyclerViewAdapter.MyViewHolder>{

List<GridSubject> subjects;
Context context;
public StringRecyclerViewAdapter(Context context,List<GridSubject> subjects)
{
    this.context=context;
    this.subjects=subjects;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view;
    LayoutInflater inflater=LayoutInflater.from(context);
    view=inflater.inflate(R.layout.custom_layout,parent,false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
      final GridSubject subject=subjects.get(position);
      holder.txts.setText(subject.text);
      holder.imgs.setImageResource(subject.drwab);
      holder.myCard.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              sendStrMe(subject.getText());
          }
      });
}

@Override
public int getItemCount() {
    return subjects.size();
}

public void sendStrMe(String title) {
    StringListener listener=(StringListener) context;
    listener.sendStr(title);
}

class MyViewHolder extends RecyclerView.ViewHolder{
    TextView txts;
    ImageView imgs;
    CardView myCard;
    public MyViewHolder(View itemView) {
        super(itemView);

        txts=itemView.findViewById(R.id.txt);
        imgs=itemView.findViewById(R.id.img);
        myCard=itemView.findViewById(R.id.my_card);
    }

}

这是片段代码:

public class FragmentA extends Fragment  implements SportListener {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";


private String mParam1;
private String mParam2;
 public Intent intent;

public FragmentA() {
    // Required empty public constructor
}

public static FragmentA newInstance(String param1, String param2) {
    FragmentA fragment = new FragmentA();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.my_layout_sport, container, false);
}



@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    try {

        super.onActivityCreated(savedInstanceState);
        RecyclerView recyclerView=getView().findViewById(R.id.recycler_me);
        final String[] txts={"Special","Hard","Manual","Easy"};
        int[] imgs={R.drawable.special,R.drawable.hard,R.drawable.manual,R.drawable.easy};

        List<GridSubject> subjects=new ArrayList<>();
        for(int i=0;i<imgs.length;i++) {
            subjects.add(new GridSubject(txts[i], imgs[i]));
        }
       int ori=getResources().getConfiguration().orientation;
        int span;
        if(ori== Configuration.ORIENTATION_LANDSCAPE)
            span=3;
        else
            span=2;
        StringRecyclerViewAdapter adapter=new StringRecyclerViewAdapter(getActivity(),subjects);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),span));
        recyclerView.setAdapter(adapter);
    }
    catch (Exception e)
    {
        Toast.makeText(getActivity().getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
    }

}

@Override
public void onDetach() {
    super.onDetach();
}


@Override
public void sendSport(String title) {
    if(title=="Special") {
        intent=new Intent(getActivity(),WebActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    else{
        intent=new Intent(getActivity(),SportShowActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    }
    startActivity(intent);

}

}

这是活动代码:

public class MainActivity extends AppCompatActivity {


BottomNavigationView btm_navs;
FragmentA afrag;
FragmentB bfrag;
FragmentC cfrag;
FragmentD dfrag;
ViewPager pagerS;
MenuItem menuItem;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        btm_navs = findViewById(R.id.btn_navs);
        pagerS = findViewById(R.id.view_pager_mes);


        btm_navs.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.item_a:
                        pagerS.setCurrentItem(0);
                        break;
                    case R.id.item_b:
                        pagerS.setCurrentItem(1);
                        break;
                    case R.id.item_c:
                        pagerS.setCurrentItem(2);
                        break;
                    case R.id.item_d:
                        pagerS.setCurrentItem(3);
                        break;

                }
                return true;
            }
        });
        pagerS.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (menuItem != null) {
                    menuItem.setChecked(false);
                }
                else {
                    btm_navs.getMenu().getItem(position).setChecked(false);
                }
                btm_navs.getMenu().getItem(position).setChecked(true);
                menuItem = btm_navs.getMenu().getItem(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        setupViewPager();

    }
    catch (Exception e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

public void setupViewPager()
{
   ViewPageradapter pageradapter=new ViewPageradapter(getSupportFragmentManager());
  afrag=new FragmentA();
  bfrag=new FragmentB();
  cfrag =new FragmentC();
  dfrag=new FragmentD();
  pageradapter.addFragment(afrag);
  pageradapter.addFragment(bfrag);
  pageradapter.addFragment(cfrag);
  pageradapter.addFragment(dfrag);
   pagerS.setAdapter(pageradapter);
}

}

所以这些是错误:

 java.lang.ClassCastException: com.example.project.MainActivity cannot be  cast to com.example.project.StringListener
    at com.example.pakhkhsh.StringRecyclerViewAdapter.sendStrMe(StringRecyclerViewAdapter.java:56)
    at com.example.pakhkhsh.StringRecyclerViewAdapter$1.onClick(StringRecyclerViewAdapter.java:45)
    at android.view.View.performClick(View.java:4756)
    at android.view.View$PerformClick.run(View.java:19749)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

标签: androidfragmentclasscastexception

解决方案


您的活动需要实现 SportListener,而不是片段。

去做就对了:

public class MainActivity extends AppCompatActivity implements SportListener {
// your code ...
}```

推荐阅读