如何正确管理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 上参加过很多演讲,并且总是描述这些):
- 为 UI 中的每个逻辑屏幕创建一个 FragmentActivity,然后使其管理在该屏幕上使用的一个或多个片段。
- 为整个应用程序创建一个 activity,然后管理每个片段。
两者都有效,但我通常选择选项 1,为每个 UI 屏幕创建一个 activity,然后让 activity 管理该屏幕上使用的片段。它长得更好,对我来说似乎更 OO。
如果应用程序非常非常紧凑且很小(ui 屏幕不多),我很少使用选项 2。因为它很快变得凌乱。
然后随着更多 UI 屏幕的创建,我为其创建另一个 activity,最后添加该屏幕片段。
虽然您没有特别询问片段之间的通信,但我还发现通过使用 Android 事件总线库之一(Green robot event bus 是我的,我的代码更容易维护最喜欢的,但我也听到了关于 'otto' 的好消息。
通过使用事件总线,您可以通过触发事件轻松地在 fragments/screens 之间进行通信。
我遇到过很多不同的代码,每个程序员都有自己的方式。我对一件事产生了误解。它碎片。我遇到了这段代码:
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 上参加过很多演讲,并且总是描述这些):
- 为 UI 中的每个逻辑屏幕创建一个 FragmentActivity,然后使其管理在该屏幕上使用的一个或多个片段。
- 为整个应用程序创建一个 activity,然后管理每个片段。
两者都有效,但我通常选择选项 1,为每个 UI 屏幕创建一个 activity,然后让 activity 管理该屏幕上使用的片段。它长得更好,对我来说似乎更 OO。
如果应用程序非常非常紧凑且很小(ui 屏幕不多),我很少使用选项 2。因为它很快变得凌乱。
然后随着更多 UI 屏幕的创建,我为其创建另一个 activity,最后添加该屏幕片段。
虽然您没有特别询问片段之间的通信,但我还发现通过使用 Android 事件总线库之一(Green robot event bus 是我的,我的代码更容易维护最喜欢的,但我也听到了关于 'otto' 的好消息。
通过使用事件总线,您可以通过触发事件轻松地在 fragments/screens 之间进行通信。