조각 만들기 : 생성자 대 newInstance ()
저는 최근에 .NET Framework를 만들 때 String
인수를 전달할 키를 지속적으로 알아야하는 것에 지쳤습니다 . 그래서 난에 대한 생성자를하기로 결정 내 나는 세트에 원하는 매개 변수를 사용하고,에 그 변수를 넣어 것입니다 올바른에 따라서 다른에 대한 필요성을 제거, 키 와 그 키를 알 필요.Bundles
Fragments
Fragments
Bundles
String
Fragments
Activities
public ImageRotatorFragment() {
super();
Log.v(TAG, "ImageRotatorFragment()");
}
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
// Get arguments passed in, if any
Bundle args = getArguments();
if (args == null) {
args = new Bundle();
}
// Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
setArguments(args);
}
그런 다음 평소처럼 그 주장을 뽑습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate");
// Set incoming parameters
Bundle args = getArguments();
if (args != null) {
mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]);
}
else {
// Default image resource to the first image
mImageResourceId = StaticData.getImageIds()[0];
}
}
그러나 Lint는이 문제를 해결하여 Fragment
다른 매개 변수 가 있는 생성자의 하위 클래스가 없어서 @SuppressLint("ValidFragment")
앱을 실행하는 데에도 사용해야 했습니다. 문제는이 코드가 완벽하게 작동한다는 것입니다. ImageRotatorFragment(int imageResourceId)
또는 구식 방법을 사용 ImageRotatorFragment()
하고 setArguments()
수동으로 호출 할 수 있습니다 . Android가 Fragment (방향 변경 또는 메모리 부족)를 다시 만들어야하는 경우 ImageRotatorFragment()
생성자를 호출 한 다음 Bundle
내 값과 함께 동일한 인수를 전달하여 올바르게 설정됩니다.
그래서 저는 "제안 된"접근 방식을 찾고 있었고 매개 변수를 사용 newInstance()
하여 생성하는 데 사용하는 많은 예제를 보았습니다. Fragments
이는 제 생성자와 동일한 작업을 수행하는 것 같습니다. 그래서 나는 그것을 테스트하기 위해 내 자신을 만들었고, Lint가 그것에 대해 징징 대는 것을 빼고 이전과 마찬가지로 완벽하게 작동합니다.
public static ImageRotatorFragment newInstance(int imageResourceId) {
Log.v(TAG, "newInstance(int imageResourceId)");
ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment();
// Get arguments passed in, if any
Bundle args = imageRotatorFragment.getArguments();
if (args == null) {
args = new Bundle();
}
// Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
imageRotatorFragment.setArguments(args);
return imageRotatorFragment;
}
I personally find that using constructors is a much more common practice than knowing to use newInstance()
and passing parameters. I believe you can use this same constructor technique with Activities and Lint will not complain about it. So basically my question is, why does Google not want you to use constructors with parameters for Fragments
?
My only guess is so you don't try to set an instance variable without using the Bundle
, which won't get set when the Fragment
gets recreated. By using a static newInstance()
method, the compiler won't let you access an instance variable.
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
mImageResourceId = imageResourceId;
}
I still don't feel like this is enough reason to disallow the use of parameters in constructors. Anyone else have insight into this?
I personally find that using constructors is a much more common practice than knowing to use newInstance() and passing parameters.
The factory method pattern is used fairly frequently in modern software development.
So basically my question is, why does Google not want you to use constructors with parameters for Fragments?
You answered your own question:
My only guess is so you don't try to set an instance variable without using the Bundle, which won't get set when the Fragment gets recreated.
Correct.
I still don't feel like this is enough reason to disallow the use of parameters in constructors.
You are welcome to your opinion. You are welcome to disable this Lint check, either on a per-constructor or per-workspace fashion.
Android only recreates fragments it kills using default constructor, so any initialization we do in additional constructors will be lost.Hence data will be lost.
ReferenceURL : https://stackoverflow.com/questions/14654766/creating-a-fragment-constructor-vs-newinstance
'programing' 카테고리의 다른 글
jquery가없는 jquery의 'trigger'메소드와 동등한 것은 무엇입니까? (0) | 2021.01.15 |
---|---|
Python 사전 : TypeError : 해시 할 수없는 유형 : 'list' (0) | 2021.01.15 |
DateTime.ParseExact (String, String, IFormatProvider)에 IFormatProvider가 필요한 이유는 무엇입니까? (0) | 2021.01.15 |
Delphi 2006-2010 오류 : "C : \ Users \ Admin \ AppData \ Local \ Temp \ EditorLineEnds.ttr 파일을 만들 수 없습니다." (0) | 2021.01.15 |
GitLab에 릴리스 / 바이너리를 저장하는 방법은 무엇입니까? (0) | 2021.01.15 |