새로운 Android Fragment 인스턴스화 모범 사례


706

응용 프로그램에서 새 조각을 인스턴스화하는 두 가지 일반적인 방법을 보았습니다.

Fragment newFragment = new MyFragment();

Fragment newFragment = MyFragment.newInstance();

두 번째 옵션은 정적 메소드를 사용 newInstance()하며 일반적으로 다음 메소드를 포함합니다.

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

처음에는 새로운 인스턴스 인스턴스를 만들 때 유연성을 제공하기 위해 newInstance () 메서드를 오버로드 할 수 있다는 사실이 주요 이점이라고 생각했지만 조각에 과부하 된 생성자를 만들어서이 작업을 수행 할 수도 있습니다.

내가 뭘 놓 쳤니?

한 방법이 다른 방법에 비해 어떤 이점이 있습니까? 아니면 좋은 습관입니까?


매개 변수가 있으면 선택의 여지가 없으며 여기에서 광범위하게 답변됩니다. 그럼에도 불구하고,이 논점의 논증없는 구성에 대한 의문은 여전히 ​​남아있다.
rds

1
팩토리 패턴과 객체 자체를 인스턴스화하지 않는 호출 클래스가 분리하는 데 도움이되는 방법에 대해 알게 된 후에는 이것이 newInstance () 메소드의 장점이 될 것이라고 생각했습니다. 내가 틀렸어? 나는이 특정한 주장이 이익으로 언급 된 것을 보지 못했다.
모바일 응용 프로그램

답변:


1136

안드로이드가 나중에 프래그먼트를 다시 생성하기로 결정하면 프래그먼트의 인수가없는 생성자를 호출합니다. 따라서 생성자를 오버로드하는 것은 해결책이 아닙니다.

말했듯이 Android에서 조각을 다시 만든 후에 사용할 수 있도록 조각에 물건을 전달하는 setArguments방법 은 번들을 메서드에 전달하는 것입니다.

예를 들어, 조각에 정수를 전달하려면 다음과 같이 사용하십시오.

public static MyFragment newInstance(int someInt) {
    MyFragment myFragment = new MyFragment();

    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    myFragment.setArguments(args);

    return myFragment;
}

그리고 나중에 Fragment에서 다음 onCreate()을 사용하여 해당 정수에 액세스 할 수 있습니다.

getArguments().getInt("someInt", 0);

이 번들은 안드로이드가 조각을 재현 한 경우에도 사용할 수 있습니다.

참고 : setArguments조각이 활동에 첨부되기 전에 만 호출 할 수 있습니다.

이 접근법은 안드로이드 개발자 참조 문서에 설명되어 있습니다 : https://developer.android.com/reference/android/app/Fragment.html


7
@Vlasto 불행히도 정적 메서드는 재정의 할 수 없습니다.
AJD

8
@yydl 나는 여기에 뭔가 빠져 있다고 생각합니다. 어쨌든 여기에서 생성자를 사용할 수 없었습니다. 번들을 생성하고 setArguments ()를 호출하는 코드는 코드에 의해서만 호출되기 때문에 (Android가 파편)?
Mike Tunnicliffe 2014 년

9
@mgibson 당신은 해야한다 당신이 단편 나중에 다시 할 때 데이터를 사용할 수있게하려면 번들을 사용합니다.
yydl 2016 년

114
단편에 대한 인수가없는 생성자를 작성하는 것은 강제로 어느 곳에서나 모든 프로그래밍에서 가장 큰 문제가 될 수 있습니다. 객체 생성 및 초기화에있어 패러다임의 완전한 전환을 강요합니다. Android를 처음 사용하고이 스레드를 우연히 발견 한 경우 위의 답변을 계속해서 반복해서 읽으십시오.
rmirabelle

9
나는 그 주장에 대해 논쟁 할 것이다. 첫째, 형식 안전성은 언어 문제이며 프레임 워크 문제가 아닙니다. 둘째, 프레임 워크는 "당신의 API가 절대로하지 말아야 할 것들"영역으로 나아가고 있습니다. 의회 라이브러리를 조각 생성자로 전달하려면 허용해야합니다. "no-args"생성자 계약은 기본적으로 프래그먼트에서 의존성 주입의 사용을 중지합니다.
rmirabelle

95

