마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

부득이한 이유로 강제종료되고 다시 onCreate된 Activity의 ViewPager내부 Fragment 참조

0 추천

우선 화면 구성은 Activity 안에 ViewPager가 있고 ViewPager안에 Fragment 두개가 있습니다.

그 중 한 Fragment는 카메라를 실행시켜 사진을 찍고 그 사진이 Fragment안의 ImageView에 나타납니다.

 

일반적으로 문제가 없지만 다른 앱을 왔다갔다하거나 카메라를 너무 오래 켜둘 경우 Activity가 onDestroy되어

onSaveInstanceState에서 저장하고 복구하고 있습니다. (Activity와 Fragment 각각의 onSaveInstanceState에서 자신의 화면에 해당하는 값들을 저장하고 Activity는 onCreate에서 Fragment는 onCreateView에서 if(savedInstance != null)... 와 같은 방식으로 화면에 저장된 값을 다시 넣어줍니다.)

이렇게 하면 화면도 잘 복구되어 나오고 아무 이상 없어 보입니다만, FragmentPagerAdapter를 통해 Fragment의 EditText를 참조하면 null포인터가 나옵니다. 

어댑터는 이런식으로.

public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
 
private final int NUM_ITEMS = 2;
 
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
 
public Exam1Fragment exam1 = new Exam1Fragment ();
 
public Exam2Fragment exam2 = new Exam2Fragment ();
 
@Override
public Fragment getItem(int position) {
 
switch (position) {
         case 0:
        return exam1 ;
         case 1:
             return exam2 ;
         default:
             return null;
         }
}...
 
되어있고
어뎁터가 가지고 있는 Fragment는 이런식으로
 
public class Exam1Fragment extends Fragment {
 
    public EditText inputView;
...
}
 
 
되어있습니다. 예를들어 exam1의 edtText를 참조할 일이 있어 액티비티에서
myFragmentPagerAdapter.exam1.edtiText 이런식으로 접근할때 널포인터가 납니다.
 
그런데 액티비티가 한번 죽었다가 다시 onCreate되기 전에는 이렇게 참조하는데 아무 문제가 없는데
부득이한 이유로 액티비티가 한번 죽고나서 다시 그려졌을 때 화면은 다 복구가 되어서 정상인 것처럼 보이는데
위처럼 참조할때 널이 난다는 점입니다.
 
Activity의 onCreate에서 FragmentPagerAdapter도 new로 새로 만들고
FragmentPagerAdapter 안에서 Fragment를 만들 때도 새로 만드는데 왜 안되는 걸까요 하는 질문입니다!
mnemonist (120 포인트) 님이 2015년 4월 22일 질문

1개의 답변

0 추천

FragmentPagerAdapter를 새로 생성하는 구문이 어디 어디에 있나요?

코드를 너무 부분적으로만 올려서 설명만으로는 파악하기는 힘이 드네여

Gradler (109,780 포인트) 님이 2015년 4월 23일 답변
FragmentPagerAdapter는 Activity의 onCreate 안에서 생성해요 myPagerAdapter = new MyFragmentPagerAdapter(
                getFragmentManager());
pager.setAdapter(myPagerAdapter);

답변 달아주셔서 감사합니다.
백그라운드에 오래있거나 camera에 오래 있다가 다시 돌아왔을 때 말씀하신 activity의 onCreate를 다시 타는지 확인해보시고 안타면 adapter를 새로 생성하는 코드가 들어가야 할듯 하네여
...