2012-04-24 6 views
0

Я написал приложение, которое что-то подсчитывает, нажимая на кнопку + и показывая его в текстовом виде. знаю, что я хочу сохранить значение текстового представления в методе onstop() и использовать его в onstart и снова показать это значение в текстовом представлении. На самом деле я это сделал , но, когда я нажимаю на кнопку +, текст открывается с 1 до возрастания от последнего значения. Я фактически сохраняю значение текстового вида в onSaveInstanceState и использую его onRestoreInstanceState. main.java код:android: save textview with sharedperfrences

public class main extends Activity implements OnClickListener { 
    /** Called when the activity is first created. */ 
    int salavatcount ; 
    public String fonts="NAZANIN.TTF"; 
    TextView salavatcounter; 
    Button addsalavat,sefrkon; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState == null) { 
      salavatcount = 0; 
     } 
     setContentView(R.layout.main); 
     salavatcounter = (TextView) findViewById(R.id.salavatcounter); 
     addsalavat = (Button) findViewById(R.id.addsalavat); 
     addsalavat.setOnClickListener(this); 
     sefrkon = (Button) findViewById(R.id.sefrkon); 
     sefrkon.setOnClickListener(this); 
     SharedPreferences setting =getSharedPreferences("setting",0); 
     salavatcounter.setText(setting.getString("salavatcount", ""+0)); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater menu_option_infalter = getMenuInflater(); 
     menu_option_infalter.inflate(R.menu.optionmenu, menu);   
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if (item.getItemId()== R.id.about) { 
      Intent intent = new Intent(main.this,about.class); 
      startActivity(intent); 
     } 
     return super.onOptionsItemSelected(item); 
    } 

     @Override 
    protected void onSaveInstanceState(Bundle savedInstanceState) { 
      savedInstanceState.putString("YourTextViewTextIdentifier", 
       salavatcounter.getText().toString() 
      ); 
      savedInstanceState.putInt("int", salavatcount); 
      super.onSaveInstanceState(savedInstanceState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     salavatcounter.setText(savedInstanceState.getString("YourTextViewTextIdentifier")); 
     salavatcount = savedInstanceState.getInt("int"); 
    } 

    @Override 
    protected void onStop() {  
     super.onStop(); 
     SharedPreferences setting=getSharedPreferences("setting", 0); 
     SharedPreferences.Editor editor=setting.edit(); 
     editor.putString("salavatcount", salavatcounter.getText().toString()); 
     editor.commit(); 
    } 

    public void onClick(View v) { 
     if (v.getId()== R.id.addsalavat){ 
      salavatcount++; 
      salavatcounter.setText(""+salavatcount); 
     } 
     else if (v.getId() == R.id.sefrkon) { 
      salavatcount=0; 
      salavatcounter.setText(""+salavatcount); 
     } 
    } 
} 

Edit: журнал

04-24 01:59:50.823: W/dalvikvm(6645): threadid=3: thread exiting with uncaught exception (group=0x4001b188) 
04-24 01:59:50.833: E/AndroidRuntime(6645): Uncaught handler: thread main exiting due to uncaught exception 
04-24 01:59:50.843: E/AndroidRuntime(6645): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pishgamanit.salavatcounter/com.pishgamanit.salavatcounter.main}: java.lang.NullPointerException 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.os.Looper.loop(Looper.java:123) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at dalvik.system.NativeStart.main(Native Method) 
04-24 01:59:50.843: E/AndroidRuntime(6645): Caused by: java.lang.NullPointerException 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at com.pishgamanit.salavatcounter.main.onCreate(main.java:29) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
04-24 01:59:50.843: E/AndroidRuntime(6645):  ... 11 more 
04-24 01:59:50.863: I/dalvikvm(6645): threadid=7: reacting to signal 3 
04-24 01:59:50.863: E/dalvikvm(6645): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 

ответ

0

Вы не устанавливаете значение salavatcount для значения из общих настроек. Когда вы нажимаете кнопку, она сбрасывается на 0, так как это значение по умолчанию для salavatcount.

Вы также сохраняете значение int в виде строки.

@Override 
protected void onStop() { 
    super.onStop(); 

    SharedPreferences setting= getSharedPreferences("setting", 0); 
    SharedPreferences.Editor editor=setting.edit(); 
    editor.putInt("salavatcount", salavatcount); 
    editor.commit(); 

    } 

Затем в вашем методе создания задайте значение salavatcount из SharePreferences.

