현재 안드로이드 앱을 만들고 있는데 활동과 조각 사이의 날짜를 전달하고 싶습니다. 내 활동에는 버튼이 있습니다.이 조각은 DatePickerFragment입니다.
내 활동에서 나는 조각으로 수정하고 싶은 날짜를 보여줍니다. 그래서 날짜를 날짜 선택기에 전달하고 활동으로 다시 보내고 싶습니다.
많은 솔루션을 시도했지만 아무것도 작동하지 않습니다. 쉬운 방법은 인수를 전달하지만 조각으로는 수행 할 수 없습니다.
현재 안드로이드 앱을 만들고 있는데 활동과 조각 사이의 날짜를 전달하고 싶습니다. 내 활동에는 버튼이 있습니다.이 조각은 DatePickerFragment입니다.
내 활동에서 나는 조각으로 수정하고 싶은 날짜를 보여줍니다. 그래서 날짜를 날짜 선택기에 전달하고 활동으로 다시 보내고 싶습니다.
많은 솔루션을 시도했지만 아무것도 작동하지 않습니다. 쉬운 방법은 인수를 전달하지만 조각으로는 수행 할 수 없습니다.
답변:
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
Activity
A와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와 통신
Parcelable
했지만 그게 나에게class cast exception
@ ρяσѕρєя 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);
}
라이브러리 EventBus를 사용하여 변수를 포함 할 수있는 이벤트를 전달하십시오. 활동과 조각이 느슨하게 결합되어 있기 때문에 좋은 솔루션입니다.
모든 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
코 틀린의 마법을 즐기십시오!
활동에서 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 메소드의 인수를 읽으십시오.