티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
startActivityForResult() from a Fragment and finishing child Activity, doesn't call onActivityResult() in Fragment
Fragment에서 startActivityForResut()을 호출하고 자식 Activity를 종료시켰을 때 Fragment의 onActivityResult()이 호출되지 않습니다.
문제 내용
FirstActivity.Java
has a FragmentA.Java
which calls startActivityForResult()
. SecondActivity.Java
call finish()
but onActivityResult
never get called which is written in FragmentA.Java
.
FirstActivity.Java에는 FragmentA.Java가 있고, 이 Fragment에서 startActivityForResult()을 호출합니다. 그리고 SecondActivity.Java가 finish()되는데, onActivityResult()은 FragmentA.Java에 작성되어 있습니다.
FragmentA.Java
code:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// some code
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
getActivity().startActivityForResult(i, 1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getActivity();
if(requestCode == 1 && resultCode == Activity.RESULT_OK) {
//some code
}
}
SecondActivity.Java
code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code
Intent returnIntent = new Intent();
returnIntent.putExtra("result", result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
I have tried debugging the code, but onAcitvityResult()
never get called.
코드를 디버깅해 보았지만 onActivityResult()은 호출되지 않았습니다.
높은 점수를 받은 Solution
You must write onActivityResult()
in your FirstActivity.Java
as follows
FirstActivity.Java에 다음과 같이 onActivityResult()를 작성해야합니다.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
So this will call your fragment's onActivityResult()
그러면 Fragment의 onActivityResult()이 호출됩니다.
Edit: the solution is to replace getActivity().startActivityForResult(i, 1);
with startActivityForResult(i, 1);
수정: getActivity().startActivityForResult(i, 1);를 startActivityForResult(i, 1);로 대체해야합니다.
가장 최근 달린 Solution
The most important thing, that all are missing here is... The launchMode of FirstActivity must be singleTop. If it is singleInstance, the onActivityResult in FragmentA will be called just after calling the startActivityForResult method. So, It will not wait for calling of the finish() method in SecondActivity.
가장 중요한 것은 FirstActivity의 launchMode가 singleTop이어야 한다는 것입니다. singleInstance일 경우 FragmentA의 onActivityResult은 startActivityForResult() 메소드 호출 후에 즉시 호출됩니다. 따라서 SecondActivity에서 finish() 메소드를 호출하는 것을 기다리지 않습니다.
So go through the following steps, It will definitely work as it worked for me too after a long research.
다음 단계를 수행하면 작동합니다. 오랜 연구 끝에 나에게도 효과가 있는 것처럼 분명히 효과가 있을 것이다.
In AndroidManifest.xml file, make launchMode of FirstActivity.Java as singleTop.
AndroidManifest.xml 파일에서 FirstActivity.Java의 launchMode를 singleTop으로 설정합니다.
<activity
android:name=".FirstActivity"
android:label="@string/title_activity_main"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />
In FirstActivity.java, override onActivityResult method. As this will call the onActivityResult of FragmentA.
FirstActivity.Java에서 onActivityResult() 메소드를 오버라이드합니다. 이렇게 하면 FragmentA의 onActivityResult()을 호출합니다.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
In FragmentA.Java, override onActivityResult method
FragmentA.Java에서 onActivityResult() 메소드를 오버라이드합니다.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("FragmentA.java","onActivityResult called");
}
Call startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);
from FragmentA.Java
FragmentA.Java에서 startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);를 호출합니다.
Call finish();
method in SecondActivity.java
SecondActivity.Java에서 finish() 메소드를 호출합니다.
Hope this will work.
이렇게 하면 문제가 해결될 것입니다.
출처 : https://stackoverflow.com/questions/17085729/startactivityforresult-from-a-fragment-and-finishing-child-activity-doesnt-c
'개발 > 안드로이드' 카테고리의 다른 글
콘텐트 URI에서 파일 URI 가져오기 (0) | 2023.02.11 |
---|---|
알림 클릭: 활동이 이미 열려 있습니다 (0) | 2023.02.11 |
모바일 웹사이트 입력창에 포커스가 갈 때 숫자 키패드가 나오게 하기 (0) | 2023.02.10 |
매개변수와 함께 액티비티 시작하기 (0) | 2023.02.10 |
안드로이드에서 ImageView에 테두리 설정 (0) | 2023.02.10 |