5

jfeinstein によるライブラリを使用して、ダッシュボード パターンを使用する Android アプリケーションをスライド メニューにアップグレードしています。

もともと、私は 6 つのボタンを持つ DashboardActivity を持っていました。各ボタンは、対応するアクティビティをタップで開始しました。また、これらの「トップレベル」のアクティビティから開始できるアクティビティが他に約 30 あります。

今、私は2つの可能なアプローチを持っています:

  1. 古いバージョンのように、SlidingMenu フラグメントを含むある種の MenuActivity を定義し、選択されたメニュー項目でアクティビティを起動します。
  2. アクティビティを 1 つだけ定義し、既存のアクティビティをフラグメントに変換して、コンテンツ フレームに表示します。

スライド メニュー ライブラリの例を見て、フラグメントの切り替えを使用していたので、これが最善のアプローチかもしれないという考えが浮かびましたが、画面にはフラグメントよりもアクティビティの方が適していると思います。

コンテンツに単一のアクティビティとフラグメントを使用する理由はありますか?

4

3 に答える 3

7

Fragments API はあなたの友達です。いいえ、本当に。

(インターウェブとGlenn BechのSOに関する回答から適応)

1.再利用可能

フラグメントは、再利用可能なユーザー インターフェースを作成するための Android のソリューションです。アクティビティとレイアウトを使用して (たとえば、インクルードを使用して) 同じことをいくつか実現できます。でも; フラグメントは、HoneyComb などから Android API に接続されます。

2.軽量

アクティビティは主要なコンポーネントであるため、多くの追加の責任があります。コンテキストの提供など。これらの追加の責任がなければ、フラグメントは軽量であり、多くのフラグメントがあるため特に有益です (アクティビティがフラグメントにリファクタリングされる場合)。軽量だと言いましたか?

3. API に反対するのではなく、API と連携する

アクションバー。タブでアプリをナビゲートしたい場合は、ActionBar.TabListener インターフェースが onTabSelected メソッドへの入力引数として FragmentTransaction を提供することがすぐにわかります。おそらくこれを無視して、別の巧妙なことを行うこともできますが、API ではなく、API に対して作業することになります。

4. 巧妙な BackStack とカスタマイズも可能

FragmentManager は非常に巧妙な方法で「戻る」を処理します。戻るとは、通常のアクティビティのように、最後のアクティビティに戻るという意味ではありません。前のフラグメント状態に戻ることを意味します。これは、いつ、どのようにバックスタックを使用するかを制御できるという事実によって、さらに驚くべきことです (はい、その言葉です)。

5.キラキラとグラマー

ハリウッドのすべての効果は一体どこから来ると思いますか? FragentPagerAdapter でクールな ViewPager を使用して、スワイプ インターフェイスを作成できます。FragmentPagerAdapter コードは、通常のアダプターよりもはるかに簡潔であり、個々のフラグメントのインスタンス化を制御します。フラグメントに適用できるトランジション アニメーションとスワイプ アニメーションは、Activity では実行できないいくつかのことです。

6. タブレットと電話

より大きな電話?いいえ、タブレットです。携帯電話とタブレットの両方のアプリケーションを作成しようとするときに Fragments を使用すると、生活がずっと楽になります。フラグメントは Honeycomb+ API と密接に結びついているため、コードを再利用するために電話でもフラグメントを使用する必要があります。そこで便利なのが互換性ライブラリです。

7. 電話だけの人でしょ?

電話専用のアプリにフラグメントを使用することもできますし、使用する必要があります。携帯性を重視するなら。私は ActionBarSherlock と互換性ライブラリを使用して、バージョン 1.6 までずっと同じように見える「ICS のような」アプリを作成しています。タブ付きのアクションバー、オーバーフロー、分割アクションバー、ビューページャーなどの最新機能を利用できます。

もう一つ

8. クロスコミュニケーション

フラグメント間で通信する最良の方法はインテントです。Fragemnt で何かを押すと、通常、データを含む StartActivity() を呼び出します。インテントは、起動したアクティビティのすべてのフラグメントに渡されます。それはただ簡単です。

