如何正确管理android中的片段?

how to manage the fragments in android correctly?

我遇到过很多不同的代码,每个程序员都有自己的方式。我对一件事产生了误解。它碎片。我遇到了这段代码:

    public static final int FRAGMENT_MAIN_MENU = 1;
    public static final int FRAGMENT_CHOICE = 2;
    public static final int FRAGMENT_CHOICE_TYPE = 3;
    public static final int FRAGMENT_CHOICE_TIME = 4;
................
public void setFragment(int fragment) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

        switch (fragment) {
            case FRAGMENT_MAIN_MENU:
                ft.replace(R.id.activity_main_frame, new MainMenuFragment());
                break;
            case FRAGMENT_CHOICE:
                ft.replace(R.id.activity_main_frame, new ChoiceFragment());
                break;
            case FRAGMENT_CHOICE_TYPE:
                ft.replace(R.id.activity_main_frame, new ChoiceKmFragment());
                break;
            case FRAGMENT_CHOICE_TIME:
                ft.replace(R.id.activity_main_frame, new ChoiceTimeFragment());
                break;
            default:
                return;
        }

        ft.addToBackStack(null);
        ft.commit();
    }

    public void setFragment(Fragment fragment) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

        ft.replace(R.id.activity_main_frame, fragment);

        ft.addToBackStack(null);
        ft.commit();
    }

我刚遇到这段代码:

public void pushFragment(Fragment fragment, boolean animate) {
        fragmentList.add(fragment);
        replaceFragment(fragment, animate ? -1 : 0);
    }

    public void pushFragment(Fragment fragment) {
        pushFragment(fragment, true);
    }

public void popFragment() {
    Fragment fragment = fragmentList.get(fragmentList.size() - 2);
    replaceFragment(fragment, 1);
    fragmentList.remove(fragmentList.size() - 1);
}

在我的申请中我这样做了:

private void selectItem(int position) {
        Bundle arguments;
        Fragment fragment;
        switch (position) {
            case CITY_GUESTS:
                fragment = new GuestsList();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_LINK, getString(R.string.city_guest_link));
                arguments.putString(ARGUMENT_PAGE_HOTEL, "city");
                fragment.setArguments(arguments);
                setFragment(fragment);
                break;
            case HOLIDAY_GUESTS:
                fragment = new GuestsList();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_LINK, getString(R.string.holiday_guestlist_link));
                arguments.putString(ARGUMENT_PAGE_HOTEL, "holiday");
                fragment.setArguments(arguments);
                setFragment(fragment);
                break;
            case HOTEL_LOAD_ITEM:
                fragment = new HotelLoadTable();
                setFragment(fragment);
                setTitle("Загрузка отелей");
                break;
            case HOTEL_LOAD_ITEM_2:
                fragment = new EstimatedLoad();
                setFragment(fragment,"estimatedLoad");
                setTitle("Загрузка за период");
                break;
            case MONEY_ITEM:
                fragment = new Money();
                setFragment(fragment);
                setTitle("Касса");
                break;
            case INFO:
                fragment = new StatusInfo();
                setFragment(fragment);
                setTitle("Статус инфо");
                break;
            case EMPLOYEE_ITEM:
                fragment = new EmployeessList();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_LINK, getString(R.string.employee_list_link));
                fragment.setArguments(arguments);
                setFragment(fragment);
                break;
            case CITY_CONF:
                fragment = new PagerCalendarContainer();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_PAGE_HOTEL, "city");
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("Конференции City");
                break;
            case HOLIDAY_CONF:
                fragment = new PagerCalendarContainer();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_PAGE_HOTEL, "holiday");
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("Конференции Holiday");
                break;
            case CITY_SURVEY:
                fragment = new SurveyGuestsList();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_PAGE_HOTEL, "city");
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("City survey");
                break;
            case HOLIDAY_SURVEY:
                fragment = new SurveyGuestsList();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_PAGE_HOTEL, "holiday");
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("Holiday survey");
                break;
            case CITY_LOGBUK:
                fragment = new PagerLogbookContainer();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_PAGE_HOTEL, "city");
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("Логбук City");
                break;
            case HOLIDAY_LOGBUK:
                fragment = new PagerLogbookContainer();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_PAGE_HOTEL, "holiday");
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("Логбук Holiday");
                break;
            case CALL:
                fragment = new CallRequest();
                setFragment(fragment);
                setTitle("Запросить звонок");
                break;
            case LOGOUT:
                fragment = new LogOut();
                arguments = new Bundle();
                arguments.putString(ARGUMENT_LOGIN, global_login);
                fragment.setArguments(arguments);
                setFragment(fragment);
                setTitle("Logout");
                break;
        }

    }

    private void setFragment(Fragment fragment) {
        fManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        fManager.beginTransaction().replace(R.id.container, fragment).commit();
    }
    private void setFragment(Fragment fragment,String tag) {
        fManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        fManager.beginTransaction().replace(R.id.container, fragment,tag).commit();
    }

如何使用片段?有什么模式或方法可以轻松做到这一点?避免问题和困难? Google 显示了如何操作?如果我有很多件,我必须安装和卸载它们,它们有不同的设置,等等。并可能有一个特殊的图书馆?请分享信息!

您的示例都是有效的方法(基本上使用 Android 事务来替换片段)。您正在将常用操作封装到方法中,这总是好的 OO。

Google 在此处显示了一篇名为“building flexible ui”的类似文章: http://developer.android.com/training/basics/fragments/fragment-ui.html

至于使用片段时的一般模式,我尝试将片段视为可以重复使用或可以逻辑分组的'section of a screens ui'。

在决定如何在关联活动时组织片段时,我知道有两个(我在 Droidcon 上参加过很多演讲,并且总是描述这些):

  1. 为 UI 中的每个逻辑屏幕创建一个 FragmentActivity,然后使其管理在该屏幕上使用的一个或多个片段。
  2. 为整个应用程序创建一个 activity,然后管理每个片段。

两者都有效,但我通常选择选项 1,为每个 UI 屏幕创建一个 activity,然后让 activity 管理该屏幕上使用的片段。它长得更好,对我来说似乎更 OO。

如果应用程序非常非常紧凑且很小(ui 屏幕不多),我很少使用选项 2。因为它很快变得凌乱。

然后随着更多 UI 屏幕的创建,我为其创建另一个 activity,最后添加该屏幕片段。

虽然您没有特别询问片段之间的通信,但我还发现通过使用 Android 事件总线库之一(Green robot event bus 是我的,我的代码更容易维护最喜欢的,但我也听到了关于 'otto' 的好消息。

通过使用事件总线,您可以通过触发事件轻松地在 fragments/screens 之间进行通信。