1

방향 변경시 인스턴스를 유지하도록 내 조각을 가져올 수 없습니다.조각의 setRetainInstance (true) 메서드가 작동하지 않는 이유는 무엇입니까?

활동 클래스

public class MyActivity extends Activity 
{ 
    private MyFragment fragment; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     if(savedInstanceState == null) 
     { 
      fragment = new MyFragment(); 
     } 

     //null pointer exception on this line of code. fragment not being retained. 
     getFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit(); 
    } 
} 

조각 클래스

public class MyFragment extends Fragment 
{ 
    private View view; 
    private CustomListViewAdapter adapter; 
    public ArrayList<HashMap<String, String>> arrHashMap; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     view = inflater.inflate(R.layout.fragment_screen, container, false); 

     if(arrHashMap != null) 
     { 
      ListView lv = (ListView) view.findViewById(R.id.fragment_lv); 
      adapter = new CustomListViewAdapter((MyActivity)getActivity() , arrHashMap); 
      lv.setAdapter(adapter); 
      lv.setOnItemClickListener((MyActivity)getActivity()); 
     } 
     else 
     { 
      /* some code to create arrHashMap variable 

      */ 
      ListView lv = (ListView) view.findViewById(R.id.fragment_lv); 
      adapter = new CustomListViewAdapter((MyActivity)getActivity() , arrHashMap); 
      lv.setAdapter(adapter); 
      lv.setOnItemClickListener((MyActivity)getActivity()); 
     } 

     return(view); 
    } 

    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     setRetainInstance(true); 
    } 
} 

MyFragment는 onActivityCreated에 설정되는 (참) setRetainInstance에도 불구하고 오리엔테이션 변화에 null이 남아있다. MyActivity가 만들어지면 MyFragment도 항상 다시 만들어집니다. 또한 setRetainInstance (true)는 UI 조각에 사용되지 않는다는 것을 이해합니다. 그러나 저장된 어댑터 또는 뷰 멤버 변수를 사용하고 있지 않습니다. 어댑터를 다시 만들 수 있도록 유지 된 arrHashMap 변수를 방향 변경에만 재사용하고 있습니다. UI를 변경하십시오.

답변

0

업데이트 : 전혀 setRetainInstance (true)를 사용하지 않기로 결정하고 내가하는 ObjectInputStream과 ObjectOutputStream의 클래스를 사용하여 문제를 해결하고 MyActivity의 onSaveInstanceState (번들 outState) 방식의 파일로 arrHashMap 객체를 저장하고, 검색된 MyActivity의 onRestoreInstanceState (Bundle savedInstanceState) 메소드에서 해당 파일의 arrHashMap 오브젝트. 그런 다음 검색된 arrHashMap 객체로 어댑터를 설정하기 시작했습니다.

추가 참고로, MyAragivity에서 액세스 할 수 있도록 MyFragment의 arrHashMap 인스턴스 변수를 정적 변수로 변경했습니다.

저장 코드 :

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) 
{ 
    super.onRestoreInstanceState(savedInstanceState);   

    ArrayList<HashMap<String,String>> arrHashMap; 
    try 
    { 
     File f = new File(this.getDir("myDir", Context.MODE_PRIVATE), "arrHashMap"); 
     ObjectInputStream is = new ObjectInputStream(new FileInputStream(f)); 
     arrHashMap = ((ArrayList<HashMap<String, String>>) is.readObject()); 
     is.close(); 
    } 
    catch (Exception e) 
    { 
     arrHashMap = null; 
    } 
    if(arrHashMap != null) 
    { 
     ListView lv = (ListView)findViewById(R.id.fragment_lv); 
     CustomListViewAdapter adapter = new CustomListViewAdapter(this, arrHashMap); 
     lv.setAdapter(adapter); 
     lv.setOnItemClickListener(this); 
    } 
} 
:

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 

    try 
    { 
     File f = new File(this.getDir("myDir", Context.MODE_PRIVATE), "arrHashMap"); 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(f)); 
     os.writeObject(MyFragment.arrHashMap); 
     os.flush(); 
     os.close(); 
    } 
    catch(IOException e) 
    { 
     return; 
    } 
} 

코드를 복원