Activity에서 Fragment로 변수를 전달하고 다시 전달하는 방법은 무엇입니까?


135

현재 안드로이드 앱을 만들고 있는데 활동과 조각 사이의 날짜를 전달하고 싶습니다. 내 활동에는 버튼이 있습니다.이 조각은 DatePickerFragment입니다.

내 활동에서 나는 조각으로 수정하고 싶은 날짜를 보여줍니다. 그래서 날짜를 날짜 선택기에 전달하고 활동으로 다시 보내고 싶습니다.

많은 솔루션을 시도했지만 아무것도 작동하지 않습니다. 쉬운 방법은 인수를 전달하지만 조각으로는 수행 할 수 없습니다.


내 문제는 당신과 정확히 동일합니다. 예제가 왜 조각 자체를 날짜 선택기의 "사용자"로만 다루고 조각을 시작한 활동이 아닌지 궁금합니다.
Claudio

답변:


213

info에 fragment를 전달하기 위해, 그것을 작성할 때 arArments를 설정하고 나중에 프래그먼트의 onCreate 또는 onCreateView 메소드에서이 인수를 검색 할 수 있습니다.

프래그먼트의 newInstance 함수에서 보내려는 인수를 추가하십시오.

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

그런 다음 메소드의 조각 내부에서 onCreate또는 onCreateView다음과 같은 인수를 검색 할 수 있습니다.

Bundle args = getArguments();
int index = args.getInt("index", 0);

이제 조각과 통신하여 데이터를 보내거나 보내지 않으 려면 인터페이스를 사용해야합니다. 이 작업을 수행하는 방법은 조각 간의 통신에 대한 설명서를 참조하십시오. 모든 프래그먼트가 활동을 통해 서로 통신하기 때문에이 학습서에서는 실제 프래그먼트에서 활동 컨테이너로 데이터를 전송하여 활동에이 데이터를 사용하거나 활동에 포함 된 다른 프래그먼트로 전송하는 방법을 볼 수 있습니다.

설명서 튜토리얼 :

http://developer.android.com/training/basics/fragments/communicating.html


10
사람들 이이 질문을 반복해서 묻는 것은 문서에서 실제로 잘 설명되어 있지 않다고 생각합니다.
Michael Alan Huff

1
나는 아직도 가장 좋은 방법, 당신의 방법, 또는 @Elenasys에 의해 답변 된 방법에 대해 혼란 스럽습니다
Yoann Hercouet

아키텍처 구성 요소를 사용하여 조각 사이에 데이터를 공유 (I / O '17)에 새로운 방법이 있습니다 : developer.android.com/topic/libraries/architecture/...
jpardogo

XML 레이아웃 안에 만들어진 조각들은 어떻습니까?
ralphgabb 1

더 이상 정적 방법을 사용하고 싶지 않습니다.
Ahamadullah Saikat

89

데이터 전송 ActivityA와Fragment

활동:

Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();

파편:

조각으로 값 읽기

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

그러나 Fragment에서 Activity로 값을 보내려면 jpardogo의 답변을 읽으십시오. 인터페이스, 추가 정보가 필요합니다 : 다른 Fragments와 통신


2
커스텀 객체를 전달하는 방법? 내가 사용 Parcelable했지만 그게 나에게class cast exception
독사

이 솔루션은 나를 위해 작동하지 않습니다, 어디에서 수입 거래를 찾을 수 없습니다
thebeancounter

조각을 활동에로드하면 트랜잭션에 정의 된 번들을 통해 값을 보낼 수 있습니다. 당신의 시나리오는 무엇입니까?
Jorgesys

8

@ ρяσѕρєя K와 Terry 덕분에 ... 그것은 나를 많이 도와주고 완벽하게 작동합니다.

활동에서 다음과 같은 의도로 데이터를 보냅니다.

Bundle bundle = new Bundle(); 
bundle.putString("edttext", "From Activity"); 
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

Fragment onCreateView 메소드에서 :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

참조 : 안드로이드에서 활동에서 조각으로 데이터 보내기


7

라이브러리 EventBus를 사용하여 변수를 포함 할 수있는 이벤트를 전달하십시오. 활동과 조각이 느슨하게 결합되어 있기 때문에 좋은 솔루션입니다.

https://github.com/greenrobot/EventBus


4
나는 이것이 좋은 해결책이라고 말할 수는 없지만주의해야 할 말이 있습니다. EventBus는 사용하기가 매우 쉽지만 여기에도 위험이 있습니다. 너무 많은 신호를 추가하기 시작하면 느슨하게 연결된 특성으로 인해 누가 전화를 걸고 다른 이벤트가 발생하는 위치를 추적하기가 매우 어려울 수 있습니다.
Johan Paul

2

모든 Kotlin 개발자를위한

다음은 조각으로 데이터를 전송 하는 Android Studio 제안 솔루션입니다 (= File-> New-> Fragment-> Fragment (Blank)를 사용하여 Blank-Fragment를 생성하고 "fragment factory 메소드 포함"을 확인한 경우).

이것을 조각에 넣으십시오.

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.apply객체를 만들 때 또는 여기에 언급 할 때 데이터를 설정하는 좋은 방법입니다 .

this값을 수신자로 하여 지정된 함수 [block]을 호출하고 값을 리턴 this합니다.

그런 다음 활동 또는 조각에서 다음을 수행하십시오.

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

다음과 같이 조각의 인수를 읽으십시오.

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

액티비티에 데이터를 "송신"하려면 액티비티 에서 함수를 정의하고 단편에서 다음을 수행하십시오.

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

코 틀린의 마법을 즐기십시오!


1

활동에서 XML로 링크 된 조각으로 데이터 전송

File> New> Fragment> Fragment (List)와 같은 템플릿 중 하나를 사용하여 Android Studio에서 조각을 생성하면 조각은 XML을 통해 연결됩니다. newInstance 메소드는 프래그먼트에서 작성되지만 호출되지 않으므로 인수를 전달하는 데 사용할 수 없습니다.

대신 활동에서 onAttachFragment 메소드를 대체하십시오.

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

그런 다음 다른 답변에 따라 조각 onCreate 메소드의 인수를 읽으십시오.


0

번들로 간단히 프래그먼트를 인스턴스화 할 수 있습니다.

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.