【问题标题】:how to manage the fragments in android correctly?如何正确管理android中的片段?
【发布时间】:2015-01-07 01:42:20
【问题描述】:

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

    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();
    }

如何处理片段?有什么模式或方法可以轻松做到这一点?避免问题和困难?谷歌在哪里展示了如何做到这一点?如果我有很多块,我必须安装和卸载它们,它们有不同的设置,等等。并且可能有一个特殊的图书馆?请分享信息!

【问题讨论】:

  • “如何使用片段”过于宽泛。您的具体问题是什么?
  • 你到底想要达到什么目的?
  • 有没有什么方法可以安装/卸载fragments,代码最少又好用?有我提出问题的官方示例吗?
  • 我想知道我的三个例子中最正确的那个,还是有另一个例子做同样的事情但更正确
  • 换句话说,是否可以改进我的第三个示例,以及如何改进?

标签: android android-fragments


【解决方案1】:

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

Google 在这里展示了一篇类似的文章,名为“构建灵活的用户界面”: http://developer.android.com/training/basics/fragments/fragment-ui.html

至于使用片段时的一般模式,我尝试将片段视为“屏幕 ui 的一部分”,可以重复使用或可以在逻辑上分组。

在决定在关联活动时如何组织片段时,我知道有两个(我参加了 Droidcon 的许多演示,并且总是被描述):

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

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

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

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

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

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

【讨论】:

  • 这是一个很好的答案。正是我感兴趣的!顺便说一句,我听说过奥托,我将尝试一下。你说了一些让我感兴趣的话,尽管我的英语不好)
  • 很高兴能帮上忙。另外祝 otto 图书馆好运。我现在在所有应用程序中都使用事件总线模式。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多