打开Activity实例

5
我有一个应用程序,保存了帖子信息在一个活动中。在这个活动中,相关的帖子在帖子底部列出。用户点击相关帖子,可以进入帖子活动并查看该帖子的信息以及其他相关帖子。Figure 如图所示,我有一个名为Activity A的活动,它包含帖子及其相关帖子。当用户点击帖子时,我会将用户发送到带有新帖子id的Activity A,并使用新数据填充活动。
但我认为这不是正确的方法!
我应该使用Fragment而不是Activity吗?

如果我是你,我会使用“fragment”(碎片)。因为通常详细页面在应用程序的不同部分重复出现,所以这可以提高代码的重用性。 - Amir
@Amir 是的!我现在正在考虑创建一个名为PostActivity的活动,它包含PostFragment,然后创建一个接口来替换活动中的片段。你对此有什么想法? - MAY3AM
1
@Amir 嗯,我不想在相关项目上单击时将用户发送到活动,我只想让活动使用新数据替换此片段的新实例并将其保存在后退堆栈中。 - MAY3AM
@Amir 这个例子是从CheeseListFragmentCheeseDetailsActivity,对吧?但是如果你想去另一种奶酪!! 就需要按返回键并回到列表片段!但在我的应用中,我有详细信息(芝士:D)的列表在Details Activity中!所以应该再次将用户发送到DetailsActivity!!明白了吗?;) - MAY3AM
是的,在这种情况下,我认为使用Activity更好。 - Amir
显示剩余3条评论
7个回答

1
打开另一个活动实例并将其置于另一个实例之上是导航内容图的最简单方法。用户可以简单地按返回键,回到以前打开的内容,直到用户回到起始活动,然后应用程序关闭。虽然非常简单,但这种方法有两个问题:
  1. 可能会发生许多相同活动的实例在堆栈上,利用大量设备资源,如内存。
  2. 您无法对Activity Stack进行细粒度控制。您只能启动更多活动、完成某些活动或使用意图标志,如FLAG_CLEAR_TOP等。
另一种方法是重用同一活动实例,在其中加载新内容的同时记住已加载的内容历史记录。就像Web浏览器对Web页面URL所做的那样。
思路是保持迄今为止查看的内容的堆栈。加载新内容会向堆栈推送更多数据,而返回则从堆栈中弹出顶部内容,直到堆栈为空。活动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

我会选择:

根据复杂度选择activity/fragment,使用以下内容:

  • 带有自定义扩展卡片视图的水平recyclerview
  • 在这个扩展卡片视图内部,再嵌套一个垂直recyclerview :)

0

以下是您可以尝试的方法。

创建一个PostActivity,它是片段的外壳。在此活动中,您只需使用FragmentTransaction替换片段即可。

现在,您的PostActivity可以有一个PostFragment,其中将保存帖子和相关帖子。现在,在单击帖子时,您可以使用postID作为包发送到新片段,将PostFragment替换为PostDetailFragmentPostDetailFragment现在将根据id显示详细信息。

请查看这里:http://www.vogella.com/tutorials/Android/article.html#components_fragments


0
通过查看图片,我会这样实现:创建一个带有底部列表视图的活动,用于显示您的项目,并在顶部放置一个FrameLayout来容纳片段。当用户单击任何列表项时,我会在活动中加载相应的片段。

0
一切都取决于您想要实现什么。当用户在下降几个级别后触摸返回按钮时,您期望发生什么?如果您希望应用程序退出,无论他们深入了多少次序列,那么我认为最好的解决方案是简单地使用新数据重新加载相同的活动并使受影响的视图失效。如果您需要返回按钮将用户带回以前的数据,则下一个问题是,您是否正在跟踪过去的数据面包屑。如果是这样,那么只需拦截返回按钮并为您的堆栈中有数据时加载先前的数据,或者如果到达顶部则退出即可。如果您不想跟踪以前的数据链,那么您可以启动具有相同类但具有新数据的新活动,而不是加载一个新数据的活动。Android会跟踪每个活动,并且每次按返回按钮都会关闭运行的活动并将用户带回上一个活动。活动与片段的选择只取决于你。您可以使用包含要在每个用户操作后更改的数据的片段,在需要时创建新片段,断开以前的片段并连接新片段。您需要做一些额外的工作,以确保返回按钮的正确工作(取决于您希望返回按钮如何行为)。根据我所了解的情况,如果您需要能够返回,则仅具有一个活动并在需要时加载新数据并保持数据更改跟踪会更简单。

0

这可以仅通过使用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

针对这个任务...

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));

   }

结果

我发现这是这项任务的最佳解决方案。因为每次我们只处理单个活动!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接