멤버 변수 대 조각의 setArguments
Fragments (특히 DialogFragment ) 에 대한 Android 참조 에서 내가 기대했던 것과 다른 몇 가지 작업을 수행한다는 것을 알았습니다.
1). public static foo newInstance()
생성자보다는 메서드를 사용하십시오 .
2). 멤버 변수가 아닌 setArguments를 사용하여 onCreateDialog에 값을 전달합니다.
리플렉션을 사용할 때 newInstance가 선호되는 것으로 읽었습니다. 그러나 나는 그들이 번들을 통해 매개 변수를 전달하는 이유를 정말로 이해하지 못합니다. 멤버 변수를 사용하는 것이 더 안전하고 (지도에서 가져 오는 데 문자열을 사용하지 않음) 오버 헤드가 적습니다.
이견있는 사람?
나는 또한 이것을 우연히 발견하고 Bundle
인스턴스 필드에 대한 인수를 사용하여 몇 가지 이점을 발견했습니다 .
Bundle
Android 시스템 에있는 경우이를 알고Fragment
있고 필수 매개 변수 / 기본 생성자 및 일반적인 수명주기 메서드를 사용하여 생성 및 삭제할 수 있으며 인수 번들을 다시 전달하면됩니다. 이렇게하면 메모리가 부족하거나 방향이 변경 될 때 인수가 손실되지 않습니다 (회전 속도가 낮은 에뮬레이터에서 개발 한 후 실제 장치에 처음 배포 할 때 종종 저를 때립니다).레이아웃에 포함 된 그대로 의 추가 기능
Bundle
을 그대로 전달할 수 있습니다 . 내가있을 때 예를 들어, 나는 종종 이것을 사용 표시 • 그래도 "전체 화면"일부 ID를 필요로 (또는 URI가) / 할 디스플레이로 알고. 나는 때때로 그것을 전달하기 전에 (또는 사본) 에 더 많은 것을 추가 합니다.Activity
Fragment
Activity
Fragment
ContentProvider
Bundle
@Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { // not a re-creation final Bundle args = new Bundle(getIntent().getExtras()); args.putInt(CoverImageFragment.BACKGROUND_RESOURCE, android.R.color.black); final Fragment fragment = CoverImageFragment.newInstance(args); getSupportFragmentManager() .beginTransaction() .add(android.R.id.content, fragment) .commit(); } }
그것은 개발의 길을 계속
Fragment
에 가까운Activity
, 즉Bundle
"입력 매개 변수, 예외없이"로한다.
언급 한 단점은 다음과 같습니다.
난 당신이 가능성이 가장 높은 쿼리되지 않기 때문에 오버 헤드가 최소한의 생각
Bundle
, 꽉 루프에서 그렇게 한번 밖으로 인수 데이터를 가져 오는onCreate()
,onViewCreate()
등이 나쁘지 않다.유형 안전성을 위해
Bundle
모든 다른getXXXX()
방법이 있으며 무언가가 누락되었거나 선택 사항 인 경우 기본값을 제공하는 오버로드도 있습니다. :)
에 관해서는 newInstance()
방법, 나는 캡슐화하는 쉬운 방법으로 그들의 생각 new
과 setArguments()
내에 대한 호출을 Fragment
; 나는 때때로 추가로 제공 MyFragment newInstance(String singleIdOfWhatToDisplay)
모두 만듭니다 Bundle
와 Fragment
한 번에 반환 준비 - 투 - 이동 Fragment
인스턴스를.
나는 이것이 매우 혼란스러운 문제라는 것을 알았습니다 (Android 환경을 뒤덮는 많은 문제 중 하나).
setArguments()
프래그먼트에 사용할 수있는 매개 변수없는 생성자가 있어야하는 Android의 매우 도움이되지 않는 문제에 대한 해결 방법입니다.
혼란 스러웠습니다. 첫째, 당신이 자연스럽게에서 오버라이드 (override) 방법 Fragment
(예를 들면 onCreate
, onCreateView
) 수신 Bundle
나타내는 매개 변수 savedInstanceState
당신의를 Fragment
. 이 인스턴스 상태 는를 통해 저장 setArguments()
하고 검색 하는 값과 관련이없는 것으로 보입니다 getArguments()
. 둘 다를 사용하고 Bundle
, 둘 다 Bundles
동일한 재정의 된 메서드 내에서 액세스 할 가능성이 높으며 서로 관련이 없습니다.
둘째, Android가 setArguments()
. Android는 매개 변수없는 생성자를 호출하여 Fragment
on rotate 를 다시 빌드 하지만 분명히이 생성 setArguments()
될 때 마지막으로 호출 된 메서드 를 호출 Fragment
합니다.
어 ????
놀랍지 만 사실입니다. 이 만드는 모든 Bundles
과 setArguments()
광기 매개 변수-이하의 필요성을 보상하기 위해 존재하는 Fragment
생성자입니다.
요컨대, 정적 newInstance
메서드를 사용하여 Fragment
.
public MyFragment() {
//satisfy Android
}
public static MyFragment newInstance(long record_id) {
Log.d("MyFragment", "Putting " + record_id + " into newInstance");
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putLong("record_id", record_id);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* Perform an immediate check of arguments,
* which ARE NOT the same as the bundle used
* for saved instance state.
*/
Bundle args = getArguments();
if(args != null) {
record_id = args.getLong("record_id");
Log.d("MyFragment", "found record_id of " + String.valueOf(record_id));
}
if(savedInstanceState != null) {
//now do something with savedInstanceState
}
}
저는 Android 프로그래밍을 처음 접했지만 이것이 현재 문제에 대한 이해입니다.
Fragments의 생성자는 매개 변수를 가질 수 없습니다 . 활동이 일시 중지되면 조각이 해제 될 수 있습니다. 활동이 재개되기 전에 시스템은 생성자를 호출하는 새 버전의 Fragment를 만듭니다. 기본이 아닌 생성자가 사용되는 경우 Android는 Fragments 생성자에 대한 인수의 유형과 값이 무엇인지 어떻게 알 수 있습니까?
I don't believe that bundle is released. The bundle is kept around precisely so that it can be passed back to your Fragment after it has been recreated with the default constructor.
Philipp Reichart eluded to this in his post (actually more than eluded.)
Just want to add one more drawback to arguments is that you have to dynamically create fragments. As arguments does not work very well if you creating from the xml. And I really hate that.
참고URL : https://stackoverflow.com/questions/6677136/member-variables-vs-setarguments-in-fragments
'Nice programing' 카테고리의 다른 글
DLL을 만들 때 모든 기호 내보내기 (0) | 2020.11.18 |
---|---|
SQL Server 2008 Developer를 설치할 때 사용할 계정 (0) | 2020.11.18 |
iOS5 NSURLConnection 메서드는 더 이상 사용되지 않습니다. (0) | 2020.11.18 |
R로 압축하거나 열거 하시겠습니까? (0) | 2020.11.18 |
캐싱이란 무엇입니까? (0) | 2020.11.18 |