newInstance()내가 보는 것을 사용하는 유일한 이점 은 다음과 같습니다.

  1. 프래그먼트가 사용하는 모든 인수를 묶을 수있는 단일 장소가 있으며 프래그먼트를 인스턴스화 할 때마다 아래 코드를 작성할 필요가 없습니다.

    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    args.putString("someString", someString);
    // Put any other arguments
    myFragment.setArguments(args);
  2. 다른 클래스에 충실하게 작동 할 것으로 예상 되는 인수를 알려주는 좋은 방법입니다 (단편 인스턴스에 인수가 번들로 묶여 있지 않은 경우 사례를 처리 할 수 ​​있어야 함).

따라서 정적 newInstance()을 사용하여 조각을 인스턴스화하는 것이 좋습니다.


4
1) 논리를 생성자에 넣는 것과 어떻게 다른가요? 둘 다이 논리를 포함하는 단일 위치입니다. 2) 정적 팩토리의 매개 변수는 생성자의 매개 변수와 어떻게 다른가요? 둘 다 어떤 주장이 예상되는지 말해줍니다. 내 요지는 그것이 다른 패러다임이라는 것이지만, 생성자를 사용하는 것보다 이것에 대한 분명한 이점은 없습니다.
RJ Cuthbertson

2
조각에는 사용자 정의 생성자를 사용할 수 없습니다. 프레임 워크는 조각을 복원하기 위해 no 인수 생성자를 사용합니다.
500865

5
네, 동의합니다. 개념적으로 오버로드 된 생성자를 사용하는 대신 정적 팩토리 패턴을 사용하면 이점이 없으며 그 반대도 마찬가지입니다. 두 지점 모두 두 패턴 모두에서 유효합니다. 다른 것을 사용하는 것의 이점은 없습니다. Android는 정적 팩토리 패턴을 사용하도록 강요하지만 둘 중 하나를 사용하면 이점이 없습니다.
RJ Cuthbertson

pastebin.com/EYJzES0j
RJ Cuthbertson

@RJCuthbertson 정적 팩토리 메소드 클래스서브 클래스 를 작성하고 리턴하는 기능, 즉 상황에 적합한 서브 클래스를 리턴하는 기능이 가능합니다.
urgentx

62

또 다른 방법이 있습니다.

Fragment.instantiate(context, MyFragment.class.getName(), myBundle)

내가 실수하지 않으면 Android 지원 라이브러리를 사용할 때만 가능합니다.
Timo

2
지원 라이브러리를 사용하여 시도했지만 onCreateView (내 조각)에서 전달 된 번들이 null이므로 setArguments / getArguments 옵션을 사용하여 작업했습니다 (이 글을 읽는 모든 사람).
Jrop

1
흥미롭게도, 나는이 접근법을 전에 본 적이 없다. 프래그먼트 인스턴스화에 대한 다른 접근 방식보다 장점이 있습니까?
IgorGanapolsky

22
로부터 개발자 문서 ,instantiate() Creates a new instance of a Fragment with the given class name. This is the same as calling its empty constructor.
브라이언 보먼

2
빈 생성자를 호출하는 것과 동일하다고 언급했지만. "args.setClassLoader (f.getClass (). getClassLoader ());" 번들 인수를 위해 아래에 부름
Gökhan Barış Aker

49

@yydl은 왜 newInstance메소드가 더 좋은지에 대한 설득력있는 이유를 제공합니다 .

안드로이드가 나중에 프래그먼트를 다시 생성하기로 결정하면 프래그먼트의 인수가없는 생성자를 호출합니다. 따라서 생성자를 오버로드하는 것은 해결책이 아닙니다.

여전히 constructor 을 사용하는 것이 가능합니다 . 이것이 왜 그런지 보려면 먼저 위의 대안이 Android에서 사용되는 이유를 알아야합니다.

프래그먼트를 사용하려면 인스턴스가 필요합니다. 안드로이드는 YourFragment()( 인수 생성자 없음) 호출 하여 프래그먼트의 인스턴스를 구성합니다. 안드로이드는 사용할 생성자를 알 수 없으므로 오버로드 된 생성자는 무시됩니다.

활동의 수명 동안 프래그먼트는 위와 같이 생성되고 Android에 의해 여러 번 파괴됩니다. 즉, 조각 개체 자체에 데이터를 넣으면 조각이 파괴되면 데이터가 손실됩니다.

