2016-05-28 6 views
0

抽象データソースで提供され、そのソースからデータを抽出し、データをListViewに提示して、選択したアイテムを戻す汎用の「セレクタ」アクティビティが必要です呼び出しアクティビティへ。非常に類似した何かRingtonePickerActivityアクティビティ間で 'データソース'を渡す

私が理解できないことは、あるアクティビティから別のアクティビティに汎用データソースを渡す方法です。今まで活動の間でデータを共有するという点で私が見てきたのは、データをIntentのエクストラに通すことです。しかし、実際のデータを提供したくないので、ここで私にとってはうまくいかないようです。抽象的なデータソースへの参照を渡したいのですが(Cursorと違って)照会することができます。

私が強調したい点は、選択者が実際のデータソースに無関係であることを要望しています。つまり、抽象データソースはgetNextItemgetItemNamegetItemValueのようなメソッドを提供します。私が考えることのできる最高のモデルは、カーソルまたは反復子です - 純粋に抽象的なデータセットを反復するメカニズムです。

アプリケーションのすべてのアクティビティが同じプロセスでホストされるため、これは可能でしょうか?一つのことは、アプリケーション内にグローバルデータソース変数を持つことを望んでいません。その理由の1つは、複数のデータソースを持つ複数のチューザアクティビティを実行するということです。開始時に開始されたアクティビティにデータを提供します。

それは可能ですか?私はひどく間違っていますか?より良い方法がありますか?

答えて

1

実際のデータを提供したくないので、私はここではうまくいかないようです - 私は抽象的なデータソースへの参照を渡したいのですが(Cursorと違うわけではありません) 。

抽象データソースを識別する追加またはUriを渡します。その情報を使用して、そのデータソースを照会します。

たとえば、「抽象データソース」がWebサービスであるとします。アクティビティがそのデータのレンダリングルールを持たなければならない(つまり、リスト内の行に何を表示するか)という理由だけで、どのようなデータが戻ってくるかを知るには、Webサービスについて十分に知る必要があります。しかし、Webサービスの実際のURLは多分異なるでしょう。 URLを余分に渡すか、Intentの "データ"として渡します(setData(Uri.parse(theUrlThatYouWant))経由であなたのアクティビティはRetrofitのようなものを使用して、バックグラウンドスレッドのデータを検索し、その結果をリストに使用します)

一般的に、アクティビティに渡すのは、アクティビティがデータソースを参照できるようにするための識別子です。識別子、

一般的なUIに任意のデータソースを設定しても構いませんが、これらの任意のデータソースを経由して渡すことはできませんのオブジェクトはプロセスの境界を越えて渡されるように設計されているため、3210主な選択肢は次のとおりです。

  1. 継承と多型を使用します。単純な識別子が与えられたデータを取得できるサブクラスを使用して、ほとんどの作業を行う抽象的なチューザーアクティビティを用意します。

  2. Intent構造によって制限されていないため、必要なものはすべて渡すことができるため、一部のインアクティビティUI(フラグメントなど)を使用します。

+0

十分明確でない場合は申し訳ありません。要点は、どこから来たのかわからなくてもデータを取得するための 'Chooser'アクティビティが欲しいということです。 Cursorはおそらく良い例です - 私は、アクティビティが何も知らずにソースからデータを抽出できるようにしたいと考えています。もう1つのモデルは抽象イテレータかもしれません - あなたが次のアイテムを求めることができるもの。 – SergeyA

+0

@SergeyA:「アクティビティが何も知らなくてもソースからデータを抽出できるようにしたい」 - うん、「Cursor」はそのようには機能しません。 'Cursor' *はデータであり、あなたは実際のデータを渡すことを望まないと述べています。 'Cursor'を取得するには、それを取得する方法を知る必要があります。これは、データベース名とクエリ、または 'ContentProvider'' Uriとクエリである可能性があります。 「別のモデルは、抽象イテレータであるかもしれません。次のアイテムを求めることができます。つまり、データを渡すときに、イテレータの動作方法ではありません。 – CommonsWare

+0

私は明確にするために質問を編集しようとしました。 – SergeyA

1

私は、これらの方法でアクティビティのデータを渡すことができます。

  1. データをインテントで渡します。

  2. サービス内でデータを作成する場合は、両方のアクティビティでServiceConnectionを作成し、両方のサービスからgetData()メソッドを使用してデータにアクセスすることができます。

  3. は、新たな活動が同じに再作成できるように、グローバルまたは一時的にグローバルデータ(メモリが解放されるように、あなたはそれで行わ「再たら参照を無効化)

  4. が意図による命令のいくつかのフォームを渡してくださいデータ。たとえば、データがデータベースにクエリされたものである場合、クエリを文字列としてアクティビティBに渡すことができます。アクティビティBはそのクエリを実行して同じデータを取得できます。

また別の方向に行ってみたいですか?たとえば、私が何度も使用してきたことは、チューザのアクティビティではなく、チューザダイアログです。これにより、アクティビティから離れることなく選択肢を表示し、ダイアログコンストラクタにデータを渡すだけです。また、ダイアログがフルスクリーンになるように設定することで、アクティビティがユーザに行うのと同じように見えるようにすることができます。フラグメントも同じ目的を果たすことができます。

+0

他の回答に私のコメントを見てください。私は私の意図をより明確にしようとしていました。 – SergeyA

+0

更新された回答を参照してください。これはあなたに役立ちます – Anonymous

+0

セレクタダイアログは面白いオプションです、ありがとう! – SergeyA

関連する問題