android - 예제 - 안드로이드 앱바




딜레마:단편과 활동을 사용해야하는 경우: (9)

Activities 는 내 애플리케이션의 단일 화면을 표현하도록 설계된 반면, Fragments 는 로직이 포함 된 재사용 가능한 UI 레이아웃으로 디자인되었습니다.

얼마 전까지 만해도 개발해야한다고 말한대로 응용 프로그램을 개발했습니다. ViewPagerGoogle Maps 용 단편을 사용하여 애플리케이션 화면을 나타내는 Activity 을 만들었습니다. 필자는 ListFragment 또는 여러 번 재사용 할 수있는 다른 UI를 거의 만들지 않았습니다.

최근에 나는 오직 2 개의 Activities 을 포함하는 프로젝트를 발견했다. 하나는 SettingsActivity 이고 다른 하나는 MainActivity 이다. MainActivity 의 레이아웃에는 숨겨진 전체 화면 UI 조각이 채워지고 하나만 표시됩니다. Acitivty 로직에는 응용 프로그램의 여러 화면 사이에 많은 FragmentTransitions 이 있습니다.

이 접근법에 대해 좋아하는 점은 응용 프로그램이 ActionBar 사용하기 때문에 그대로 유지되고 화면 전환 애니메이션으로 이동하지 않는다는 것입니다. 이는 Activity 전환에서 발생합니다. 이는 화면 전환에보다 유창한 느낌을줍니다.

그래서 내가 묻는 것은이 주제와 관련된 현재의 개발 방식을 공유하는 것입니다. 처음에는 의견을 바탕으로 한 질문처럼 보일 수 있지만 Android 디자인 및 아키텍처 관련 질문으로 보았습니다 ... 실제로는 그렇지 않습니다. 의견을 바탕으로 한 것.

UPDATE (01.05.2014) : Square의 Eric Burke 가 발표 한 내용 (안드로이드 개발자를위한 유용한 도구가 많이 포함 된 훌륭한 프레젠테이션입니다. 그리고 어떤 방식 으로든 Square와 관련이 없습니다)

http://www.infoq.com/presentations/Android-Design/

지난 몇 달간의 개인적인 경험을 통해, 애플리케이션을 만드는 가장 좋은 방법은 애플리케이션의 흐름 을 표현하고 모든 조각을 하나의 Activity 에 표시하는 조각 그룹을 만드는 것입니다. 따라서 기본적으로 응용 프로그램에서 흐름 수와 동일한 수의 Activities 을 갖게됩니다. 그런 식으로 액션 바는 모든 플로우의 화면에 그대로 유지되지만, 많은 의미를 갖는 플로우를 변경하면 다시 생성됩니다. 에릭 버크 (Eric Burke)가 말했듯이 나는 가능한 한 적은 수의 Activities 을 사용한다는 철학이 모든 상황에 적용 가능하지 않다. 왜냐하면 그가 "하느님"활동이라고 불리는 것에 혼란을 야기하기 때문이다.


그것은 당신이 실제로 만들고 싶은 것에 달려 있습니다. 예를 들어, navigation drawer 은 조각을 사용합니다. 탭은 fragments 도 사용합니다. 또 다른 좋은 구현은 listview 가있는 곳입니다. 휴대 전화를 회전하고 행을 클릭하면 활동이 화면의 나머지 절반에 표시됩니다. 개인적으로, 나는 더 전문적이기 때문에 fragmentsfragment dialogs 를 사용합니다. 또한 회전시 더 쉽게 처리됩니다.


글쎄, 구글의 강의에 따르면 (아마도 here 기억이 안납니다.) 코드를 유지 관리하고 관리하기가 쉽기 때문에, 가능할 때마다 단편을 사용하는 것을 고려해야합니다.

그러나 어떤 경우에는 조각을 호스팅하는 활동이 탐색 및 통신해야하기 때문에 너무 복잡해 질 수 있다고 생각합니다.

나는 너에게 최선의 것을 결정해야한다고 생각한다. 일반적으로 활동을 조각으로 변환하거나 그 반대로 전환하는 것은 그리 어렵지 않습니다.

나는이 딜레마에 관한 글을 here 에서 만들었 here . 만약 당신이 좀 더 읽고 싶다면.


내가 더 나은 사용자 경험을 위해 조각을 사용합니다. 예를 들어 Button이 있고 그것을 클릭 할 때 webservice라고 말하면, 부모 Activity에 Fragment를 첨부합니다.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

그렇게하면 사용자는 다른 활동으로 이동할 필요가 없습니다.

둘째, 회전 중에 쉽게 처리 할 수 ​​있기 때문에 Fragments를 선호합니다.


