0

我有一个包含多个活动的应用程序,每个活动都可能使用多个片段。

一个活动(称为 IBAsTabsActivity)扩展了 SherlockFragmentActivity,我正在使用一些示例代码,其中根据选择的选项卡加载不同的片段。可能的片段之一称为“SearchableListFragment”。这一切都很好。我有一个带有两个按钮的“家”活动,一个带我到 IBAsTabsActivity,另一个带我到 AnAlternativeActivity。如果我按下按钮将我带到 IBAsTabsActivity 并查看几个选项卡 - 然后如果我按下后退按钮,我会直接跳到“主页”。

现在我想让 AnAlternativeActivity 启动并运行。它没有标签,因此不使用任何 Sherlock 代码。相反,我有这个:

public class AnAlternativeActivity extends FragmentActivity implements OnClickListener
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.blank_fragment_holder);

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        SearchableListFragment fb = new SearchableListFragment();
        ft.replace(R.id.fragment_holding_layout, fb);
        ft.addToBackStack("replacingFragmentA");
        ft.commit();
}

这一切都可以正常工作,就像我单击主屏幕上的按钮调用 AnAlternativeActivity,然后我可以正确看到 SearchableListFragment()(在 fragment_holding_layout 内)及其内容。但是现在,如果我单击后退按钮,fragment_holding_layout 中的片段就会消失,但 AnAlternativeActivity 仍在运行。我必须再次按下返回按钮才能退出 AnAlternativeActivity 并返回我的家庭活动。

我可能会编写一些丑陋的代码来解决这个问题——但我怀疑有一种标准的方法来应对这种情况。有任何想法吗?

4

3 回答 3

2

您应该能够使用父活动的概念来轻松解决此问题。您需要做的就是告诉 Android 这HomeActivity是您的父级,AnAlternativeActivity导航将由您处理。在您的AndroidManifest.xml文件中添加android:parentActivityName属性,AnAlternativeActivity如下所示:

<activity
    android:name="com.mick.AnAlternativeActivity"
    android:label="@string/activity_title"
    android:parentActivityName="com.mick.HomeActivity" >
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.mick.HomeActivity" />
</activity>

您需要新设备的常规属性和旧设备的元数据标签。可以在此处找到更多信息:http: //developer.android.com/training/basics/firstapp/starting-activity.html(查看将其添加到清单子标题下)。

于 2013-05-22T19:12:48.330 回答
0

在 AnAlternativeActivity 的 onPause 中,您可以调用finish()来结束它。

public void onPause() {
    super.onPause();
    finish();
}
于 2013-05-22T19:02:37.113 回答
0

您的呼叫ft.addToBackStack("replacingFragmentA");似乎是需要点击“返回”两次的原因。将交易添加到后台堆栈将产生这样的效果:在历史堆栈中添加一个层。

因此,当您第一次按“返回”时,可以说该交易将“撤消”,并将替换您SearchableListFragmentR.id.fragment_holding_layout. 第二次按“返回”将从AnAlternativeActivity后面移动到“家庭”活动。

于 2013-09-02T23:54:12.097 回答