ClassCastException:片段无法强制转换为android.app.activity

时间:2013-08-15 14:24:59

标签: android android-fragments

我有一个扩展到片段的类,一旦点击它就会有一个按钮初始化一个扩展到活动的新类。我想在按钮点击时将数据(例如字符串)从该活动传递回来电片段。

FirstActivity扩展片段

点击按钮

Intent startcontact = new Intent(getActivity(), Contact.class);
                getActivity().startActivityForResult(startcontact,1);

联系扩展活动

点击按钮

Bundle bundle = new Bundle();
                 bundle.putString("ListofContacts", tapo1);
                 Intent intent = new Intent(Contact.this, First_Activity.class);
                 intent.putExtras(bundle);
                 setResult(RESULT_OK);
                 startActivity(intent);
                 finish();

FirstActivity onactivityresult

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
         MultiAutoCompleteTextView txtPhoneNo = (MultiAutoCompleteTextView) getActivity().findViewById(R.id.txtPhoneNo);
         String strtxt = null;
         if (requestCode == 1) 
         {
            if(resultCode == getActivity().RESULT_OK)
            {
             strtxt=data.getStringExtra("ListOfContacts");
             txtPhoneNo.setText(strtxt);
            }
         }
    }

当我尝试点击联系人类中的按钮时出现错误:

ClassCastException: FirstActivity cannot be cast to android.app.activity

请帮助!

logcat的:

08-15 23:26:39.153: E/AndroidRuntime(21267): FATAL EXCEPTION: main
08-15 23:26:39.153: E/AndroidRuntime(21267): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.john/com.example.john.First_Activity}: java.lang.ClassCastException: com.example.john.First_Activity cannot be cast to android.app.Activity
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2001)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.os.Looper.loop(Looper.java:154)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.ActivityThread.main(ActivityThread.java:4624)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at java.lang.reflect.Method.invokeNative(Native Method)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at java.lang.reflect.Method.invoke(Method.java:511)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at dalvik.system.NativeStart.main(Native Method)
08-15 23:26:39.153: E/AndroidRuntime(21267): Caused by: java.lang.ClassCastException: com.example.john.First_Activity cannot be cast to android.app.Activity
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
08-15 23:26:39.153: E/AndroidRuntime(21267):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1992)
08-15 23:26:39.153: E/AndroidRuntime(21267):    ... 11 more

4 个答案:

答案 0 :(得分:0)

意图需要一项活动。如果您不想将FirstActivity更改为Activity,而宁愿将其保留为片段,则可以执行片段事务而不是意图来推送片段。下面是以下代码:

final FragmentManager manager = getSupportFragmentManager();
FirstActivity fragment = new FirstAcitivty();
final FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.content_frame, mArticleFragment, null);
transaction.commit();

您希望将此片段放入的活动还需要一个FrameLayout,一个将片段膨胀到的地方。你可以像这样在你的xml中添加一个FrameLayout:

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

如果您为活动添加了一个硬编码片段的xml,那么您就无法执行该事务,因此请确保切换到FrameingFayout以便为片段充气。

答案 1 :(得分:0)

你不应该再次开始First_Activity。你应该只是致电finish()回到First_Activity并将你想要的字符串传递给那个类:

Intent intent = new Intent();
intent.putExtra("ListofContacts", tapo1);
setResult(1, intent);
finish();

并且在onActivityResult中,您将能够从data获得所需的额外字符串。

答案 2 :(得分:-2)

您在Fragment FirstActivity.class中使用onActivityResult,但只有Activity类可以使用此方法并接收结果代码,而不是片段。您可以使用标志来检查值的变化,然后检查Fragment FirstActivity.class中的onResume()

答案 3 :(得分:-2)

好的我现在改变我的答案:

根据错误,您没有使用“Activity”扩展类。 您的FirstActivity的类型是Fragment。所以你现在有两个选择:

1:FirstActivity扩展活动

2:FirstFragment扩展Fragment


基本概念是拥有一个托管片段容器的活动。然后你有你的单独的Fragment类,它包含构建片段所需的所有东西(的视图)。活动的FragmentManager处理片段内容的加载 这对你有帮助吗?