0

コンテキスト、アクティビティ、フラグメントなどの概念/違いをまだ 100% 理解していないので、ご容赦ください。

SherlockFragment 内で getActivity() を呼び出すと ClassCastException が発生します (注: getSherlockActivity() も試してみましたが無駄でした):

public abstract class TaskGrabbingFragment extends SherlockFragment {
...
    protected void transferGroupToMe() {
    ...
        Backend.getInstance().modifyTask(new OnModifyTaskResponse() {
            @Override
            public void onModifyTask(Map<String, Object> response) {
                refresh();
            }
        }, (MyActivity) getActivity(),  //ClassCastException
        TaskHelper.TASK_IDS, ids,
        TaskHelper.EMPLOYEE_ID, DomaCareBackend.getInstance().getUserId());
    }
}

私のlogcat出力:

FATAL EXCEPTION: main
java.lang.ClassCastException: com.mycom.task.AllTasksActivity cannot be cast to com.mycom.myapp.MyActivity
at com.mycom.myapp.task.TaskGrabbingFragment.transferGroupToMe(TaskGrabbingFragment.java:69)
at com.mycom.myapp.task.TaskGrabbingFragment.onContextItemSelected(TaskGrabbingFragment.java:47)
at android.support.v4.app.Fragment.performContextItemSelected(Fragment.java:1583)
at android.support.v4.app.FragmentManagerImpl.dispatchContextItemSelected(FragmentManager.java:1992)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:370)
at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(SherlockFragmentActivity.java:211)

MyActivity は SherlockFragmentActivity を拡張し、例外は TaskGrabbingFragment で発生しますが、getActivity() は SherlockFragment である AllTask​​sTabFragment を返します。それでは、SherlockFragment を SherlockFragmentActivity にキャストすることに対する規則はありますか? フラグメントをフラグメントアクティビティにキャストするには、どのようなソリューションがありますか?

4

2 に答える 2

1

getActivity() は、AllTask​​sTabFragment ではなく、AllTask​​sActivity を返します。getActivity() は、現在のフラグメントが関連付けられているアクティビティを返します。TaskGrabbingFragment が AllTask​​sActivity または MyActivity に関連付けられているかどうかを確認する必要があります。

于 2013-03-25T10:34:27.863 に答える
1

これが私の頭にある基本的な理論です。欠点がある場合は、いくつか修正していただければ幸いです。

Contextロジックがどこで実行されているかを理解するために使用されるエッセンスです。最も一般的なContextApplicationActivityあり、 のServiceさまざまなタイプ (必要に応じてレベル) を意味しますContext

Applicationクラスを使用すると、グローバル (アプリケーション) コンテキストを表すため、それを参照する任意のプログラム コンポーネントでアプリケーションにリソースを提供できます。

Serviceバックグラウンドでいくつかのロジックを実行できるようにするプログラム コンポーネントです。

Activityユーザーが現在操作するメインの UI ユニットです。基本的に、Views などの GUI コンポーネントを提供するために使用されます。

現在、Android を実行するデバイスは多種多様です。そのため、ほとんどのデバイスで可能な限り実行する必要があるアプリケーションの開発中に、断片化の問題が発生します。

この問題の解決策の 1 つとして、Android は UI の再利用可能なコンテナーのように機能するフレームワークでクラスを提供し、のライフサイクルを通じてクラスFragmentに強くバインドされます。多くの を保持し、それらに関連付けられたバック スタックを持っている場合があります。ActivityActivityActivityFragment

最近、Android 開発者はネストされたフラグメント(フラグメント)を作成する機会を提供したため、1 つFragmentが他のフラグメントのコンテナーとして機能する場合があります。しかし、 とは対照的にActivityFragments はネストされたフラグメントのバックスタックを持っていません。

あなたの問題は、そうでない場合と考えFragmentているようですContextFragment単なるオブジェクト (コンテナ) であり、Activityアタッチされたユーザーに渡すことができます。

そして、メソッドが最終メソッドであり、オブジェクトを返す必要があるため、getActivity()メソッドが aを返すのは奇妙です。FragmentActivity

Fragmentを に追加するコードの場所で、問題が偽装されている可能性がありますActivity

于 2013-03-25T10:56:49.373 に答える