2012-01-09 8 views
3

私はいくつかの種類のビジュアルフラグメントを実装するクラスをいくつか持っています。 (私はApetWidgetsと呼んでいます) 彼らは独自のクラス階層を持っています。アクティビティを開始し、非活動デセンダントクラスから結果を取得する

public class SignatureApetWidget extends AbstractApetWidget { 

    private void startCapture(ApetActivity act) { 
     Intent intent = new Intent(act, SignatureCaptureActivity.class); 
     intent.putExtra(...); 

     act.startActivityForResult(intent, CAPTURE_SIGNATURE_REQUEST); 
    } 

これらのうちの1人は別のアクティビティを開始し、結果を待つ必要があります。しかし、私はウィジェットを含むアクティビティへの参照を持っていますが、parentActivityのstartActivityForResultを呼び出すことはできますが、親アクティビティにも移動するため、結果をインターセプトできませんでした。

私はその結果をキャッチして、私のウィジェットに処理を委譲することができましたが、ウィジェット固有のロジックをウィジェットからアクティビティに移動しなければならないということは悪い習慣です。ウィジェットを使用する予定のすべてのアクティビティクラスでこの委任を実装する必要があります)。

私は他のアクティビティを開始する方法を知っています(少なくとも私は方法を知っています)。 (それはうまく動作します。)しかし、私はそれから何の結果も得られません。 アクティビティやその他のクラスを継承したり継承したりすることはできません(私のウィジェットには独自のクラス階層があります)。

私の質問は、カプセル化句を誤って推論することなく、非アクティビティクラス内の結果のアクティビティをどのように開始できますか?

おかげで、 Balage

答えて

2

私はこれを行うための最善の方法は、インターフェイスおよびリスナーを使用することだと思います。フラグメントhttp://developer.android.com/guide/topics/fundamentals/fragments.htmlを親クラスとして使用する場合は、これを行う必要はありません。これが、Googleが作成した理由です。

基本的にあなたのアクティビティがonActivityResult(int requestCode、int resultCode、Intentデータ)を起動するときは、ApetWidgetsで正しい関数を呼び出す必要があります。あなたのウィジェットに情報を渡す以外の特定のコードをアクティビティに配置する必要はありません。もう一度、Fragmentを使用すると、すべてのアクティビティライフサイクルメソッドがすでに委任されています。

+0

フラグメントは完璧なツールですが、使用できませんでした。APIレベル7のコンプライアンスでなければならず、レベル11で導入されています。多くのリファクタリングが現在の開発状況で断片に移行しています)。 しかし、私はこの新機能を指摘してくれてありがとう! – Balage1551

+1

確かに、Android SDKのダウンロードの一環として、互換性ライブラリがあります。これで1.6までのサポートが可能になります。http://developer.android.com/sdk/compatibility-library.htmlこのjarファイルを含めることで、フラグメントapiを使用することができます。使用すると動作しますすばらしいです。また、これは:http://android-developers.blogspot.com/2011/03/fragments-for-all.html – sgarman

0

このような構成を使用しました。まず、ウィジェット内にコールバックメソッドを実装します。 2番目 - あなたのウィジェットへのリンクを意図してください。アクティビティからの第三者呼び出しウィジェットコールバックメソッド。

ところで、コードデザインに問題があるようです。 secodアクティビティからユーザ依存の結果を得るには、ウィジェットではなくActivityクラスの結果を処理する方が良い方法です。

+0

ありがとう、それは動作する可能性があります。コールバックの直後に2番目のアクティビティが閉じられているため、少しタイトなカップリングが感じられますが、実際の問題ではないかもしれません。コール元のアクティビティ(ウィジェットを含む)が再開される前にコールバックが呼び出されるため、慎重な設計とバックキャッシングが必要です。 – Balage1551

関連する問題