이 문제를 해결하기 위해 android는 Bundle(calling setArguments())을 사용하여 데이터를 저장하도록 요청합니다 YourFragment. 인수 bundle는 Android에 의해 보호되므로 지속적 입니다.

이 번들을 설정하는 한 가지 방법은 정적 newInstance메소드 를 사용하는 것입니다.

public static YourFragment newInstance (int data) {
    YourFragment yf = new YourFragment()
    /* See this code gets executed immediately on your object construction */
    Bundle args = new Bundle();
    args.putInt("data", data);
    yf.setArguments(args);
    return yf;
}

그러나 생성자 :

public YourFragment(int data) {
    Bundle args = new Bundle();
    args.putInt("data", data);
    setArguments(args);
}

newInstance방법 과 정확히 같은 일을 할 수 있습니다 .

당연히, 이것은 실패 할 것이며 Android가 newInstance메소드 를 사용하기를 원하는 이유 중 하나입니다 .

public YourFragment(int data) {
    this.data = data; // Don't do this
}

추가 설명으로 다음은 Android의 Fragment Class입니다.

/**
 * Supply the construction arguments for this fragment.  This can only
 * be called before the fragment has been attached to its activity; that
 * is, you should call it immediately after constructing the fragment.  The
 * arguments supplied here will be retained across fragment destroy and
 * creation.
 */
public void setArguments(Bundle args) {
    if (mIndex >= 0) {
        throw new IllegalStateException("Fragment already active");
    }
    mArguments = args;
}

Android는 인수 를 구성 할 때만 설정하도록 요구하며, 인수 가 유지되도록 보장합니다.

편집 : @JHH의 의견에서 지적했듯이 일부 인수가 필요한 사용자 정의 생성자를 제공하는 경우 Java는 arg 기본 생성자 가 없는 조각을 제공하지 않습니다 . 따라서 팩토리 메소드로 피할 수있는 코드 인 인수 없음 생성자 를 정의해야합니다 newInstance.

편집 : 안드로이드는 더 이상 조각에 과부하 생성자를 사용할 수 없습니다. 이 newInstance방법을 사용해야합니다 .


android : configChanges = "orientation | keyboardHidden | screenSize"를 사용하여 언제 정당화 할 수 있습니까?
Luke Allison

1
Android Studio는 이제 기본이 아닌 모든 생성자에 대해 오류를 발생 시키므로 더 이상 작동하지 않습니다.
Sheharyar

6
이런 사람, 드로이드 개발자가 드로이드 외부에서 코드를 작성한 적이 얼마나 많은지 궁금합니다. 우리가 설명하는 접근법을 사용할 수 없다는 것은 미친 짓입니다. 정적 팩토리 메소드를 사용해야하는 이유에 대한 어떠한 의견에서도 설득력있는 주장은 없습니다. 컴파일 할 때 오류가 발생하는 것이 훨씬 혼란 스럽습니다. 이것은 분명히 가장 좋은 대답이며 sfm에 이점이 없음을 보여줍니다.
MPavlak

3
글쎄, 하나의 미묘한 이유가 있습니다. 인수를 사용하여 자신만의 생성자를 자유롭게 만들 수 있지만 여전히 인수가없는 생성자가 있어야합니다 . args를 가진 생성자가 명시 적으로 정의되지 않는 한 클래스에는 항상 암시 적 no-arg 생성자가 있기 때문에 arg-constructor no-arg 생성자를 모두 명시 적으로 정의 해야합니다. 그렇지 않으면 시스템에서 호출 할 수 없습니다. 인수없는 생성자. 이것이 정적 팩토리 메소드를 대신 사용하는 것이 권장 이유라고 생각합니다. 인수가없는 생성자를 정의하는 것을 잊어 버릴 위험을 줄입니다.
JHH

@JHH 컴파일 시간 자체에 실패하므로 그렇게 큰 위험은 없습니다. 그러나 여기서 문제는 주요 프로그래밍 패러다임 인 생성자 오버로드가 Android에 의해 거부되고 있다는 것입니다.
ps95

20

나는 yydi 답변에 동의하지 않습니다 .

안드로이드가 나중에 프래그먼트를 다시 생성하기로 결정하면 프래그먼트의 인수가없는 생성자를 호출합니다. 따라서 생성자를 오버로드하는 것은 해결책이 아닙니다.

