내 조각에서 새로운 활동을 시작하고 있습니다.
startActivityForResult(intent, 1);
Fragment의 부모 활동에서 결과를 처리하려고합니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1) {
// bla bla bla
}
}
문제는 requestCode
내가 방금 게시 한 적이 없다는 것 startActivityForResult()
입니다.
내가 좋아하는 뭔가있어 0x40001
, 0x20001
임의의 높은 비트 세트 등. 문서는 이것에 대해 아무 말도하지 않습니다. 어떤 아이디어?
답변
startActivityForResult()
에서 님에게 전화 중 입니다 Fragment
. 이 작업을 수행 할 때의 소유주는에 requestCode
의해 변경됩니다 .Activity
Fragment
resultCode
당신의 활동 에서 올바른 것을 얻으려면 이것을 시도하십시오 :
변화:
startActivityForResult(intent, 1);
에:
getActivity().startActivityForResult(intent, 1);
답변
요청 코드가 잘못되었습니다. v4 지원 라이브러리 프래그먼트를 사용하는 경우 프래그먼트 인덱스는 요청 코드의 상위 16 비트로 인코딩되고 요청 코드는 하위 16 비트에 있습니다. 조각 색인은 나중에 결과를 전달할 올바른 조각을 찾는 데 사용됩니다.
따라서 활동이 조각 개체에서 시작되면 다음과 같이 onActivityResult requestCode를 처리하십시오.
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
답변
더 쉬움 :
자바 :
int unmaskedRequestCode = requestCode & 0x0000ffff
코 틀린 :
val unmaskedRequestCode = requestCode and 0x0000ffff
하위 16 비트를 확인하고 논리 AND를 수행하여 상위 16 비트를 0으로 마스크 해제하십시오.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final int unmaskedRequestCode = requestCode & 0x0000ffff
if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
//Do stuff
}
}
답변
상수를 제공하는 경우 공개하고 다음에서 사용하십시오. startActivityResult
예:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
답변
또한 정의 할 수
super.onActivityResult(requestCode, resultCode, data)
있는 Activity
(재정의 경우 onActivityResult
이에서)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
...
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
그리고 startActivityForResult(intent, requestCode)
당신의 내부에 전화Fragment
답변
조각으로
getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
주요 활동에서 :
if (requestCode == PLACE_PICKER_REQUEST) {
if (resultCode == RESULT_OK) {
//what ever you want to do
}