5

私はアクティビティに投稿情報を保持するアプリケーションを持っています。このアクティビティでは、ポストの一番下にリストされている関連ポスト。ユーザーは関連する投稿をクリックすることで、投稿活動に行き、その投稿情報と関連する投稿も見ることができます。アクティビティのインスタンスを開く

Figure

あなたが画像で見ることができるように、私はポストを保持し、それが記事に関連だ活動Aを持っています。ユーザーが投稿をクリックすると、ユーザーにアクティビティAに新しい投稿IDが送信され、新しいデータでアクティビティが埋められます。

しかし、私はこれが正しい方法ではないと思います!

Activityの代わりにFragmentを使用する必要がありますか?

+0

私はあなただったら私は断片を使用します。通常は詳細ページがアプリケーションの別の部分で繰り返されるため、コードの再利用性が向上します。 – Amir

+0

@Amir Yep!私が今考えていることは、 'PostFragment'を保持する' PostActivity'というアクティビティを作成してから、アクティビティのフラグメント置き換えを行うためのインターフェースを作成することです。それについてどう思いますか? – MAY3AM

+0

それは良い方法です。しかし、なぜ私はあなたがインターフェイスが必要なのか分からないのですか? – Amir

答えて

0

私が選ぶだろう:

    第2の垂直recyclerview :)カスタム展開し、カードビュー
  • とし、この拡張されたカードビュー内の
  • 水平recyclerview

活動/フラグメントは、と複雑さによって異なります

0

お試しください。

フラグメントのシェルであるPostActivityを作成します。このアクティビティの内部では、FragmentTransactionを使用してフラグメントを置き換えることができます。

PostActivityには投稿と関連する投稿を保持するPostFragmentを追加できるようになりました。投稿をクリックすると、PostFragmentPostDetailFragmentに置き換え、postIDを新しいフラグメントにバンドルとして送信することができます。 PostDetailFragmentに、idに従った詳細が表示されるようになりました。ここ

チェック:絵を見てhttp://www.vogella.com/tutorials/Android/article.html#components_fragments

0

私が実装するような方法は、私はあなたの項目の下のリストビューでのアクティビティを作成する必要がありますし、一番上の断片を保持するためでframeLayoutがあるでしょうです。ユーザーがリストアイテムをクリックすると、アクティビティのそれぞれのフラグメントがロードされます

0

すべては、達成しようとしているものによって異なります。ユーザーがいくつかのレベルを下った後に戻るボタンをタッチすると、何が起こると思いますか?順序をどの程度深くしても、アプリケーションを終了したい場合は、私の意見では、新しいデータで同じアクティビティをリロードし、影響を受けるビューを無効にするだけです。前のデータに戻すために戻るボタンが必要な場合は、過去のデータブレッドクラムを把握している場合は次の質問になります。その場合は、バックボタンを横取りし、スタック内にデータがある限り前のデータをロードします。先頭に戻ると終了します。以前のデータチェーンを追跡したくない場合は、あるアクティビティに新しいデータをロードする代わりに、同じクラスの新しいアクティビティを新しいデータで開始することができます。 Androidはアクティビティの追跡とそれぞれの戻るボタンのタッチで実行中のアクティビティを終了し、以前のアクティビティに移動します。アクティビティとフラグメントの選択はあなたのものです。各ユーザーがタッチするたびに変更するデータを保持するフラグメントを使用し、必要なときに新しいものを作成し、前のものを切断して新しいものを接続することができます。戻るボタンが正しく動作するようにするには、いくつか余分な作業が必要になります(戻るボタンを動作させたい場合に応じて)。私が知ることに基づいて、1つのアクティビティを持ち、必要に応じて新しいデータをロードし、元に戻す必要がある場合は、データ変更のトレイルを維持する方が簡単です。

1

アクティビティの別のインスタンスを別のインスタンス上に開くことは、コンテンツグラフをナビゲートする最も簡単な方法です。ユーザは、単にアクティビティを開始するまで、前に開いたコンテンツに戻ることができ、その後、アプリケーションは終了する。かなりまっすぐ進むが、この特定のアプローチは、2つの問題があります。

  1. メモリのようなデバイスの大量のリソースを活用し、同じアクティビティのインスタンスの多くは、スタック上にあることを起こるかもしれません。

  2. アクティビティスタックを細かく制御することはできません。あなたが唯一の別のアプローチがあります

など FLAG_CLEAR_TOPように意図フラグに頼ら、より多くの活動を開始し、一部を終了、または持つことができ、その同じアクティビティインスタンスを再使用しても思い出しながら、その中に新しいコンテンツをロードしますロードされたコンテンツの履歴WebブラウザのようにWebページのURLを使用しています。

これまでのところ、コンテンツはStackのままにしておくことをお勧めします。新しいコンテンツを読み込むと、より多くのデータがスタックにプッシュされ、空に戻るまでスタックからスタックの最上位のコンテンツがポップされます。アクティビティUIには、常にスタックの上からコンテンツが表示されます。

