2009-10-19 20 views
10

マップ、人物、場所、イベントの4つのタブを持つアプリを作成中です。アプリ内の人々、場所、イベントはマップ上にアイコンとして表示されます。デフォルトでは、[People]、[Places]、[Events]の各タブにはそれぞれリストビューが表示され、カスタムレンダリングされ、すべての人物、場所、イベントが表示されます。今Android - タブ、MapView、タブ内のアクティビティ

alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

、今のタブのそれぞれは、そのコンテンツに対応するアクティビティを起動する意向セットとして持っています。たとえば、MapActivityを拡張するMapTabActivity、人を示すShowPeopleListActivityなどがあります。

私が原因のように様々な制限にTabHostが設定され、それはタブの内容として活動を使用しないことをお勧めだと言ってlotofStackOverflowquestions /答えを参照してください。たとえば、新しいアクティビティを起動してタブ内の既存のアクティビティを置き換えることは不可能ですが、別のビューでビューを切り替えることは可能です。

今、私は交差点にいます。私たちは(良いか悪いかに関わらず)このアプリをタブのコンテンツとして、現在構造化された方法で動作させるためにかなりの時間を費やしました。人物、場所、またはイベントに対応するアイコンがクリックされると、そのオブジェクトに対応するURIのVIEWインテントを起動します。これは、オブジェクトによって示されるアクティビティによって取得されます。マップと個々のリストの両方で同じメカニズムが働いています。これが私たちに提供する疎結合が本当に好きです。 VIEWコマンドとURIをperson/place/eventに渡すだけで、自動的に適切なアクティビティが実行されます。確かに、起動されたアクティビティは、その中に表示されるのではなく、タブビューをカバーしていますが、これを使用して喜んで生きていました。

ここで問題があります。ショーのアクティビティから、その人、場所、またはイベントを中心に地図に戻ることができるようにしたいと考えています。新しいアクティビティを起動してマップを再度表示することもできますが、マップアクティビティはタブの内容と、showアクティビティと、アクティビティスタック内の新しいマップアクティビティに加えて追加されました。地図のアクティビティがどのようにリソースに集中しているかを考えれば、これは理想的な方法ではないと思います。

私は質問があると思います.Goodチュートリアルでは、TabHostで複雑なタスクを行う方法を正確に示していますか?私はHelloTabWidgetを見た。私はこれよりずっと洗練された何かを探しています。ビューをベースにしたやり方に切り替えると、すべてのバックイベントをインターセプトしたり、ビューを切り替えたりするなど、たくさんのハウスキーピングを行う必要があると私は心配しています。強く私たちのプログラムを私たちが望んでいない方法で結びつけること。

今後の進め方に関する提案は非常に高く評価されます。私たちはAndroidが初めてのので、確立されたベストプラクティスに従っていますが、私たちが見てきたいくつかの例は、ユースケースではあまりに単純すぎます。

答えて

7

私はStackOverflowの 質問/による方法で 様々な制限に TabHostが設定され、それはタブの内容として 活動を使用しないことをお勧めだと言って答えの多くを参照してください。

自分自身で任命されたAnti-Activity-Tab Alliance(AATA)の大統領として、それは確かに私の立場です。 人、場所、またはイベントに対応するアイコンをクリックする

、そのURIそのオブジェクトに対応する 上のVIEWインテントオフ 火災。これは というアクティビティで取り上げられ、その後 にオブジェクトが表示されます。

これは、タブのコンテンツとしてアクティビティを持つこととは関係がありません。

我々は再び 地図を表示する新しいアクティビティを起動することができますが、今はタブ、 プラスショーの活動に加え、アクティビティスタックの新しい マップ活動の内容としてマップ 活性を有し; どのようにリソースの集中的なマップ の活動は、私はこれがないと推測している与えられた 行くには理想的な方法です。

可能であれば、私はそれを避けます。

は、私たちは物事の ビューに基づく方法に切り替えた場合、我々は が インターセプトすべてのバックイベントにハウスキーピングのLOTをしなければならないだろうと心配して、ビューアウト スイッチにしてみてください等々、 と同様強く私たちのプログラム を強くカップリングしたくありません。

これまでに書いたことは全くありません。あなたの "バックイベント"は、タブの内容としてビューを使用し、タブの内容としてアクティビティを使用することの間で、1つのイオタを変更しません。さらに、これはあなたが描いている "疎結合"パターンとは何の関係もありません。タブ内のビュー内のリスト内のアイコンをクリックすることは、アクティビティ内のビュー内のリスト内のアイコンをクリックすることと変わりありませんタブ。

