在使用导航时,如何使用主/明细片段返回父列表活动?

时间:2013-10-25 15:46:29

标签: android android-fragments android-navigation

我正在学习android编程,并且在主/细节片段中导航时出现问题。为了练习,我正在为我妻子的合唱团的乐谱库组合一个应用程序来跟踪作曲家的乐谱。 (非常深奥,但如果我能让它工作,我将对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丢失)。我希望在这种情况下,后退和上升应该起作用 - 它们都应该上升一级(对于作曲家列表中的作品列表)。但是,在手机上,它应该做它正在做的事情(除了保留作曲家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);
}

我需要做些什么来完成这项工作?我应该完全放弃向上导航,因为后面似乎正在做我想要的,或者有没有办法让它做我想要的?我在这里找到的所有问题/答案似乎都没有解决这种情况,尽管有一些问题很接近(我似乎在其中一些问题上被圈起来了)。

提前致谢。

2 个答案:

答案 0 :(得分:1)

onItemSelected(String id)的{​​{1}}:

ComposerListActivity

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(); } 的{​​{1}}:

viewPieces

ComposerDetailFragment的{​​{1}}:

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

onOptionsItemSelected的{​​{1}}:

PieceListActivity

答案 1 :(得分:0)

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

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

仅使用返回(通过finish()方法)代替NavUtils.navigateUpFromSameTask(this)的唯一缺点是转换动画不同,这可能会导致注意该类型的小部分用户之间的混淆事情。