2016-06-18 73 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)会更安全。