あなたのショーアクティビティで、あなたの主なアクティビティに特定のロケーションを表示するようにしてから、ショーアクティビティをfinish()にすることができます。アクティビティー間のハードJVM結合を導入せずにこれを行う最も簡単な方法は、Intentをブロードキャストし、メインアクティビティーにBroadcastReceiverを登録することです。このIntentを受け取ると、メインアクティビティは地図を更新し、それを現在のタブに設定します。もちろん、主なアクティビティでタブのコンテンツのビューを使用している場合は、このアプローチは簡単です。

あなたのアプリケーションをオーバーホールしようとすると、タブ内をナビゲートすると別のアクティビティーが起動するのではなく、タブ内にアイテムが保持されるようになります。

+0

私はすべてのインテントを同じように設定して、Showアクティビティが開始されると、バックイベントはまったく同じように処理されることを確認します。 私は、インテントを起動するのではなく、タブのコンテンツをプログラムで切り替えた場合、実際の複雑さ(およびバックイベントの痛み)があると思います。例えば。一般的に人のリストを表示する人物タブは、人がクリックされたときに人物の表示に切り替えるように指示されます。その場合、私たち自身の見解を扱わなければならないだろうか? – I82Much

+0

また、タブの内容としてアクティビティを持たずにタブ内にマップを作成するにはどうすればよいですか?それは可能ですか? – I82Much

+0

w/r/tあなたの最初のコメント、はい、独自のスタック管理を行う必要があります。 w/r/tあなたの2番目のコメント、はいあなたはAFAIKすることができます。主なアクティビティをTabActivityではなくMapActivityにします。 TabActivityがあなたのために行う唯一のことは、あなたのTabHostに自動的にsetup()を呼び出すことです。あなたはTabSpecを追加する前に自分自身を実行する必要があります。 MapActivityは、マップをタブに配置するために必要なものを提供します。ここに問題がある可能性はありますが、袖口から外しても問題ありません。 – CommonsWare

8

あなたのタブに1つのアクティビティと複数のビューを持たせることをお勧めします。しかし、それは私が私の質問があると思い

など、各タブの表示のためにあなたが別のメニューやコンテキストメニュー、選択されたタブ扱うことに注意する必要があります意味し、どこか を示す GOODチュートリアルがありますどのように正確に複雑なタスクを行うには TabHost?私はHelloTabWidgetを見たことがある。私は 何かをもっと探しています これより洗練されています。

私は、相互作用するListViewとMapViewをタブとして示す私のブログで少し上手なチュートリアルを書いています。 Android Tabs with interacting map and list views

基本は、HelloTabWidgetチュートリアルのレイアウトと似たレイアウトを作成し、MapActivityからアクティビティを拡張し、XMLからタブホストを抽出し、tabhostでsetup()を呼び出すことを確認します。その後、タブ、タブリスナーなどのコンテンツとしてビューを追加することは同じです。ここで

は、クラスの簡単な出発点です:

public class TabbedListMapActivity extends MapActivity { 

private ListView listView; 
private MapView mapView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    tabHost = (TabHost) findViewById(android.R.id.tabhost); 

    // setup must be called if not a TabActivity 
    tabHost.setup(); 

    // setup list view 
    listView = (ListView) findViewById(R.id.list); 

    // setup map view 
    mapView = (MapView) findViewById(R.id.mapview); 

    // add views to tab host 
    tabHost.addTab(tabHost.newTabSpec("List").setIndicator("List").setContent(new TabContentFactory() { 
     public View createTabContent(String arg0) { 
      return listView; 
     } 
    })); 
    tabHost.addTab(tabHost.newTabSpec("Map").setIndicator("Map").setContent(new TabContentFactory() { 
     public View createTabContent(String arg0) { 
      return mapView; 
     } 
    })); 
} 

...例えば

+0

今、これは素晴らしい答えです!ありがとうジョシュ、あなたは私の日を救った。 –

1

、それは 打ち上げ新しい活動することは不可能だし、それが 既存の場所を取る必要がありアクティビティ をタブ内に表示しますが、 ビューを別の ビューに切り替えることは可能です。

私は不可能ではないと思います。私はこのアイデアを実験し、私がしたことを説明するブログarticleを書きました。記事の最後には、私が学んだ興味深いことのいくつかを示すサンプルコードプロジェクトが含まれています。

関連する問題