使用导航时,如何使用主/详细信息片段返回父列表活动



我正在学习安卓编程,并且在主/细节片段中遇到向上导航的问题。 为了练习,我正在为我妻子的合唱团的乐谱图书馆整理一个应用程序,以跟踪作曲家的乐谱。 (相当深奥,但如果我能让它工作,我会对 Android 编程有更好的理解。

第一个屏幕是作曲家列表。 从列表中选择一个会在详细片段中显示有关作曲家的详细信息;这工作得很好。

我像这样创建了细节片段:(直接来自 eclipse 提供的模板)

//In ComposerListActivity.java
public void onItemSelected(String id) {
    if (mTwoPane) {
        // In two-pane mode, show the detail view in this activity by
        // adding or replacing the detail fragment using a
        // fragment transaction.
        Bundle arguments = new Bundle();
        arguments.putString(ComposerDetailFragment.ARG_ITEM_ID, id);
        ComposerDetailFragment fragment = new ComposerDetailFragment();
        fragment.setArguments(arguments);
        getFragmentManager()
            .beginTransaction()
            .replace(R.id.composer_detail_container, fragment)
            .commit();
    } ...
}

细节片段显示有关作曲家的信息(姓名、出生/死亡日期、个人简介等),以及一个用于查看该作曲家创作的作品的按钮。 按下该按钮将弹出另一个大纲/细节活动:

    //In ComposerDetailFragment.java
    protected void viewPieces() {
        Intent intent = new Intent(this.getActivity(), PieceListActivity.class);
        intent.putExtra(COMPOSER_ID, this.dataObject.getId());
        this.getActivity().startActivityForResult(intent, VIEW_PIECES_LIST);
    }

这工作正常,并显示该作曲家编写的作品列表。 您可以选择其中一个作品,它会显示有关该作品的信息(标题、零件数、键、页数等)。 如果我从作品中按"返回",它会将我带回选择先前选择的作曲家的作曲家列表。 但是,如果我按"向上"(在操作栏中的图标上),它会将我带到显示空白细节片段的活动(作曲家的 ID 丢失)。 我希望在这种情况下,back和up的功能应该相同 - 它们都应该上升一个级别(对于作曲家列表的曲目列表)。 但是,在手机上,它应该做它正在做的事情(除了保留作曲家 ID,但我怀疑这是一个单独的问题)。

//In PieceListActivity.java
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        // This ID represents the Home or Up button. In the case of this
        // activity, the Up button is shown. Use NavUtils to allow users
        // to navigate up one level in the application structure. For
        // more details, see the Navigation pattern on Android Design:
        //
        // http://developer.android.com/design/patterns/navigation.html#up-vs-back
        //
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

我需要做什么才能完成此操作? 我应该在这里完全放弃向上导航,因为后面似乎在做我想做的事,还是有办法让它做我想做的事? 我在这里能找到的问题/答案似乎都没有解决这种情况,尽管有几个很接近(我似乎被引导到其中的一些

)。

提前谢谢。

ComposerListActivityonItemSelected(String id)

if (mTwoPane) {
    Bundle args = new Bundle();
    args.putString(ComposerDetailFragment.ARG_ITEM_ID, id);
    ComposerDetailFragment fragment = new ComposerDetailFragment();
    fragment.setArguments(args);
    getFragmentManager().beginTransaction().replace(R.id.composer_detail_container, fragment).commit();
}

viewPieces ComposerDetailFragment

Intent i = new Intent(getActivity(), PieceListActivity.class);
intent.putExtra(ARG_ITEM_ID, getArguments().getString(ARG_ITEM_ID));
startActivityForResult(i, VIEW_PIECES_LIST);

onOptionsItemSelected PieceListActivity

case android.R.id.home:
    // Add id of detail fragment as extra to intent on task stack before navigating up
    Intent upIntent = NavUtils.getParentActivityIntent(this);
    String id = getIntent().getStringExtra(ComposerDetailFragment.ARG_ITEM_ID);
    upIntent.putExtra(ComposerDetailFragment.ARG_ITEM_ID, id);
    NavUtils.navigateUpTo(this, upIntent);
    return true;

onCreate ComposerListActivity

String id = getIntent().getStringExtra(ComposerDetailFragment.ARG_ITEM_ID);
if (id != null) onItemSelected(id);

NavUtils.navigateUpFromSameTask(this)创建父Activity的新实例,因此当您点击向上按钮时,您在第一个大纲/细节中保存的任何状态/片段都不会恢复。

如果您使用的是支持库中的ActionBarActivity,则可以调用onPrepareSupportNavigateUpTaskStack来生成您自己的Up堆栈,该堆栈可以包含特定的额外Intent。然后,可以使用该额外内容来恢复片段(即,当您的原始活动检测到额外片段时,它会使用正确的 id 调用onItemSelected)。

仅使用 back(通过 finish() 方法)代替NavUtils.navigateUpFromSameTask(this)的唯一缺点是过渡动画不同,这可能会在注意到此类事情的一小部分用户中引起一些混淆。

最新更新