int salavatcount; 
public String fonts="NAZANIN.TTF"; 
TextView salavatcounter; 
Button addsalavat,sefrkon; 

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

    setContentView(R.layout.main); 


    salavatcounter = (TextView) findViewById(R.id.salavatcounter); 
    addsalavat = (Button) findViewById(R.id.addsalavat); 
    addsalavat.setOnClickListener(this); 
    sefrkon = (Button) findViewById(R.id.sefrkon); 
    sefrkon.setOnClickListener(this); 

    SharedPreferences setting = getSharedPreferences("setting", 0); 

    salavatcount = setting.getInt("salavatcount", 0); 

    salavatcounter.setText("" + salavatcount); 



    } 

Edit:

Я хотел бы переписать код так:

public class main extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
int salavatcount ; 
public String fonts="NAZANIN.TTF"; 
TextView salavatcounter; 
Button addsalavat,sefrkon; 

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

    setContentView(R.layout.main); 

    if (savedInstanceState == null) { 

     salavatcount = savedInstanceState.getInt("count"); 

    } else { 

     SharedPreferences setting = getSharedPreferences("setting", 0); 

     salavatcount = setting.getInt("salavatcount", 0); 

    } 


    salavatcounter = (TextView) findViewById(R.id.salavatcounter); 
    addsalavat = (Button) findViewById(R.id.addsalavat); 
    addsalavat.setOnClickListener(this); 
    sefrkon = (Button) findViewById(R.id.sefrkon); 
    sefrkon.setOnClickListener(this); 

    salavatcounter.setText("" + salvatcount); 



    } 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater menu_option_infalter = getMenuInflater(); 
    menu_option_infalter.inflate(R.menu.optionmenu, menu);  
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (item.getItemId()== R.id.about) { 
     Intent intent = new Intent(main.this,about.class); 
     startActivity(intent); 
     } 
    return super.onOptionsItemSelected(item); 
} 

    @Override 
protected void onSaveInstanceState(Bundle savedInstanceState) { 
     savedInstanceState.putInt("count", salavatcount); 
     super.onSaveInstanceState(savedInstanceState); 
    } 


    @Override 
protected void onStop() { 
    super.onStop(); 

    SharedPreferences setting= getSharedPreferences("setting", 0); 
    SharedPreferences.Editor editor=setting.edit(); 
    editor.putInt("salavatcount", salavatcount); 
    editor.commit(); 

    } 



public void onClick(View v) { 
    // TODO Auto-generated method stub 

    if (v.getId()== R.id.addsalavat){ 

     salavatcount++; 

     salavatcounter.setText(""+salavatcount); 

    }else if (v.getId() == R.id.sefrkon) { 
     salavatcount=0; 

     salavatcounter.setText(""+salavatcount); 
    } 
} 
} 
+0

u r right, но он пока не работает. Я думаю, что это имеет некоторый конфликт с методом savedInstanceState. У вас есть какие-либо предложения? –

+0

Я отредактировал свое сообщение, чтобы показать немного другой способ сделать это. –

+0

Большое спасибо за ответ Дэвид. Вы запускаете этот код на своем компьютере? Я имею в виду, что вы получаете результат от этих изменений? на самом деле я не понимаю, что подсчитывается в этой строке -> salavatcount = savedInstanceState.getInt ("count"); –

0

Вы инициализировать salvatcount до 0 здесь:

if (savedInstanceState == null) { 
    salavatcount = 0; 
} 

вместо инициализировать его со значением из общих предпочтений:

SharedPreferences setting =getSharedPreferences("setting",0); 
salvatcount = Integer.valueOf(setting.getString("salavatcount", "0")); 
// .... 
salavatcounter.setText("" + salvatcount); 
+0

TNX для воспроизведения. где я должен использовать ваш код? в случае, если statemenet? –

+0

насколько я понимаю ваш код - да. – MByD

+0

пока не работает. вы его проверяете? –

0

я изменить свой код, чтобы это и моя проблема решена. спасибо всем вам парень, который поможет мне

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState == null) { 
     salavatcount = 0; 
    } 
    setContentView(R.layout.main); 
    salavatcounter = (TextView) findViewById(R.id.salavatcounter); 
    addsalavat = (Button) findViewById(R.id.addsalavat); 
    addsalavat.setOnClickListener(this); 
    sefrkon = (Button) findViewById(R.id.sefrkon); 
    sefrkon.setOnClickListener(this); 

    // Start save value of salavatcount when exit App 
    SharedPreferences setting = getSharedPreferences("countersetting", 0); 
    salavatcount = setting.getInt("countervalue", 0); 
    salavatcounter.setText(""+salavatcount); 
    // End save value of salavatcount when exit App 
} 

и OnStop методом

@Override 
protected void onStop() { 
    super.onStop(); 
    // Start save value of salavatcount when exit App 
    SharedPreferences setting = getSharedPreferences("countersetting", 0); 
    SharedPreferences.Editor editor=setting.edit(); 
    editor.putInt("countervalue", salavatcount); 
    editor.commit(); 
    // End save value of salavatcount when exit App 
}