2011-09-12 5 views
0

onActivityResult()は、子アクティビティが終了した後に呼び出される標準のAndroid関数です。しかし、それはずっと閉じているようではありません。onActivityResultで間違ったコンテキストを注入するRoboguice(1.1および1.2スナップショット)

子アクティビティが終了した後、onActivityResult()が親で呼び出されます。この時点で、私のアクションは、親が作成している新しいクラスにコンテキストを(プロバイダを介さずに)注入することです。子供がちょうど私に戻ってきたparcelable情報を使って、その新しい@Assistedパラメータクラス。

しかし、子に対してfinish()が呼び出されたにもかかわらず、注入されるコンテキストは親ではありません - それは子供です!これはプログラムを殺す。

どうすればこの問題を回避できますか?

ここに私が何をしているのかを示すコードがあります。子供で

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_NEW_EXERCISE) 
     { 
      if (resultCode == RESULT_OK) 
      { 
       EntityExercise exercise = (EntityExercise)data.getExtras().get("exercise"); 
       addNewRoutineExerciseDetail(exercise); 
       //Toast.makeText(this, exercise.getName(), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    public RoutineExerciseDetail addNewRoutineExerciseDetail(EntityExercise exercise) 
    { 
     RoutineExerciseDetail detail = detailFactory.create(exercise); 
     detail.setOnClickRelativeLayoutListener(mEditParamsOnClickListener); 
     return detail; 
    } 

:親で

View.OnClickListener mListenerReturnExercise = new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) { 
      Intent resultIntent = new Intent(); 
      resultIntent.putExtra("exercise", (EntityExercise)v.getTag()); //Assuming it's the tag 
      setResult(Activity.RESULT_OK, resultIntent); 
      finish(); 
     } 

    }; 

RoutineExerciseDetailのコンストラクタのパラメータ:ActivityForResult方法で

@Inject 
    public RoutineExerciseDetail(ActivityBaseRoboOrm<DatabaseHelper> context, List<RoutineExerciseDetail> list, 
      @AddEditExercise TableLayout layout, @Assisted EntityExercise exercise) 

答えて

1

はい、これはRoboGuice 1.1では失敗します。 Activity.onActivityResult()は、アクティビティのonResume()が呼び出される前に実行されるため、RoboGuiceはコンテキストを呼び出し元アクティビティに戻すことを知らないという点で、やや珍しい方法です。

RoboGuice 1.2の主な変更点の1つは、この動作を修正することです。 1.2に切り替えて、these instructionsごとにContextScopedProvidersを持つプロバイダを置き換えるなら、あなたは良いと思うはずです。

あなたはRoboGuice 1.1に滞在する必要がある場合は、手動であなたのコンテキストのスコープのことができるようにする必要があり、次の方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    scope.enter(this); 
    try { 

     ... 

    } finally { 
     scope.exit(this); 
    } 
} 
0

アンドロイドであなたのrequestcodeは、両方で同じでなければなりませんActivity.thenし、あなたのコードだけが動作します。それがあなたを助けることを願っています。

+0

全く問題ではないこと。これは文の注入の問題であり、if文のトリガーの問題ではありません。 – Guicer

関連する問題