2014-10-13 13 views
0

응용 프로그램을 닫을 때 내 번들 SavedInstanceState가 저장되지 않는 이유를 알 수 없습니다. 내가 모르는 멍청한 기회 일 수도 있습니다! 주요 활동은 그다지 많지 않습니다. 화면 전환을위한 페이지 어댑터입니다. 왜냐하면 그것이 내가하려고 시도하는 것의 주요 부분이기 때문입니다. 현재 대부분의 코드는 내 StandFragment.java에 있습니다. 앱을 열면 처음 나타나는 페이지입니다. 저장 상태와 그 종류의 것이 있습니다.InstanceState 저장하지 않음

MainActivity : 공용 클래스 MainActivity는 FragmentActivity를 확장 {

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
    pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));  
} 

private class MyPagerAdapter extends FragmentPagerAdapter { 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int pos){ 
     switch(pos){ 
     case 0: return StandFragment.newInstance("STAND"); 
     case 1: return CartFragment.newInstance("CART"); 
     case 2: return ThirdFragment.newInstance("THIRD"); 
     case 3: return ThirdFragment.newInstance("FOURTH"); 
     case 4: return ThirdFragment.newInstance("FIFTH"); 
     default: return ThirdFragment.newInstance("Default"); 
     } 
    } 

    @Override 
    public int getCount(){ 
     return 5; 
    } 
} 

}

StandFragment :

 public class StandFragment extends Fragment{ 

private int totalMoney; 
private int moneyPerSec; 
private int moneyPerClick; 
Handler handleCounter = new Handler(); 
TextView counter; 
TextView perSecCounter; 
Button buttonMoney; 
Button buttonMoneyPerSec; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View v = inflater.inflate(R.layout.stand_frag, container, false); 
    super.onCreate(savedInstanceState); 

    buttonMoney = (Button)v.findViewById(R.id.buttonMoney); 
    buttonMoneyPerSec = (Button)v.findViewById(R.id.buttonMoneyPerSec); 
    counter = (TextView)v.findViewById(R.id.tvMoney); 
    perSecCounter = (TextView)v.findViewById(R.id.tvMonPerSec); 

    TextView tv = (TextView) v.findViewById(R.id.tvStandFrag); 
    tv.setText(getArguments().getString("msg")); 

    handleCounter.post(updateCounter); 
    if (savedInstanceState==null){ 
     moneyPerSec = 1; 
     moneyPerClick = 1; 
     totalMoney=0; 
    } 
    else{ 
     moneyPerSec = savedInstanceState.getInt("moneyPerSec"); 
     moneyPerClick = savedInstanceState.getInt("moneyPerClick"); 
     totalMoney = savedInstanceState.getInt("totalMoney"); 
    } 

    buttonMoney.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      totalMoney += moneyPerClick; 
      counter.setText(""+totalMoney); 
      perSecCounter.setText(""+moneyPerSec); 
     } 
    }); 
    buttonMoneyPerSec.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      if (totalMoney>=10){ 
       totalMoney-=10; 
       counter.setText(""+totalMoney); 
       moneyPerSec++; 
       perSecCounter.setText(""+moneyPerSec); 
      } 
     } 
    }); 
    return v; 
} 

Runnable updateCounter = new Runnable(){ 
    public void run(){ 
     totalMoney += moneyPerSec; 
     counter.setText(""+totalMoney); 
     handleCounter.postDelayed(this, 1000); 
    } 
}; 
public void onPause(Bundle savedInstanceState){ 
    savedInstanceState.putInt("totalMoney",totalMoney); 
    savedInstanceState.putInt("moneyPerSec",moneyPerSec); 
    savedInstanceState.putInt("moneyPerClick",moneyPerClick); 
    super.onSaveInstanceState(savedInstanceState); 

} 
public static StandFragment newInstance(String text){ 

    StandFragment f = new StandFragment(); 
    Bundle b = new Bundle(); 
    b.putString("msg", text); 

    f.setArguments(b); 

    return f; 
} 
} 

답변

1

onSaveInstanceState() 영구 저장되지 않습니다 액티비티의() onSaveInstanceState에 데이터를 저장해야합니다. 프래그먼트의 인스턴스에 대한 특정 상태를 저장하기 위해 (예 : 구성 변경 중에 또는 앱이 백그라운드에서 종료되고 프래그먼트가 재생성되어야하는 경우). 앱을 완전히 종료하는 경우 (즉, Activity을 완료하면) 해당 인스턴스가 더 이상 필요하지 않으므로 상태가 저장되지 않습니다.

영구 저장소의 경우 사용자의 필요에 따라 SharedPreferences 또는 SQLite 중 하나를 살펴볼 수 있습니다.

+0

좋습니다, 감사합니다. 어떤 이유로 저는 Instance State가 변수를 전송할 것이라고 생각했습니다. 한 가지 더 질문하지만 단추의 상태를 말하면 저장하겠습니까? 보이는 것처럼 보이지 않습니까? – Raistlin

+1

예, 단편의 해당 인스턴스에만 적용됩니다. 따라서 앱을 회전 시키면 부울 (버튼의 상태)을 저장하고 'onViewCreated()'에 다시 적용 할 수 있습니다. – kcoppock

+0

감사합니다. 흠뻑! – Raistlin

1

onSaveInstanceState() 안드로이드 시스템이 특정을 다시해야하는 경우에만 호출됩니다 조각의 인스턴스.

당신은