0

我正在开发一个示例 android 应用程序,其中包含三个名为 Stationary、Books 和 Pens 的活动。我想将 Books and Pens 活动的数据发送到 Stationary 活动。在固定活动中,当我从书籍或笔中的一项活动接收数据时,它工作正常,但是当我从这两个活动中接收数据时,我的应用程序“意外停止”

我在这方面开发了一些代码,您可以在下面查看。

在我的 Book 活动中,我使用以下代码。

    // in Book Activity
public boolean onKeyDown(int keyCode, KeyEvent event) 
     {
         if ((keyCode == KeyEvent.KEYCODE_BACK))
         {  



                if(myBookSelected)
                {   
                Intent intent = new Intent(Books.this,Stationary.class);
                intent.putExtra("bookSelected", books.toString());
                startActivity(intent);
                }

                else
                {
                    Toast.makeText(getApplicationContext(), "Please select books", Toast.LENGTH_LONG).show();
                }

          }

         return true;
     }

并在我的 Pens Activity 中使用流动代码。

// in Pen Activity
public boolean onKeyDown(int keyCode, KeyEvent event) 
     {
         if ((keyCode == KeyEvent.KEYCODE_BACK))
         {  



                if(myPenSelected)
                {   
                Intent intent = new Intent(Pens.this,Stationary.class);
                intent.putExtra("penSelected", pens.toString());
                startActivity(intent);
                }

                else
                {
                    Toast.makeText(getApplicationContext(), "Please select Pens", Toast.LENGTH_LONG).show();
                }

          }

         return true;
     }

从上述两个活动即书籍和笔中接收固定活动中的数据。我正在使用以下代码。

// in Stationary Activity
Bundle extras = getIntent().getExtras();


            if (extras != null)
            {   
                numberOfBooks = extras.getString("bookSelected");
                numberOfPens = extras.getString("penSelected");
            }

注意:当我从 Books 或 Pens 一项活动接收数据时,它工作正常,但是当我从这两项活动接收数据时,我的应用程序“意外停止”

4

3 回答 3

1

这是因为当您尝试从 BookActivity 传递 Intent 时,您的“penSelected”将为空,而在另一种情况下,“bookSelected”将为空。所以很明显你会在这里遇到 NullPointerException 。

一个简单的讨厌的解决方案是将它们包围在单独的 try catch 块中。或者您可能必须发送另一个数据来识别您从哪个活动传递,并基于该数据仅获取必填字段。

例如,假设您来自 PenActivty,那么您只能获得“penSelected”而留下另一个,反之亦然。

因此,您必须在这里了解的是,在这两种情况下,您的对象“附加项”都不会为 null ,但只有上述任何一个键将为 null。所以你不能在那里检查 null 。

编辑

我相信这毕竟不是真的。您可以使用以下代码检查 Bundle Oject 是否包含密钥,

 if(getIntent().hasExtra("bookSelected"))
{
         // do your code.. 
}
于 2012-10-10T12:07:04.140 回答
0

“每次新活动开始时,前一个活动都会停止,但系统会将活动保留在堆栈(“后堆栈”)中。” 活动

于 2012-10-10T12:09:04.837 回答
0

我认为将您的选择简单地保存在首选项文件中会更容易。这样您就不必担心发送数据、活动顺序或它们是否仍然存在,甚至在手机重置后您仍然可以保存数据。请参阅有关保存数据的教程,但基本上是这样的:

...
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(getString(R.string.pen_selected), penSelected);
editor.commit();
....

我认为您收到强制关闭的原因是因为您只能从以前的活动中接收数据。如果您希望活动 A 将a发送到活动 C,而活动 B 将b发送到 C,那么您应该:

Step1)从活动A发送a到活动B(并开始)

Step2)从活动B发送b a到活动C(并开始)

希望能帮助到你:)

于 2012-10-10T12:24:21.937 回答