1

フラグメントに拡張するクラスがあり、ボタンをクリックすると、アクティビティに拡張する新しいクラスが初期化されます..ボタンをクリックすると、そのアクティビティから呼び出し元のフラグメントにデータ(文字列など)を渡したいと思いました。

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

助けてください!

ログキャット:

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

4 に答える 4

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 も必要です。次のように、FrameLayout を xml に追加できます。

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

アクティビティの xml にハードコードされたフラグメントを配置すると、トランザクションを実行できないため、フラグメントを膨張させる場所の FrameLayout に切り替えるようにしてください。

于 2013-08-15T14:55:04.400 に答える
0

やり直してはいけませんFirst_Activityfinish()に戻って、次のFirst_Activityように必要な文字列をそのクラスに渡す ために呼び出すだけです。

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

で、onActivityResult必要な文字列エクストラを から取得できますdata

于 2013-08-15T14:58:41.193 に答える
-2

Fragment FirstActivity.class で onActivityResult を使用していますが、Activity クラスのみがこのメソッドを使用して、Fragment ではなく結果コードを受け取ることができます。フラグを使用して値の変化を確認してから、Fragment FirstActivity.class の onResume() をチェックインできます。

于 2013-08-15T14:30:44.633 に答える
-2

わかりました、それから私の答えを変更します:

エラーによると、「Activity」でクラスを拡張しませんでした。FirstActivity のタイプは Fragment です。したがって、次の 2 つのオプションがあります。

1: FirstActivity は Activity を拡張します

2: FirstFragment は Fragment を拡張します


基本的な概念は、フラグメント コンテナーをホストするアクティビティを用意することです。次に、フラグメント(のビュー)を構築するために必要なものをすべて含む別のフラグメントクラスがあります。アクティビティの FragmentManager は、フラグメント コンテンツの読み込みを処理します。
それは役に立ちますか?

于 2013-08-15T14:33:46.577 に答える