나는 그것이 해결책이고 좋은 것이라고 생각합니다. 이것이 바로 Java 핵심 언어로 개발 된 이유입니다.

안드로이드 시스템이를 파괴하고 다시 만들 수 있다는 것은 사실입니다 Fragment. 그래서 당신은 이것을 할 수 있습니다 :

public MyFragment() {
//  An empty constructor for Android System to use, otherwise exception may occur.
}

public MyFragment(int someInt) {
    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    setArguments(args);
}

그것은 당신이 당길 수 someInt에서 getArguments()이 경우에도, 후자에 Fragment시스템에 의해 재현되었다. 이것은보다 우아한 솔루션입니다static 생성자 입니다.

내 의견으로는 static생성자는 쓸모가 없으며 사용해서는 안됩니다. 또한 나중에 확장 Fragment하고 생성자에 더 많은 기능을 추가 하려는 경우 제한됩니다 . static생성자를 사용하면 이 작업을 수행 할 수 없습니다.

최신 정보:

Android는 기본이 아닌 모든 생성자에 오류를 표시하는 검사를 추가했습니다.
위에서 언급 한 이유로 비활성화하는 것이 좋습니다.


4
위에서 언급하지 않은 정적 메서드를 사용하면 얻을 수있는 또 다른 이점은 실수로 속성을 설정할 수 없다는 것입니다.
yydl

4
또한 "이 조각 확장"에 대한 요점과 관련하여 클래스를 확장하면이 방법이 실제로 나쁩니다. super를 호출하면 setArguments () 호출이 자식이나 부모 중 하나에 만 유효하지만 둘 다에는 유효하지 않습니다!
yydl

2
@yydle 하위 번들을 초기화하기 위해 get 인수를 호출하여 이러한 상황을 피할 수 있습니다. Java 방식은 항상 더 좋습니다.
Ilya Gazman

9
그러나 이것이 사람들이 Google이 제안한 패턴을 사용하도록 권장하는 또 다른 이유입니다. 물론, 우리는 모두 귀하의 솔루션이 기술적으로 100 % 실현 가능하다는 데 동의합니다. 같은 방식으로 많은 일을하는 방법이 많이 있습니다. 그러나 문제는 그것이 최고인지 여부입니다. 그리고 생성자를 사용하는 것이 이것이 작동하는 방식의 진정한 본질을 나타내는 것은 아니라고 생각합니다.
yydl

3
정적 생성이 더 좋다는 @yydl에 동의합니다. 또 다른 이점은 미래의 새로운 종속성의 종속성 주입입니다. 생성자가 적합하지 않으며 더 많은 코드 변경 (또는 더 많은 생성자가 추가 될 수 있음)을 유발할 수 있습니다.
Boon

19

일부 코 틀린 코드 :

companion object {
    fun newInstance(first: String, second: String) : SampleFragment {
        return SampleFragment().apply {
            arguments = Bundle().apply {
                putString("firstString", first)
                putString("secondString", second)
            }
        }
    }
}

그리고 당신은 이것으로 논쟁을 얻을 수 있습니다 :

val first: String by lazy { arguments?.getString("firstString") ?: "default"}
val second: String by lazy { arguments?.getString("secondString") ?: "default"}

3

android에서 인수가있는 조각을 인스턴스화하는 가장 좋은 방법은 조각에 정적 팩토리 메소드를 갖는 것입니다.

public static MyFragment newInstance(String name, int age) {
    Bundle bundle = new Bundle();
    bundle.putString("name", name);
    bundle.putInt("age", age);

    MyFragment fragment = new MyFragment();
    fragment.setArguments(bundle);

    return fragment;
}

프래그먼트 인스턴스로 필드를 설정하지 않아야합니다. 안드로이드 시스템이 프래그먼트를 다시 만들 때마다 시스템에 더 많은 메모리가 필요하다고 생각되면 인수없이 생성자를 사용하여 프래그먼트를 다시 작성하는 것보다.

인수로 조각을 인스턴스화 하는 모범 사례에 대한 자세한 정보는 여기를 참조하십시오.


2

모범 사례에 대한 질문이 있기 때문에 일부 REST 웹 서비스로 작업 할 때 조각을 만들기 위해 하이브리드 접근법을 사용하는 것이 좋습니다.

사용자 조각을 표시하는 경우 복잡한 객체, 예를 들어 일부 사용자 모델을 전달할 수 없습니다.

