2016-06-18 75 views
0

返回null所以,我開始MainActivity.java有以下代碼。getExtras()返回導航

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

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(MainActivity.this, SecondActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("testString", "TestString"); 
      i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 
} 

而我的ScondActivity.java有以下代碼。

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

    String s = getIntent().getExtras().getString("testString"); 
    Log.v(SecondActivity.class.getSimpleName(), s); 

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(SecondActivity.this, ThirdActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("testString", "TestString"); 
      i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 
} 

而我的ThirdActivity.java有以下代碼。

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

    String s = getIntent().getExtras().getString("testString"); 
    Log.v(ThirdActivity.class.getSimpleName(), s); 
} 

雖然我運行這個應用程序,一切工作正常。但是當我從ThirdActivity.java回來SecondActivity.java我得到NullPointerExceptionString s = getIntent().getExtras().getString("testString");

我該如何解決這個問題?

任何可能的幫助都是非常可觀的。

+1

將該值保存到sharedPref中,然後使用它 – Manifest

回答

2

您正在收到此錯誤,因爲使用Intent從一個活動傳遞到另一個活動的數據是臨時的,並且在您切換到其他活動時被破壞。 當您從SecondActivity切換到ThirdActivity時,FirstActivity中的額外內容將被銷燬。此問題的替代方法是,您可以將這些額外內容存儲在共享首選項中。使用共享首選項可以將數據保存到本地存儲,並且每個活動都可以使用它。 的指南,以共享偏好可以發現here

+0

實際上,我不想將數據保存在任何存儲中。這是我試圖從意圖本身得到它。無論如何感謝您對「Extras」的澄清。很不錯,加了+1。 – Gunaseelan

0

更改您的onCreate方法下面的代碼在這兩個第二和Tird活動

String s = ""; 
    if(getIntent().getExtras() != null) 
    { 
     s = getIntent().getExtras().getString("testString"); 
     Log.v(SecondActivity.class.getSimpleName(), s); 
    } 
1

可以使用的onSaveInstanceState()從活動的生命週期方法來解決這個問題。請看看以下網址:https://developer.android.com/training/basics/activity-lifecycle/recreating.html

從鏈接的段落,我已經提供了:

當因爲用戶按下後退或活動完成本身的系統的概念,你的活動被銷燬該活動實例將永遠消失,因爲該行爲表示不再需要該活動。但是,如果系統由於系統限制(而不是正常的應用程序行爲)而破壞了活動,那麼雖然實際的活動實例已經消失,但系統會記住它已存在,因此如果用戶導航回它,系統會創建一個新的使用一組保存的數據描述活動在銷燬時的狀態。系統用於恢復先前狀態的已保存數據稱爲「實例狀態」,是存儲在Bundle對象中的鍵值對的集合。

...

爲了節省額外的數據有關的活動狀態,你必須覆蓋的onSaveInstanceState()回調方法。系統在用戶離開活動並將其傳遞給Bundle對象時調用此方法,該對象將在活動意外銷燬時保存。如果系統稍後必須重新創建活動實例,它將同一個Bundle對象傳遞給onRestoreInstanceState()和onCreate()方法。

因此,而不是創建自己的共享偏好,你可以使用的onSaveInstanceState()而這從的onCreate(或onRestoreInstanceState)參數傳遞的包。

0

在您的第二個活動中,將s聲明爲實例變量。

String s; 

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

    s = getIntent().getExtras().getString("testString"); 
    Log.v(SecondActivity.class.getSimpleName(), s); 

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(SecondActivity.this, ThirdActivity.class); 
      Bundle bundle = new Bundle(); 
      bundle.putString("testString", "TestString"); 
      i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 
} 

的代碼從頂部讀出向下並分配給一個變量的某些方法內的值將僅持續直到指針到達該方法的onCreate的最後括號。點擊監聽器可以在任何時候發生,具體取決於用戶當然,到那個時候值不再存在,所以你得到一個空值。

將值賦給Instance變量將持續到該實例的壽命。因此,該變量的任何用法都將保證前一次分配的某個值的恢復。

同時考慮到當您的活動在後臺時沒有足夠的內存時,操作系統可能會終止活動(從活動堆棧中退出)。如果發生這種情況,使用onSaveInstanceState(Bundle outState)會更安全。