ProgramingTip

딜레마 : 프래그먼트와 활동을 사용하는 경우 :

bestdevel 2020. 9. 29. 08:11
반응형

딜레마 : 프래그먼트와 활동을 사용하는 경우 :


Activities애플리케이션의 단일 화면을 사용하도록 설계 가능한 Fragments내부에 구성되어 있고 가능한 UI 레이아웃으로 설계 하고 있습니다.

얼마 만해도 개발해야하고 애플리케이션을 개발했습니다. Activity응용 프로그램의 내 화면을 나타 내기 위해 만들고 ViewPager또는에 대해 조각를 사용했습니다 Google Maps. ListFragment여러 번 발명 할 수 있는 또는 다른 UI를 거의 만들 수 있습니다.

최근에 나는 단지 2가 포함 된 프로젝트에 발견 Activities하나는이다 SettingsActivity다른 하나는입니다 MainActivity. 의 레이아웃은 MainActivity많은 숨겨진 전체 화면 UI 조각으로 채워 하나만 표시됩니다. 에서 Activity논리 FragmentTransitions응용 프로그램의 다른 화면 사이.

이 접근 방식에 대해 제가 좋아하는 점은 응용 프로그램이 사용하기 때문에 ActionBar그대로 유지되고 화면 애니메이션과 함께 움직이지 않는다는 것입니다 Activity. 이렇게하면 화면 전환에보다 유창한 느낌을줍니다.

그래서 제가 요청하는 것은 주제에 대한 현재 개발 방식을 공유하는 것입니다. 처음에는 의견 의견 질문처럼 보일 수있는 Android 디자인 및 아키텍처 질문으로 볼 수 있습니다. 의견 기반 하나.

UPDATE (2014 년 1 월 5 일) 에 의해이 프리젠 테이션 테이션에 이어 에릭 버크 에서 광장 (. 내가 말을 안드로이드 개발자를위한 유용한 유용한 도구의 많은 훌륭한 프리젠 테이션입니다 그리고이 광장에 어떤 오전 식 으로든 관련이없는 광장)

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

지난 몇 달 동안의 개인적인 경험을 통해 애플리케이션을 구성하는 가장 좋은 방법은 애플리케이션의 흐름구성하는 모든 조각 그룹 을 하나의 Activity. 따라서 기본적으로 Activities응용 프로그램에서 흐름 수 와 수를 사용 합니다. 이렇게하면 작업의 화면에서 유지되는 모든 흐름을 사용할 수 있습니다. Eric Burke가 말하고 내가 알게 된 Activities것처럼 가능한 한 적게 사용한다는 철학은 그가 "신"이라고 부르는 활동을 엉망으로 만들기 때문에 모든 상황에 적용 할 수있는 것은 아닙니다.


전문가는 당신을 말할 것입니다 : "나는 사용 여부를 알 수 Activity또는를 Fragment". 처음에는 많은 의미가 없지만 시간이 지나면 실제로 필요한지 여부를 알 수 있습니다 Fragment.

저에게 매우 도움이되는 좋은 방법이 있습니다. 딸에게 뭔가를 설명하려고 할 때 이런 일이 있습니다.

즉, 화면을 물질 상자를 상상해. 이 상자에 다른 화면을로드 할 수 있습니까? 새 상자를 사용하는 경우 첫 번째 상자에서 여러 항목을 복사해야합니까? 대답이 예 이면를 사용 Fragments합니다. 루트 Activity가 모든 복제 요소를 보유 할 수 있기 때문에 생성 시간을 절약 할 수 있기 때문에 일부만 교체 할 수 있기 때문 입니다.

그러나 항상 용기 ( ) 가 필요하다는 것을 잊지 않습니다. 구별되는Activity부품이 분산됩니다. 그래서 내부에 부품이있는 하나의 상자.

상자를 오용하지 마십시오. Android UX 전문가는 ( 카테고리가있는 탐색 창을 다룰 때와 같이) Activity사용하는 대신 명시 적으로 다른 것을로드해야하는시기를 조언합니다 (YouTube에서 사용할 수 있음 Fragment). 에 익숙해지면 Fragments모든 동영상을 볼 수 있습니다. 더욱이 그들은 필수 자료입니다.

지금 당장 UI를보고 Activity또는 필요한지 알아낼 수 Fragment있습니까? 새로운 관점을 얻었 었습니까? 당신이 그랬다고 생각합니다.


내 철학은 다음과 가변합니다.

절대적으로 필요한 경우에만 활동을 만듭니다. 많은 조각 트랜잭션을 커밋하는 데 사용할 수있는 백 스택을 사용하여 앱에서 가능한 한 약간의 약간을 만들려고합니다. 또한 다양한 프래그먼트 상관 통신은 활동간에 데이터를주고받는 것보다 훨씬 저렴합니다.

활동 전환은 비용이 많이 들죠? 나는 그렇게 믿는다-이전 활동을 파괴 / 일시 중지 / 중지하고 스택에 푸시 한 다음 새 활동을 생성 / 시작 / 재개해야하기 때문입니다.

파편이 소개 된 이후로 제 철학입니다.


음, (구글의 강의 아마도에 따라 여기 이 가능 때마다 유지하고 제어하는 코드를 더 쉽게, 당신은, 조각을 사용하는 것이 좋습니다, 내가 기억하지 않습니다).

일부 경우에는 프래그먼트를 호스팅하는 활동이 그들 사이를 탐색 / 통신해야하기 때문에 너무 복잡하게 할 수 있습니다.

자신에게 가장 스스로 결정해야한다고 생각합니다. 일반적으로 활동을 조각으로 변환하는 것이 그리 어렵지 않습니다.

이 딜레마에 대한 게시물을 여기 에 작성했습니다 .