于 2013-05-10T21:09:13.353 に答える
2

フラグメントよりもアクティビティの方が画面に適していると今でも思います。

私の意見ではありません。非常に多くのフラグメントを処理するのが少し複雑になることは認めますが、フラグメントを使用することには利点があります。

1. 利点: 複数の画面サイズにスケーリングできます。

マルチペイン レイアウト パターンを利用して、アプリ ユーザーをタブレット ユーザーにとってより使いやすくすることができます。6 つのアクティビティが他のアクティビティも呼び出しているとおっしゃいました。複数の画面 (フラグメント) を並べて使用することで、ユーザーが画面をクリックする回数を減らすことができるかもしれません(既に述べたように、マルチペイン レイアウト)。あなたのアプリが何であるかはわかりませんが、ユーザーがリストから何かを選択する必要があり、選択したものに基づいて別のアクティビティにリダイレクトすることは想像できます。タブレットでは、2 つのフラグメントを使用してコンテンツを1 つの画面に (新しい画面を起動せずに) 表示することができますが、 1 つだけを表示するように選択することもできます。ハンドセット デバイス上のフラグメント (動的フラグメントと静的フラグメントを使用し、layout-sw600 などのフォルダーを使用することで、これらすべてを行うことができます)。これを行うことにした場合は、適切なユーザー フローを維持しタブレットの画面領域を利用できます。これにより、アプリが柔軟かつ動的になります。

これを参考にしてください: フラグメントの素晴らしい使い方

2. 利点: コードの重複を減らします。

アプリ全体でフラグメントを使用するのではなく、複数のアクティビティを選択した場合、ユーザー (私はユーザーとして話します) はアプリ内のあらゆる場所で SlidingMenu を使用することを期待しているため、すべてのアクティビティにSlidingMenu を提供する必要があります。ユーザーが SlidingMenu を使用するためだけにアクティビティ バックスタックを「上」に移動する必要がある場合、ユーザー エクスペリエンスが低下します。これは間違いなくユーザーフローを壊します。そのため、すべてのアクティビティでメニューを再実装する必要があります。もちろん、基本アクティビティを作成することでそれを行うこともできますが、1 つのアクティビティだけを使用して、そのアクティビティにこの問題を処理させる方がはるかに簡単です。

今のところ、他のアドバンテージは考えられません。しかし、他にもたくさんあると確信しています。

于 2013-05-10T18:35:09.203 に答える
1

皆さん、私はすべての投稿を読んでいますが、あなたは大丈夫だと思います。1 つのアクティビティ (多くのフラグメントを含む) と複数のアクティビティ。

断片に満ちた 1 つのメイン アクティビティは、あまり良くありません。プロジェクトに多くの画面がある場合、アクティビティの遷移、ライフサイクル、フラグメント間の通信が混乱する可能性があります。サイドメニューを共有する利点があります。これは、そうすることを目的としています。

一方、画面の種類ごとに 1 つのアクティビティがあり、フラグメントがないことは別の問題です。アクティビティごとにサイドメニューを作成する必要があります。もちろん、基本クラスを使用するのは簡単に思えますが、毎回メニューの状態を復元する必要もあります。

この問題に対する現在の解決策は、アクティビティの数を最小限に減らし、フラグメントをできるだけ多く使用することです。一部の機能を共有するフラグメントをアクティビティにグループ化します。適切なタブレット サポートを導入しているため、フラグメントを使用する必要があります。

最後のコメント。googlePlay ストアを逆コンパイルして、階層を調べることができました。私はその内部組織に非常に興味がありました。私は本当に、Google の連中が 1 つのメイン アクティビティと内部のいくつかのフラグメントのみを使用したと思っていました -> 間違っています。彼らはまた、多くの活動を使用しています。

結論:私たちは過激派であってはなりません。アクティビティを 1 つだけにすると、小さなプロジェクトや単純なナビゲーション階層でしか機能しないと思います。同時に、あまりにも多くのアクティビティを使用すると、ナビゲーションが混乱する可能性があります。

于 2014-01-20T15:26:41.337 に答える