ラフ例:

public class PostActivity extends AppCompatActivity { 
    // keep history of viewed posts, with current post at top 
    private final Stack<Post> navStack = new Stack<>(); 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // get starting link from intent extras and call loadPost(link) 
    } 

    private void loadPost(String link){ 
     // Load post data in background and then call onPostLoaded(post) 
     // this is also called when user clicks on a related post link 
    } 

    private void onPostLoaded(Post post){ 
     // add new post to stack 
     navStack.push(post); 

     // refresh UI 
     updateDisplay(); 
    } 

    private void updateDisplay(){ 

     // take the top Post, without removing it from stack 
     final Post post = navStack.peek(); 

     // Display this post data in UI 
    } 

    @Override 
    public void onBackPressed() { 
     // pop the top item 
     navStack.pop(); 

     if(navStack.isEmpty()) { 
      // no more items in history, should finish 
      super.onBackPressed(); 
     }else { 
      // refresh UI with the item that is now on top of stack 
      updateDisplay(); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     // cancel any background post load, release resources 
    } 
} 
0

それは一人で活動を使用して達成することができます。私はすべての関連するUIを断片化するのが好きでしたが。

Navigatorクラスを使用できます。

ここでの手順:
1.ナビゲータークラスに

public class Navigator { 

    private static Navigator instance; 

    public synchronized static Navigator getInstance() { 
    if (instance == null) { 
     instance = new Navigator(); 
    } 
    return instance; 
    } 

    public void navigateToActivityA(Context context) { 
     Intent activity= AActivity.getCallingIntent(context); 
     context.startActivity(activity); 
    } 
} 

2.を追加するには、Activityクラスに呼び出し元のメソッドを追加します。

public static Intent getCallingIntent(Context context) { 
return new Intent(context, AActivity.class); 
} 

3.呼び出し側の活動に次のコードでの活動を呼び出します。

Navigator.getInstance().navigateToActivityA(this); 

私は

0)新しい活動

を起動するには、私が質問について再び読ん...あなたは、このタスクでは約AndroidCleanArchitecture

0

読むことを示唆している、とあなたが理解しました活動を開始するためのアドバイスが必要です。だから、新しい活動を始めるのは大丈夫です。あなたの主な問題は別のものとなります(下記参照)。

しかし、別のデータの開始について話すことができます。代わりにフラグメントを使用してもタスクが解決されない場合、フラグメントはさまざまな画面操作に役立ちます。たとえば、データのリフレッシュをバリアントとして使用します。単一のアクティビティだけを使用し、データのみをリフレッシュすることもできます。アニメーションを追加しても、アクティビティを開始するよりは優れていない場合は、はるかによく見えます。

フラグメントを使用すると、さまざまな画面操作で役立ちます。そしておそらく、あなたの質問に答えて - それは最も適した解決策になるでしょう。 PostActivityといくつかのフラグメント、FragmentMainPost、FragmentRelatedを使用して、関連する投稿から選択することで、相互に置き換えられます。バック

を返すと

1)の問題は、ユーザーが新しい活動にクリックし、我々は新しいデータをロードすることを、想像します。それはOKです。ユーザーが100以上のアクティビティをクリックして多くの情報を受け取ったときです。それもOKです。しかしここでの主な質問は、それが戻ってきていることです(キャッシングについてのもう一つの問題ですが、今のところそれを残すことができます)。

誰もが知っているので、たくさんのアクティビティをスタックに保存するのは悪い考えです。だから私のすべてのアプリケーションでは、同様の動作で、このアクティビティのonBackPressedをオーバーライドします。

//Activities most have some unique ID for saving, for ex, post number. 
//Users clicks to 100 new activities, just start as new activity, and 
//finish previous, via method, or setting parameter for activity in AndroidManifest 
<activity 
    noHistory=true> 
</activity> 

.... 

//When activity loaded, save it's activity data, for ex, number of post 
//in some special place, for example to our Application. So as a result 
//we load new activity and save information about it to list 
.... 

// User now want return back. We don't save all stack this activities, 
// so all is Ok. When User pressing back, we start action for loading 
//activities, saved on our list.. 

..... 

    onBackPressed() { 
     //Getting unique list 
     LinkedTreeSet<PostID> postList =  
      getMyApplication().getListOfHistory(); 

     //Getting previous Post ID based on current 
     PostID previousPostID = postList.get(getCurrentPost()); 

     //Start new activity with parameter (just for ex) 
     startActivity(new Intent().putExtra(previousPostID)); 

    } 

RESULT

私は、このタスクのための最善の解決策として、これを見つけた:しかし、どのようには、以下の流れを見ることができます。なぜなら、毎回、私たちはひとつの活動でしか働かないからです!

関連する問題