그러나 우리가 할 수있는 일은 onCreate그 사용자 를 체크인하는 것 입니다! = null이고 그렇지 않은 경우 데이터 레이어에서 가져 오십시오.

이런 식으로 우리는 안드로이드에 의한 프래그먼트 재생의 경우 userId에 의해 다시 생성하는 능력과 사용자 행동에 대한 snappiness뿐만 아니라 객체 자체 또는 ID 만 잡고 프래그먼트를 생성하는 기능을 모두 얻습니다.

무언가가 이것을 좋아합니다 :

public class UserFragment extends Fragment {
    public final static String USER_ID="user_id";
    private User user;
    private long userId;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        userId = getArguments().getLong(USER_ID);
        if(user==null){
            //
            // Recreating here user from user id(i.e requesting from your data model,
            // which could be services, direct request to rest, or data layer sitting
            // on application model
            //
             user = bringUser();
        }
    }

    public static UserFragment newInstance(User user, long user_id){
        UserFragment userFragment = new UserFragment();
        Bundle args = new Bundle();
        args.putLong(USER_ID,user_id);
        if(user!=null){
            userFragment.user=user;
        }
        userFragment.setArguments(args);
        return userFragment;

    }

    public static UserFragment newInstance(long user_id){
        return newInstance(null,user_id);
    }

    public static UserFragment newInstance(User user){
        return newInstance(user,user.id);
    }
}

3
"복잡한 개체, 예를 들어 일부 사용자 모델을 전달할 수 없습니다."- 사실이 아닙니다. 다음과 같이 : User user = /*...*/ 사용자를 번들에 넣고 Bundle bundle = new Bundle(); bundle.putParcelable("some_user", user); 인수에서 사용자를 가져옵니다 User user = getArguments().getParcelable("some_user"); . 객체는 Parcelable 인터페이스를 구현해야합니다. 링크
Adam Varhegyi

3
글쎄,하지만 수업이 복잡하고 다른 객체에 대한 리퍼러를 포함 할 때 ... 나는 개인적으로 객체를 가지고 있거나 그것을 얻지 못하고 간단하게 유지하는 것을 선호합니다.
Tigra

1

이 코드를 100 % 사용하여 문제를 해결하십시오

firstFragment 에이 코드를 입력하십시오

public static yourNameParentFragment newInstance() {

    Bundle args = new Bundle();
    args.putBoolean("yourKey",yourValue);
    YourFragment fragment = new YourFragment();
    fragment.setArguments(args);
    return fragment;
}

이 샘플은 부울 데이터를 보냅니다.

그리고 SecendFragment에서

yourNameParentFragment name =yourNameParentFragment.newInstance();
   Bundle bundle;
   bundle=sellDiamondFragments2.getArguments();
  boolean a= bundle.getBoolean("yourKey");

첫 번째 조각의 값은 정적이어야합니다

행복한 코드


0

프래그먼트를 인스턴스화하는 가장 좋은 방법은 기본 Fragment.instantiate 메소드를 사용하거나 프래그먼트를 인스턴스화하는 팩토리 메소드를
작성하는 것입니다.주의 : 프래그먼트 메모리를 복원하는 동안 항상 프래그먼트에서 하나의 빈 생성자를 작성하면 런타임 예외가 발생합니다.


0

나는 최근에 여기 있습니다. 그러나 내가 방금 아는 어떤 것이 당신에게 약간 도움이 될 수 있습니다.

Java를 사용하는 경우 변경할 것이 없습니다. 그러나 kotlin 개발자에게는 다음과 같은 스 니펫이 있습니다.

  • 부모 조각 :
inline fun <reified T : SampleFragment> newInstance(text: String): T {
    return T::class.java.newInstance().apply {
        arguments = Bundle().also { it.putString("key_text_arg", text) }
    }
}
  • 정상적인 전화
val f: SampleFragment = SampleFragment.newInstance("ABC")
// or val f = SampleFragment.newInstance<SampleFragment>("ABC")
  • 다음과 같은 방법으로 자식 프래그먼트 클래스에서 부모 초기화 작업을 확장 할 수 있습니다.
fun newInstance(): ChildSampleFragment {
    val child = UserProfileFragment.newInstance<ChildSampleFragment>("XYZ")
    // Do anything with the current initialized args bundle here
    // with child.arguments = ....
    return child
}

