2012-03-17 177 views
0

這是我在這裏的第一篇文章,所以對我來說很容易lol!好吧,所以我是新來的,我一直在這個代碼上工作幾天,我似乎無法得到這個首選項的概念。我在這個網站的任何地方都搜索過,我相信這些代碼應該可以正常使用我在本網站和其他網站上看到的所有信息。我看過無數的例子,但仍然不明白我做錯了什麼。Android SharedPreferences強制關閉應用程序

這是我的主要活動的一小部分,當用戶啓動應用程序時首先啓動。我有一個選項菜單上的另一項活動,用於計算當前日期和用戶所選日期之間的差異,我希望將生成的整數傳遞到主活動並顯示其值的Toast。

public class SmokeStopperActivity extends Activity 
{ 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

     public static final String PREFERENCE_FILENAME = "DaysPassed"; 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     SharedPreferences preference = getSharedPreferences("DaysPassed", MODE_PRIVATE); 
     int diffDays = preference.getInt("daysPassed", 0); 
     Toast.makeText(SmokeStopperActivity.this, ("Days" + diffDays), 
       Toast.LENGTH_LONG).show();; 

這是我的第二個活動的片段,它計算整數diffDays的值。

long diff = milis2 - milis1; 
     int diffDays = (int) (diff/(24 * 60 * 60 * 1000) + 30); 


Toast.makeText(SetDate.this, (diffDays), 
     Toast.LENGTH_LONG).show();; 

    SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(this); 
    SharedPreferences.Editor prefEditor1 = preference.edit();         
    prefEditor1.putInt("daysPassed", diffDays);  
    prefEditor1.commit(); 

我有我的第二個活動送diffDays整數的吐司,當用戶在第二活動的前面部分按下一個按鈕,並計算做工精細。第二項活動中的Toast顯示我想要的整數。問題是,當我使用此代碼

SharedPreferences preference = getSharedPreferences("DaysPassed", MODE_PRIVATE); 
    int diffDays = preference.getInt("daysPassed", 0); 
    Toast.makeText(SmokeStopperActivity.this, ("Days" + diffDays), 
      Toast.LENGTH_LONG).show();; 

在我的第一個活動它強制關閉打開。如果我從第一項活動中刪除此代碼,則應用程序將打開,這對我沒有任何意義。我在這裏查看的所有其他代碼似乎完全按照我沒有遇到的問題使用此代碼段,因此我不明白我做錯了什麼。任何幫助將不勝感激。我有一種感覺,這是我愚蠢的,我繼續俯瞰。可能是因爲看了幾個小時的代碼大聲笑!

+1

logcat說什麼? – Snicolas 2012-03-17 05:24:33

回答

0

試試這個:

SharedPreferences preference = SmokeStopperActivity.this.getSharedPreferences("DaysPassed", MODE_PRIVATE); 
    int diffDays = preference.getInt("daysPassed", 0); 
    Toast.makeText(SmokeStopperActivity.this, ("Days" + String.valueOf(diffDays)), 
      Toast.LENGTH_LONG).show(); 
+0

爲什麼在'Activity'內將'Context'傳遞給'Toast.makeText(...)'時會使用'getBaseContext()'?你所要做的就是使用'this'。此外,在提供String(或CharSequence)參數時使用「String + Integer」構造將在並置過程中將Integer隱式轉換爲字符串。沒有必要使用'String.valueOf(...)'。 – Squonk 2012-03-17 06:23:56

+0

@MisterSquonk:我同意you.but它取決於我們在哪裏使用Toast.makeText(Context cont)。看到這個[getBaseContext()而不是這個](http://stackoverflow.com/questions/9605459/android-why-must-use-getbasecontext-instead-of-this/9606712#9606712) – 2012-03-17 06:33:13

+0

這個問題表明'吐司.makeText(...)'在'Activity'的'onCreate(...)'方法中被調用 - 在這種情況下,除了'this'之外沒有任何用處。 – Squonk 2012-03-17 06:48:51

0

您的活動的情況下......我think..You應該得到共享偏好 嘗試這樣的..

SharedPreferences prefs = this.getSharedPreferences("DaysPassed", MODE_PRIVATE); 
+0

這不會幫助。提供String(或CharSequence)參數時使用「String + Integer」構造將在並置過程中將Integer隱式轉換爲字符串。 – Squonk 2012-03-17 06:21:57

+0

是的...我早些時候遇到同樣類型的問題..但後來我dint使用串聯..而是我試圖讓它在int intless ..它顯示我錯誤..所以然後我用String.valueOf .. .thnx用於糾正.. – 5hssba 2012-03-17 06:39:41

0

使用此

Context context = getApplicationContext(); 
Toast.makeText(context, ("Days" + diffDays), 
      Toast.LENGTH_LONG).show(); 
0

問題是,當我使用這個代碼

SharedPreferences preference = getSharedPreferences("DaysPassed", MODE_PRIVATE); 
int diffDays = preference.getInt("daysPassed", 0); 
Toast.makeText(SmokeStopperActivity.this, ("Days" + diffDays), 
     Toast.LENGTH_LONG).show();; 

在我的第一個活動是強制關閉開放。如果我從第一項活動中刪除此代碼,則應用程序將打開,這對我沒有任何意義。

正確。這根本沒有意義。該代碼沒有任何問題......呃,實際上就是這樣。我會寫的......

Toast.makeText(this, "Days" + diffDays, Toast.LENGTH_LONG).show(); 

......但無論哪種方式,它的工作原理 - 我的版本和你的。你的代碼還有其他的錯誤,這與這三行無關。

忘記你的第二個Activity,只是發佈整個你的第一個Activity和logcat輸出,指示哪一行拋出未處理的異常並導致關閉。