0

私は、ステーショナリー、ブック、ペンという名前の 3 つのアクティビティを持つ Android アプリのサンプルを開発しています。Books and Pens アクティビティから Stationary アクティビティにデータを送信したいと考えています。ステーショナリー アクティビティでは、本またはペンのいずれかのアクティビティからデータを受信すると正常に動作しますが、両方のアクティビティからデータを受信すると、アプリが「予期せず停止します」

この点でいくつかのコードを開発しました。以下で確認できます。

私の本の活動では、次のコードを使用しています。

    // 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;
     }

私のペンアクティビティでは、フローコードを使用しています。

// 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;
     }

上記の 2 つのアクティビティである Books と Pens から Stationary アクティビティでデータを受信します。次のコードを使用しています。

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


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

注: 本またはペンの 1 つのアクティビティからデータを受信すると正常に動作しますが、両方のアクティビティからデータを受信すると、アプリが「予期せず停止します」

4

3 に答える 3

1

これは、BookActivityからインテントを渡そうとすると、「penSelected」がnullになり、それ以外の場合は「bookSelected」がnullになるためです。したがって、明らかにここでNullPointerExceptionが発生します。

単純に厄介な解決策は、それらを別々のtrycatchブロックで囲むことです。または、別のデータを送信して、渡されているアクティビティを識別し、それに基づいて必要なフィールドのみを取得する必要がある場合があります。

たとえば、PenActivtyから来た場合、「penSelected」のみを取得して他の1つを残すことができ、その逆も可能です。

したがって、ここで理解する必要があるのは、どちらの場合もオブジェクト「extras」がnullになることはなく、上記のキーのいずれか1つだけがnullになるということです。したがって、そこでnullをチェックすることはできません。

編集

結局、それは真実ではないと思います。以下のコードを使用して、バンドルオブジェクトにキーが含まれているかどうかを確認できます。

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

選択内容を設定ファイルに保存する方が簡単だと思います。このようにして、データの送信、アクティビティの順序、またはそれらがまだ生きているかどうか、または電話をリセットした後でも、データを保存することを心配する必要はありません。データの保存に関するチュートリアルを参照してくださいが、基本的には次のようなものです。

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

フォースクローズを受け取る理由は、前のアクティビティからのデータしか受け取れないためだと思います。アクティビティAがアクティビティCにaを送信し、アクティビティBがbをCに送信する場合は、次のようにする必要があります。

ステップ1)アクティビティAからアクティビティBにaを送信します(開始されます)

ステップ2)アクティビティBからb aをアクティビティCに送信します(開始されます)

それが役に立てば幸い:)

于 2012-10-10T12:24:21.937 に答える
0

「新しいアクティビティが開始されるたびに、前のアクティビティは停止されますが、システムはアクティビティをスタック (「バック スタック」) に保存します。」活動内容

于 2012-10-10T12:09:04.837 に答える