내가 한 일 : 가능한 경우 적은 조각을 사용하십시오. 불행히도 거의 모든 경우에 가능합니다. 그래서 나는 많은 파편들과 약간의 활동들로 끝납니다. 실현 한 몇 가지 단점 :

  • ActionBar & Menu : 두 조각의 제목, 메뉴가 다른 경우
    취급하기가 어렵습니다. 예 : 새 프래그먼트를 추가 할 때 작업 표시 줄 제목을 변경할 수 있지만, backstack 에서 팝하면 이전 타이틀을 복원 할 수 없습니다. 이 경우 모든 조각에 툴바가 필요할 수도 있지만, 나를 믿으면 더 많은 시간을 보낼 것입니다.
  • startForResult 가 필요할 때, 액티비티에는 조각이 없다.
  • 기본적으로 전환 애니메이션이 없습니다.

내 솔루션은 내부에 조각을 래핑 하는 활동을 사용하고 있습니다. 그래서 우리는 별도의 액션 바, 메뉴, startActivityForResult , 애니메이션, ...


당신이 깨닫는 것보다 더 많은 것이 있습니다. 시작된 활동이 암시 적으로 호출 활동을 파괴하지 않는다는 것을 기억해야합니다. 물론, 사용자가 버튼을 클릭하여 페이지로 이동하고, 해당 페이지의 활동을 시작하고 현재 페이지를 파괴하도록 설정할 수 있습니다. 이로 인해 많은 오버 헤드가 발생합니다. 내가 줄 수있는 최고의 가이드는 다음과 같습니다.

** 주요 활동과이 활동을 동시에 열어 두는 것이 의미가있는 경우에만 새 활동을 시작하십시오 (여러 창에 대해 생각하십시오).

여러 활동을하는 것이 바람직한 경우의 좋은 예는 Google 드라이브입니다. 주요 활동은 파일 탐색기를 제공합니다. 파일이 열리면 새 활동이 실행되어 해당 파일을 봅니다. 최근 응용 프로그램 버튼을 누르면 열려있는 문서를 닫지 않고 브라우저로 돌아가서 다른 문서를 첫 번째 문서와 평행하게 열 수 있습니다.


애플리케이션 당 하나의 액티비티를 사용하여 fragment 사용을위한 기초 제공 스크린 용 fragment , fragments라이트에 비해 라이트 웨이트재사용 가능한 파편은 휴대 전화 및 태블릿 모두를 지원하는 애플리케이션에 더 적합


왜 모든 케이스에서 활동보다 단편을 선호합니까?

  • 활동이 비쌉니다. Fragment에서는 뷰와 속성 상태가 분리되어 있습니다. 조각이 backstack 있을 때마다 뷰가 삭제됩니다. 따라서 Activity보다 더 많은 Fragments를 스택 할 수 있습니다.

  • Backstack 조작. FragmentManager 사용하면 모든 Fragments를 지우고, Fragment 등보다 더 많이 삽입 할 수 있습니다. 그러나 활동을 위해, 그것들을 조작하는 것은 악몽 일 것입니다.

  • 예측 가능한 수명주기 . 주최자 활동이 재활용되지 않는 한. 백 스택의 파편은 재활용되지 않습니다. 따라서 FragmentManager::getFragments() 를 사용하여 특정 Fragment (권장하지 않음 FragmentManager::getFragments() 를 찾을 수 있습니다.


전문가가 다음과 같이 말합니다. "UI가 표시되면 Activity 또는 Fragment 사용 여부를 알 수 있습니다." 처음에는 이것이 의미가 없지만 시간이 지나면 Fragment 이 필요한지 여부를 실제로 알 수 있습니다.

나는 나를 위해 매우 도움이되는 좋은 습관이있다. 딸에게 뭔가 설명하려고하는 동안 나에게 일어났다.

즉, 화면을 나타내는 상자를 상상해보십시오. 이 상자에 다른 화면을로드 할 수 있습니까? 새 상자를 사용하는 경우 첫 번째 상자에서 여러 항목을 복사해야합니까? 대답이 '예'인 경우 루트 Activity 는 복제 된 요소를 모두 포함 할 수 있으므로 Fragments 만들기에 시간을 절약 할 수 있으므로 Fragments 을 사용해야하며 상자의 일부만 대체 할 수 있습니다.

그러나 상자 상자 ( Activity )가 항상 필요하거나 부품이 분산된다는 사실을 잊지 마십시오 . 내부에 부품이 하나있는 상자.

상자를 오용하지 않도록주의하십시오. 안드로이드 UX 전문가는 (범주가있는 탐색 드로어를 다룰 때와 같이) Fragment 을 사용하는 대신 다른 Activity 명시 적으로로드해야 할 때 (YouTube에서 찾을 수 있음) 조언합니다. Fragments 익숙해지면 모든 비디오를 볼 수 있습니다. 더 중요한 것은 필수적인 자료입니다.

지금 당신의 UI를보고 ActivityFragment 가 필요한지 알아낼 수 있습니까? 새로운 관점을 얻었습니까? 나는 네가 한 것 같아.


활동에 대한 fragment 의 한 가지 큰 이점은 fragment 에 사용되는 코드를 다른 활동에 사용할 수 있다는 것입니다. 따라서 응용 프로그램 개 _시 코드의 재사용 가능성 을 제공합니다.





architecture