Android - 如何仅初始化滑动菜单一次

3
我正在我的项目中使用这个滑动菜单。 https://github.com/jfeinstein10/SlidingMenu 我正在将此菜单添加到所有的活动中。这个滑动菜单在打开时调用一个片段。如何防止为每个活动创建多个片段,并在后台堆栈中调用已经创建的片段?
我的每个活动都扩展了我的BaseActivity,并且我正在BaseActivity中像这样初始化滑动菜单。
getSupportFragmentManager()
    .beginTransaction().replace(R.id.detail, new DetailFragment())
    .commit();

谢谢

1个回答

1
我建议只实现一个活动,并在内容框架中替换各种片段。你需要知道,这个例子包含了很多方法,你应该选择其中的一种 ;)
因此,拥有一个菜单和内容片段,你可以按照以下方式开始(也可参考 ResponsiveUIActivity )。
public class StartActivity extends SlidingFragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        Fragment contentFragment = InitialFragment()

        getSupportFragmentManager().beginTransaction()
           .replace(R.id.content_frame, contentFragment).commit();

        getSupportFragmentManager().beginTransaction()
           .replace(R.id.menu_frame, new MenuFragment()).commit();

        ...
    }

    public void switchContent(final Fragment fragment) {
        // replace fragment in content frame
        ...
    }

在菜单片段中,您可以根据用户的选择创建新的片段(与 BirdMenuFragment 进行比较):
public class MenuFragment extends ListFragment {

    @Override
    public void onListItemClick(ListView lv, View v, int position, long id) {
        Fragment newContent = null;

        switch (position) {
            case 1 : new ThisFragment();
                     break;
            case 2 : new ThatFragment();
                     break;
            case 3 : new AnotherFragment();
                     break;
        }

        if (newContent != null) switchFragment(newContent);
    }

    private void switchFragment(Fragment fragment) {
        // call StartActivity.switchContent
        ...
    }

最后,活动和菜单片段之间的粘合剂是MenuFragment.switchFragment(Fragment fragment)StartActivity.switchContent(final Fragment fragment),而菜单片段方法调用活动方法以替换内容帧中的内容片段(请参见示例中的BirdMenuFragmentResponsiveUIActivity类)。
这只是您如何实现SlidingMenu以及如何在内容框架中替换片段的概述。当然还有一些挑战需要应对。
无论如何,我希望我能帮上一点忙...干杯!

能否请您解释得更详细一些呢 :) 这里的newFragment是什么,如何替换内容框架中的片段。 - dracula
1
看这个:https://github.com/jfeinstein10/SlidingMenu/blob/master/example/src/com/slidingmenu/example/fragments/ResponsiveUIActivity.java,用于`switchContent()`;还有这个:https://github.com/jfeinstein10/SlidingMenu/blob/master/example/src/com/slidingmenu/example/fragments/BirdMenuFragment.java,用于`switchFragment()`。另外,我修复了这个:上面的`new contentFragment应该没有new。你说的newFragment`是什么意思?我没有使用过。 - Trinimon
好的,我现在更明白了。在我的代码中,我没有不同的片段(fragments),而是有活动(activities)。例如,ListActivity 继承自 BaseActivity,那么我该如何在 ListActivity 中切换内容呢? - dracula
与其在上面的case语句中切换片段,您当然也可以为活动启动意图 - 或者混合使用两者,例如case 2:Intent intent = new Intent(...); ... startActivity(intent); break;。但是,使用片段绝对是推荐的方法。如果您有活动并且希望在所有活动中都有SlidingMenu,则必须在所有活动中实例化SlidingMenu - 最好在BaseActivity中实现一次。但这有缺点,例如在您想要向菜单填充任何信息(例如指示器)的情况下。 - Trinimon
我已经尝试过了。但是如何在switchContent函数中更改内容(用于活动)?在这些示例中,它们替换的是旧片段而不是活动。 - dracula
如果您使用意图来启动新活动,则不需要switchContent()方法。因此,查看上面的代码,您还可以在那种情况下添加returncase 2 : Intent intent ...; return;switchFragment()用于替换内容框架中的片段(请参见https://github.com/jfeinstein10/SlidingMenu/blob/master/example/res/layout/content_frame.xml中的布局),假设您仅使用一个活动,并在该活动内切换多个片段(即`StartActivity`)。您可以混合使用这两种方法,但是使用意图启动时,不涉及`switchContent()`。 - Trinimon

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