【问题标题】:ClassCastException when setting up listener interface设置侦听器接口时出现 ClassCastException
【发布时间】:2013-07-20 03:43:56
【问题描述】:

尝试设置自定义侦听器以将字符串从 Activity 发送到该 Activity 内部的片段。按下 Activity 上的按钮,文本字符串应发送到片段并显示在该片段的文本视图中,但我得到一个 classCastException 并且不知道该怎么做。你将如何让它发挥作用?

错误在这一行

 listener = (OnStringRequestedListener) fragment;

如果没有那行代码,我不知道如何设置这个自定义侦听器接口。我使用了类似的代码行来朝相反的方向前进,并且它起作用了。那是或从片段发送消息到活动。但是我今天尝试的方法不起作用

堆栈跟踪

Caused by: java.lang.ClassCastException:
com.example.asynctaskprogressbarexample.InterfaceActivityToFragmentFragment
cannot be cast to com.example.asynctaskprogressbarexample
.InterfaceActivityToFragment$OnStringRequestedListener
at com.example.asynctaskprogressbarexample
.InterfaceActivityToFragment.onCreate(InterfaceActivityToFragment.java:27)

活动类

  public class InterfaceActivityToFragment extends Activity {

Button buttonOne;
private OnStringRequestedListener listener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    setContentView(R.layout.interface_activity_to_fragment);

    Fragment fragment = getFragmentManager().findFragmentById(R.id.fragment1);

    listener = (OnStringRequestedListener) fragment; // <-- ERROR ON THIS LINE

     if (fragment instanceof OnStringRequestedListener) {
          listener = (OnStringRequestedListener) fragment;
        } else {
          throw new ClassCastException(fragment.toString()
              + " must implemenet OnTimeRequestedListener");
        }

    buttonOne = (Button) findViewById(R.id.button1);

    buttonOne.setOnClickListener(new Button.OnClickListener(){

           @Override
           public void onClick(View v) {
            // TODO Auto-generated method stub
              listener.passString("string from Activity");

           }

        });

}

public interface OnStringRequestedListener {
    public void passString(String sendNumberString);

  }

 }

片段类

 public class InterfaceActivityToFragmentFragment extends Fragment implements FragmentHeadlessAsyncTaskFragment.OnStringRequestedListener {

TextView textViewOne;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    View view = inflater.inflate(R.layout.interface_activity_to_fragment_fragment, container, false);

    TextView textViewOne = (TextView) view.findViewById(R.id.textView1);

    return view;
} // end on create view

@Override
 public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);

  setRetainInstance(true);
 }

@Override
public void passString(String stringFromActivity) {
     textViewOne.setText(stringFromActivity);

}
  }

【问题讨论】:

  • 您是否尝试过将课程扩展到 FragmentActivity 而不是 InterfaceActivityToFragment extends Activity ?即InterfaceActivityToFragment extends FragmentActivity?您是否也尝试过使用 getSupportFragmentManager() 而不是 getFragmentManager() ?看看有没有区别?
  • 还没有尝试过,我认为 FragmentActivity 是为了 V4 支持旧版本的 pre api level 11 与片段一起使用。因为我的目标 API 是 11 及以上。我还没有想过使用它。我现在就试试
  • 实际上这比我想象的要难,我需要更改应用程序并添加 V4 支持才能使用 FragmentActivity

标签: android interface listener actionlistener


【解决方案1】:

您正在实现 FragmentHeadlessAsyncTaskFragment.OnStringRequestedListener,但要转换为 InterfaceActivityToFragment.OnStringRequestedListener

定义为嵌套在两个不同类中的相同接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 2012-02-17
    相关资源
    最近更新 更多