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
}
}
根据复杂度选择activity/fragment,使用以下内容:
以下是您可以尝试的方法。
创建一个PostActivity
,它是片段的外壳。在此活动中,您只需使用FragmentTransaction
替换片段即可。
现在,您的PostActivity
可以有一个PostFragment
,其中将保存帖子和相关帖子。现在,在单击帖子时,您可以使用postID
作为包发送到新片段,将PostFragment
替换为PostDetailFragment
。 PostDetailFragment
现在将根据id显示详细信息。
请查看这里:http://www.vogella.com/tutorials/Android/article.html#components_fragments
这可以仅通过使用Activity来实现。但我更喜欢将所有相关的UI移动到Fragment中。
您可以使用Navigator类。
以下是步骤:
1. 添加Navigator类
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);
我建议你阅读关于AndroidCleanArchitecture的内容。
针对这个任务...
0) 开始新活动
我再次阅读了问题,并理解您需要关于开始活动的建议。所以,开始新活动是可以的,您的主要问题将与其他事情有关(请参见下文)。
但让我们谈谈开始另一个数据。使用片段并不能解决您的任务,片段有助于不同屏幕的工作。例如,只使用数据刷新作为一种变体。您可以只使用单个活动并仅刷新数据,如果您还添加动画,则看起来会更好,但不如开始活动好。
使用片段可帮助您进行不同的屏幕操作。也许,回答您的问题-这将是最合适的解决方案。您只需使用单个活动-PostActivity和几个片段-FragmentMainPost、FragmentRelated-它们将通过从相关帖子中进行选择而相互替换。
1) 返回问题
假设用户点击了一个新活动,我们加载了新数据。这很好,当用户点击超过100个活动并接收大量信息时,这也很好。但是,主要问题在于返回(还有关于缓存的另一个问题,但现在先不管它)。
大家都知道,在堆栈中保存大量活动是一个坏主意。因此,对于我的每个应用程序,我们都会在这个活动中重写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));
}
结果
我发现这是这项任务的最佳解决方案。因为每次我们只处理单个活动!
PostActivity
的活动,它包含PostFragment
,然后创建一个接口来替换活动中的片段。你对此有什么想法? - MAY3AMCheeseListFragment
到CheeseDetailsActivity
,对吧?但是如果你想去另一种奶酪!! 就需要按返回键并回到列表片段!但在我的应用中,我有详细信息(芝士:D)的列表在Details Activity中!所以应该再次将用户发送到DetailsActivity!!明白了吗?;) - MAY3AM