모든 경우에서 활동보다 조각을 선호하는 이유.

  • 활동은 비싸다. 프래그먼트에서는 뷰와 속성 상태가 분리됩니다. 프래그먼트가에있을 때마다 backstack뷰가 삭제됩니다. 따라서 활동보다 훨씬 더 많은 조각을 쌓을 수 있습니다.

  • Backstack시장 조작. 를 사용하면 FragmentManager모든 프래그먼트를 지우고 프래그먼트 더 많이 삽입하는 것이 있습니다. 그러나 활동의 경우라면 조작하는 것이 악몽이 될 것입니다.

  • 훨씬 예측 가능한 수명주기 . 호스트 활동이 재활용되지 않는 한. 백 스택의 조각은 재활용되지 않습니다. 따라서 FragmentManager::getFragments()특정 Fragment를 찾는 데 사용할 수 있습니다.


Jetpack 이후 단일 활동 앱 이 선호되는 아키텍처입니다. 특히 탐색 아키텍처 구성 요소에 유용합니다 .

출처


제 생각에는 실제로 관련이 없습니다. 중요한 할 핵심 요소는

  1. UI의 일부 (예 : 메뉴)를 자주 쓰는데?
  2. 태블릿 용 앱인가요?

프래그먼트의 주요 용도는 다중 창 활동을 빌드하는 것 태블릿 / 전화 반응 형 앱에 적합합니다.


활동은 의도를 통해 공유하고 시작할 수있는 응용 프로그램의 블록 / 구성 요소라는 것을 잊지 마십시오! 따라서 애플리케이션의 각 활동은 한 가지 종류의 작업 만 해결해야합니다. 응용 프로그램에 작업이 하나만 있다면 필요한 경우 하나의 활동과 많은 조각이 필요하다고 생각합니다. 물론 다른 작업을 해결하는 향후 활동에서 조각을 재사용 할 수 있습니다. 이 접근 방식은 작업을 명확하고 논리적으로 분리합니다. 또한 서로 다른 조각 집합에 대해 서로 다른 인 텐트 필터 매개 변수를 사용하여 하나의 활동을 유지할 필요가 없습니다. 요구 사항에 따라 개발 프로세스의 디자인 단계에서 작업을 정의합니다.


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

** 주 활동과이 활동을 동시에 여는 것이 합당한 경우에만 새 활동을 시작하십시오 (여러 창을 고려하십시오).

여러 활동을하는 것이 합리적 일 때의 좋은 예는 Google 드라이브입니다. 주요 활동은 파일 탐색기를 제공합니다. 파일이 열리면 해당 파일을보기위한 새 활동이 시작됩니다. 열린 문서를 닫지 않고 브라우저로 돌아갈 수있는 최근 앱 버튼을 누른 다음 첫 번째 문서와 동시에 다른 문서를 열 수도 있습니다.


내가 한 일 : 가능한 경우 더 적은 조각을 사용합니다. 불행히도 거의 경우에 가능합니다. 그래서 저는 많은 조각과 약간의 활동으로 끝납니다. 내가 깨달은 몇 가지 단점 :

  • ActionBar& 메뉴 : 2 개의 프래그먼트가 다른 제목, 메뉴를
    가질 때 다루기 어려울 것입니다. 예 : 새 조각을 추가 할 때 작업 표시 줄 제목을 변경할 수 있지만 팝시 backstack이전 제목을 복원 할 방법이 없습니다. 이 경우 모든 조각에 툴바가 필요할 수 있지만 더 많은 시간을 소비하게 될 것입니다.
  • 우리가 필요로 할 때 startForResult, 활동은 있지만 조각에는 없습니다.
  • 기본적으로 전환 애니메이션이 없습니다.

이에 대한 내 솔루션은 활동을 사용하여 조각을 내부 래핑 하는 것입니다. 따라서 별도의 작업 표시 줄, 메뉴 startActivityForResult, 애니메이션, ...


fragment오버 액티비티 의 가장 큰 장점은 프래그먼트에 사용되는 코드를 다양한 액티비티에 사용할 수 있다는 것 입니다. 따라서 애플리케이션 개발에서 코드의 재사용 성을 제공합니다 .


에 대한 기본을 제공하는 응용 프로그램 당 하나 개의 활동 사용 fragment용도 fragment, 스크린이 fragments있는 라이트 중량 에 비해 activites단편이다 재사용 단편되어 더욱 적합 전화 및 태블릿 모두 지원 앱


그중 하나를 자유롭게 사용할 수 있습니다.
기본적으로 앱에 가장 적합한 것이 무엇인지 평가해야합니다. 비즈니스 흐름을 관리하는 방법과 데이터 기본 설정을 저장 / 관리하는 방법에 대해 생각하십시오.

Fragments가 가비지 데이터를 저장하는 방법을 생각해보십시오. 조각을 구현할 때 조각으로 채울 활동 루트가 있습니다. 따라서 너무 많은 프래그먼트로 많은 활동을 구현하려는 경우 앱의 성능을 고려해야합니다. 두 가지 컨텍스트 라이프 사이클을 조작 (거칠게 말함)하므로 복잡성을 기억하십시오.

기억하십시오 : 조각을 사용해야합니까? 왜 안돼?

문안 인사.


더 나은 사용자 경험을 위해 Fragments를 사용합니다. 예를 들어 Button이 있고이를 클릭 할 때 웹 서비스를 실행하려는 경우 부모 활동에 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();
}

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

두 번째로 회전하는 동안 쉽게 처리 할 수 ​​있기 때문에 조각을 선호합니다.


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

참고 URL : https://stackoverflow.com/questions/20306091/dilemma-when-to-use-fragments-vs-activities

반응형