11

マップ、人、場所、イベントの 4 つのタブを持つアプリを作成中です。アプリ内の人、場所、イベントは、マップ上にアイコンとして表示されます。デフォルトでは、[人]、[場所]、および [イベント] タブにはそれぞれ、カスタム レンダリングされたリストビューが表示され、すべての人、場所、およびイベントがそれぞれ表示されます。

代替テキスト http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

現在、各タブには、対応するアクティビティを起動するように設定されたインテントがコンテンツとして含まれています。たとえば、MapActivity を拡張する MapTabActivity や、人を表示する ShowPeopleListActivity などがあります。

TabHostのセットアップ方法にはさまざま な制限があるため、アクティビティをタブのコンテンツとして使用しないことをお勧めしますたとえば、新しいアクティビティを起動して、タブ内の既存のアクティビティの代わりにすることはできませんが、ビューを別のビューに切り替えることは可能です。

今、私は岐路に立っています。私たちは (良くも悪くも) かなりの時間を費やして、このアプリを現在の構造のように機能させ、Activity をタブのコンテンツとして機能させようとしました。人物、場所、またはイベントに対応するアイコンがクリックされると、そのオブジェクトに対応する URI で VIEW インテントが起動されます。これは、オブジェクトを表示するアクティビティによって取得されます。同じメカニズムが、マップと個々のリストの両方で機能しています。これが提供する疎結合が非常に気に入っています。VIEW コマンドと URI を人/場所/イベントに与えるだけで、自動的に適切なアクティビティに移動します。確かに、起動されたアクティビティはタブ ビュー内に表示されるのではなく、タブ ビューを覆い隠しますが、私たちはこれを受け入れるつもりでした。

ただし、ここで問題があります。Show アクティビティから、その人、場所、またはイベントを中心としたマップに戻ることができるようにしたいのです。マップを再度表示するために新しいアクティビティを起動できますが、これで、マップ アクティビティがタブのコンテンツとして表示され、アクティビティ スタックに表示アクティビティと新しいマップ アクティビティが追加されました。マップ アクティビティがリソースを大量に消費することを考えると、これは理想的な方法ではないと思います。

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

前進するための提案は非常に高く評価されます。私たちは Android を初めて使用するので、確立されたベスト プラクティスに従おうとしていますが、これまでに見たいくつかの例が私たちのユース ケースに対して単純すぎる場合、それは困難です。

4

3 に答える 3

8

TabHostの設定方法にはさまざまな制限があるため、タブのコンテンツとしてアクティビティを使用しないのが最善であるというStackOverflowの質問/回答がたくさんあります。

Anti-Activity-Tab Alliance(AATA)の自己任命された社長として、それは確かに私の立場です。

人、場所、またはイベントに対応するアイコンをクリックすると、そのオブジェクトに対応するURIでVIEWインテントが起動します。これは、オブジェクトを表示するアクティビティによって取得されます。

これは、タブのコンテンツとしてアクティビティを持つこととは関係がないことに注意してください。

新しいアクティビティを起動してマップを再度表示できますが、タブのコンテンツとしてマップアクティビティ、表示アクティビティ、およびアクティビティスタック内の新しいマップアクティビティがあります。マップアクティビティがどれほどリソースを消費するかを考えると、これは理想的な方法ではないと思います。

できれば避けたいと思います。

ビューベースの方法に切り替えると、すべてのバックイベントをインターセプトしたり、ビューを切り替えたりするために、多くのハウスキーピングを行う必要があるのではないかと心配しています。私たちのプログラムを私たちが望まない方法で強く結合します。

これは、あなたが以前に書いたものからはまったく従いません。「バックイベント」は、ビューをタブのコンテンツとして使用することとアクティビティをタブのコンテンツとして使用することの間で1つのイオタを変更しません。さらに、これはあなたが説明する「緩い結合」パターンとは何の関係もありません。タブのビューのリストのアイコンをクリックすることは、アクティビティのビューのリストのアイコンをクリックすることと同じです。タブ。

Showアクティビティに、特定の場所を表示するようにメインアクティビティに指示させるだけで、Showアクティビティにできfinish()ます。アクティビティ間にハードJVMカップリ​​ングを導入せずにこれを行う最も簡単な方法は、メインアクティビティにをブロードキャストしIntentて登録することです。BroadcastReceiverこれを受け取るとIntent、メインアクティビティはマップを更新し、現在のタブに設定します。もちろん、メインアクティビティでタブの内容にビューを使用する場合、このアプローチはより簡単です。

ここで、アプリケーションをオーバーホールしようとすると、タブ内を移動しても別のアクティビティが起動せず、それ自体のタブ内に物事が保持されます...つまり、魚のやかん全体です。

于 2009-10-19T19:04:15.520 に答える
8

タブに 1 つのアクティビティと複数のビューを用意することをお勧めします。ただし、これは、どのタブが選択されているか、タブ ビューごとに異なるメニューやコンテキスト メニューが表示されるなどの処理に注意する必要があることを意味します。

私の質問は、TabHost で複雑なタスクを実行する方法を正確に示す良いチュートリアルがどこかにあるのでしょうか? HelloTabWidget を見てきました。これよりもはるかに洗練されたものを探しています。

私は自分のブログに、ListView と MapView をタブとして相互作用させることを示す、少し優れたチュートリアルを書きました。リンクは次のとおりです:相互作用するマップ ビューとリスト ビューを備えた Android タブ

基本は、HelloTabWidget チュートリアルのものと同様のレイアウトを持ち、アクティビティを MapActivity から拡張し、XML からタブホストを抽出し、タブホストで必ず 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;
        }
    }));
}

...

于 2010-09-12T17:37:43.717 に答える
1

たとえば、新しいアクティビティを起動してタブ内の既存のアクティビティの代わりにすることはできませんが、別のビューでビューを切り替えることは可能です。

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

于 2010-11-11T19:15:44.527 に答える