1

作業中の音楽プレーヤーに対して、「祖先」および「一時」ナビゲーション(上ボタンと戻るボタンを使用)を実装するための最良の方法を見つけようとしています。

現在、ユーザーにはビューページャーが表示され、3つのメインフラグメント(ArtistMain、AlbumMain、SongMain)の間でページングできます。そのビュー内のアイテムを選択すると、フラグメントトランザクションが発生し、ビューページャーが表示されなくなり、新しいフラグメント(ユーザーの出身地に応じて、AlbumSub、Songsub、またはplayer)に置き換えられます。ユーザーは、曲が選択されるまでさらに深くナビゲートでき、その後、「プレーヤー」画面に移動します。

問題は、この条件付きナビゲーションをすべて実装するにはどうすればよいかということだと思います。

私はAndroidとプログラミング全般にかなり慣れていませんが、これを実現するための効率的な方法を思い付くことができないようです。現時点では、各フラグメントが表示されると、アプリはユーザーがどこから来たのかを確認し、帰宅または自宅に呼び出された場合にユーザーをどこに連れて行くべきかを決定します。これは、「fromArtistMain」、「fromAlbumSub」などのブール値があり、「fromSongSub&&fromPlayer」などをチェックしていることを意味します。すべてが少し混乱しています。

私が達成しようとしているナビゲーションを描くために、図を描きました(ペイントで、ごめんなさい!!)。黄色は「上」ボタンの押下を表し、赤は「戻る」ボタンの押下を表し、青色は通常のナビゲーションです。緑の矢印は、ビューのページングを表すためのものです。

ナビゲーション図

どんなアドバイスでも大歓迎です。私が見落としたような本当に単純なことが必要かもしれません。

御時間ありがとうございます。

編集:

私はバックスタックにフラグメントを追加してきましたが、popBackStack()呼び出しを使用すると、問題は、バックスタックをポップすることが必ずしも正しいオプションではないということです。

私は現在、トランザクションを最初にバックスタックに追加する必要があるかどうかを判断しようとするコードの混乱を抱えています。

次の点を考慮してください。ユーザーは「SongMain」から直接曲を選択し、「Player」に移動します。ここで、ホームボタンを使用して(私の考えでは)、ユーザーをSongSub(選択した曲が属するアルバムの曲のリスト)に移動します。これで、ユーザーが再び上に移動すると、そのアーティストのアルバムのリストである「AlbumSub」に移動します。これはフラグメントトランザクションですが、バックスタックに追加すると、ユーザーはバックプレスでレベルが下がることになります(これは予想外のことだと思います)。したがって、この場合、その特定のトランザクションをバックスタックに追加しません-問題ないように見えますが、かなりの数の異なるケースがあり、可視性の出入りが必要な上部のビューページャーと組み合わせると、コードは実際に取得されます混雑。

これはすべて、ユーザーがどこから来たのか、そしてそこに到達するためにどのパスをたどったのかを決定する一連の条件を意味します。

ユーザーがナビゲートした場所に応じて設定される多数のブール値をホストアクティビティに含め、それらのブール値をチェックして、トランザクションをバックスタックに追加する必要があるかどうかを確認するのが賢明でしょうか。これは私がすでに持っているものの一種ですが、それは本当に非効率的なようです。

4

1 に答える 1

3

あなたが調べているものはと呼ばれますBack stack。詳細については、developer.android.comをご覧ください。

単一のアクティビティを使用してこれらの各フラグメントをホストする場合は、次のようなコードを使用して、フラグメントをフラグメントバックスタックに明示的に追加するようにコードを変更できます。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();       
    transaction.replace(R.id.container, fragment);      
    transaction.addToBackStack("NameOfFragment");
    transaction.commit();       

したがって、上記のコードを次のようなフラグメントで実行すると、次のようになります。

Fragment1 -> Fragment2 -> Fragment3 -> Fragment4

次に、Fragment4このメソッドを呼び出すと、次のようになります。

getSupportFragmentManager().popBackStackImmediate();

その後Fragment4、終了してFragment3再起動します。単純。この行をボタンクリックから呼び出すことも、戻るボタンの動作をオーバーライドして呼び出すこともできます。

getSupportFragmentManager()例では、互換性パッケージのメソッド名である関数を使用していることに注意してください。互換性パッケージを使用していない場合は、代わりにを呼び出すことができますgetFragmentManager()

編集

想定するナビゲーションの問題は、途中でバックスタックパラダイムから抜け出すことは、アプリが他のOSとは「異なる動作」をすることを意味することです。これは、概してGoogleによって推奨されていません。しかし、繰り返しになりますが、非常によく似た理由で、アプリでもまったく同じことをしています:)。

黄色い線の1つに沿って「上」に移動すると、個別のリンク(soなどstartActivity(new Intent(this, SongSub));)をたどり、これでバックスタックを「壊す」ことができます。

この段階で、どのように前進したいかを決定できます。

  • SongSubを0番目のアイテムとして使用してタスク(バックスタック)を開始できます。これは、Googleミュージックアプリが行うことの記憶からのものであり、あなたが正しい、それは迷惑です。押し戻すと、技術的にアプリを終了するはずです。ユク。明らかなページ階層にいる場合、IMOは常に、アプリを終了する際に階層を下に移動する必要があります。

  • ArtistMainを0番目の要素として使用して新しいタスクを開始し、commitトランザクションを実行する前にフラグメントを個別に上に重ねることができます。実際には、「戻る」ではなく「上がる」たびに新しいバックスタックが作成されます(バックスタックはArtistMain-> ArtistSubになります)。 -> SongSub)。これはあなたがここで尋ねようとしていることだと思います。可能ですが、面倒です。

  • より線形な構造を作成できます(可能であれば、おそらく最良のアイデアです)。バックスタックパラダイムを無視し、「戻る」と「上へ」をどこから来ても常にレベルを上げるようにします(プレーヤーは常にSongSubに移動し、SongSubは常にAlbumSubに移動します)。これにより、ユーザーは最も混乱が少なく、最も透過的な(そして実装が最も簡単な)エクスペリエンスを得ることができます。ユーザーは、目的の場所に到達するためにナビゲートする方法(および押す「戻る」の数)をすばやく学習します。

于 2012-09-24T12:37:18.100 に答える