행복한 코딩.


-2

setArguments()쓸모가 없습니다. 그것은 단지 혼란을 가져옵니다.

public class MyFragment extends Fragment {

    public String mTitle;
    public String mInitialTitle;

    public static MyFragment newInstance(String param1) {
        MyFragment f = new MyFragment();
        f.mInitialTitle = param1;
        f.mTitle = param1;
        return f;
    }

    @Override
    public void onSaveInstanceState(Bundle state) {
        state.putString("mInitialTitle", mInitialTitle);
        state.putString("mTitle", mTitle);
        super.onSaveInstanceState(state);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
        if (state != null) {
            mInitialTitle = state.getString("mInitialTitle");
            mTitle = state.getString("mTitle");
        } 
        ...
    }
}

단 하나 이상의 메소드를 대체하고 onViewCreated범위와 분리 될 수있는 필드를 작성하도록 강요된 경우를 제외하고 . 내가 생각하는 편리함은 똑같은 일을하는 많은 방법입니다. 또한 사용자가 수행 한 업데이트를 확인하는 쉬운 방법입니다 (번들 getArguments과 번들 비교 onSaveInstanceState)
Overclover

@Asagen, 나는 초기 값과 사용자 값을 비교하는 것에 대한 귀하의 의견을 좋아합니다. 코드를 편집하고 코드가 여전히 균일하고 명확하다고 생각합니다 getArguments. onViewCreated범위는 어떻습니까? 상태 번들을 복원 할 수 있습니다. 하지만 난 그냥 메이크업을 선호하는 onCreateView빛을 빠르게하고 내부의 모든 무거운 초기화를 할 수 onActivityCreated있기 때문에 Fragment.getActivity()때로는 반환에 같은 null때문에의 onAttach()API (23)의 새 버전에서 변경
바딤 스타

모든 여기 않았다이었다 이동 setget ArgumentssaveInstanceState. 당신은 본질적으로 "후드"에서하는 것과 같은 일을하고 있습니다
OneCricketeer

1
@ cricket_007 또는 그 반대 입니다. 사용 saveInstanceState은 "후드"입니다. 그리고를 사용 Arguments하면 기능을 복제 하여 첫 번째 Arguments값과 값 을 다시 확인할 수 있습니다 saveInstanceState. saveInstanceState어떤 식 으로든 사용해야하기 때문 입니다. 어쩌면 Arguments... 그들은 필요하지 않습니다.
Vadim Star

인수는 프래그먼트에 대한 인 텐트 엑스트라 와 동일 합니다. 그것들은 쓸모가 없으며 현재 상태와 다른 초기 매개 변수를 포함합니다.
BladeCoder

-12

나는 이것을 위해 많은 simpeler 솔루션을 가지고 있다고 생각합니다.

public class MyFragment extends Fragment{

   private String mTitle;
   private List<MyObject> mObjects;

   public static MyFragment newInstance(String title, List<MyObject> objects)
   MyFragment myFrag = new MyFragment();
   myFrag.mTitle = title;
   myFrag.mObjects = objects;
   return myFrag;
   }

12
MyFragment가 다시 생성되면 mObject가 지워집니다 (사용자는 장치 홈 화면으로 이동 한 후 나중에 MyFragment에서 중단 된 앱을 엽니 다). MyFragment에 번들을 인수로 전송하여 mObject를 유지할 수 있습니다.
ynnadkrap

1
또한 정적 메소드는 비 정적 멤버 변수에 어떻게 액세스합니까?
OrhanC1

2
@ynnadkrap 당신은 번들을 사용하는 것이 올바른 방법입니다.
Stefan Bogaard

2
@ OrhanC1이 예제 코드에 따르면 정적 메서드는 멤버 변수에 액세스하지 않습니다. MyFragment의 인스턴스가 구성원에게 액세스 중입니다. 여기에 오류가 없습니다. 그러나 안드로이드 os에 의해 일부 공간을 열기 위해 메모리에서 프래그먼트가 제거되면 액티비티를 다시 시작한 후 개미 변수를 할당하지 않고 기본 빈 생성자로이 프래그먼트가 생성되므로 누군가 에게이 답변을 권장하지 않습니다.
Gunhan

@ Gunhan 당신이 맞아요! 그렇지 않습니다. 혼란을 드려 죄송합니다 :)
OrhanC1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.