2016-12-17 9 views
3

私はアンドロイドスタジオのインテントから結果を返そうとしています。私のメインで複数のアクティビティからgetResultsを処理する方法は?

私は新しいstartActivityForResult(i, 2)

を呼び出しています活動を開始し、私はその後、活動1で私のフラグメントでの活動からmainActivityで2者が結果を得る setResults()

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 1) { 
     if(resultCode == RESULT_OK){ 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
       String name = extras.getString("FIRSTNAME"); 
       String Lname = extras.getString("LASTNAME"); 
       int ID = extras.getInt("ID"); 

       //TODO: Get the list fragment to newinstance with out new arraylist 

       Person p = new Person(name, Lname, ID); 
       people.add(p); 
       getFragmentManager().beginTransaction().replace(R.id.content_main, FullList.newInstance(people)).commit(); 
      } 

を使用startActivityForResult(intent, 1)

を使用

アクティビティ3のsetResults() を取得するための主なアクティビティを取得するにはどうすればよいですか?

活動3はこれをやっている:私は私の主な活動のコールにif (requestCode == 2)

を持ってしようとしています。しかし、それは無駄に動作します

Intent deleteIntent = new Intent(); 
deleteIntent.putExtra("FNAME", first); 
deleteIntent.putExtra("LNAME", last); 
deleteIntent.putExtra("ID", num); 
setResult(RESULT_OK, deleteIntent); 
finish(); 

。ここで

は、参考のために、すべてのonActivityResultである:ここでは

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 1) { 
     if(resultCode == RESULT_OK){ 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
       String name = extras.getString("FIRSTNAME"); 
       String Lname = extras.getString("LASTNAME"); 
       int ID = extras.getInt("ID"); 

       //TODO: Get the list fragment to newinstance with out new arraylist 

       Person p = new Person(name, Lname, ID); 
       people.add(p); 

       getFragmentManager().beginTransaction().replace(R.id.content_main, FullList.newInstance(people)).commit(); 
      } 

      // NOW SEEING IF THE DETAILS SCREEN PASSED BACK RESULTS 

     } else if (requestCode == 2) { 
      if (resultCode == RESULT_OK) { 
       Bundle extras = data.getExtras(); 
       if (extras != null) { 
        String name = extras.getString("FNAME"); 
        String Lname = extras.getString("LNAME"); 
        int ID = extras.getInt("ID"); 

        Person p = new Person(name, Lname, ID); 
        // Delete happens here // 
        if (people.contains(p)) { 
         people.remove(p); 
         // If empty show blank frag, if not, update list // 
         if (people.isEmpty()) { 
          getFragmentManager().beginTransaction().replace(R.id.content_main, BlankList.newInstance()); 
         } else { 
          getFragmentManager().beginTransaction().replace(R.id.content_main, FullList.newInstance(people)).commit(); 
         } 

        } else { 
         Toast.makeText(this, "DIDNT RECEIVE SAME INFO", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     } 
     // END ELSE CHECK 
    } 
} 

は、それが何を」ちょっと不明だアクティビティ1.

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    //super.onListItemClick(l, v, position, id); 

    ArrayList<Person> people = (ArrayList<Person>) getArguments().getSerializable(ARG_People); 

    if (people != null && position != -1) { 
     Person listPerson = people.get(position); 
     Intent i = new Intent("OPENDETAILS"); 
     i.putExtra("NAME", listPerson.name); 
     i.putExtra("LASTNAME", listPerson.lName); 
     i.putExtra("ID", listPerson.ID); 
     startActivityForResult(i, 2); 
    } else { 
     Toast.makeText(getActivity(), "EMPTY LIST ERROR", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

それはちょうどここに残りを置く正しい –

+0

であるため、 '(requestCode == 2)場合'含む関連するコードを示してください! –

+0

'Person'はComparableを実装していますか、equalsメソッドを実装していますか?それ以外の場合 'if(people.contains(p)){'は動作しません。 –

答えて

3

にフラグメントでstartActivityForResult()を呼び出しているコードです再試行しますが、次のように聞こえます:

  1. アクティビティ1が結果のためにアクティビティ2を開始します
  2. Activity2がActivity3結果
  3. ためActivity3を開始しますがActivity1がActivity3の結果を受けると予想される結果
  4. を返します。

ここで欠落しているように見える重要な要素は、Activity1が結果のためにそれを開始したActivity2であっても、Activity1から結果を得ることを期待していることです。この場合、Activity2にonActivityResultを実装し、Activity3から戻ってくる結果を処理し、Activity2の結果として設定してActivity1に戻してから終了する必要があります。アクティビティは、startActivityForResultによって直接開始されるアクティビティの結果のみを受信します。

+0

この素早く試してみましょう!これは私がそれを設定した方法です、そして、それがこの情報を得るためにはどうすればいいのでしょうか? –

+0

私は、アクティビティ1でアクティビティ3のstartActivityForResult()を呼び出すことができるインターフェイスをアクティビティ2に実装できますか? –

+0

いいえ、OOのやり方でこのようなことをしないようなアクティビティ間にかなりハードコアのシリアライズ境界があります。 (ActivityXはActivityYのインスタンスを直接参照できません)必要に応じてブロードキャストイベントを使用できますが、アクティビティ結果IMOよりも優れているとは限りません。 – Nick

1

様々な活動を起動に使用する別のコードは、そのような

その後、

Person1.class

return_intent.putExtra("result", 1); 
setResult(1, return_intent); 
これらのクラスにRetrun結果を設定activityresult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (resultCode) { 

     case 1: 
      //implement your code here 
      break; 

     case 2: 
      //implement your code here 
      break; 

     case 3: 
       //implement your code here 
      break; 
    } 
} 

に続い

startActivtityForResult(new Intent(this,Person1.class),1); 
startActivtityForResult(new Intent(this,Person2.class),2); 
startActivtityForResult(new Intent(this,Person3.class),3); 

として

Person2。クラス

Person1.class 

return_intent.putExtra("result", 2); 
setResult(2, return_intent); 

Person3.class

Person1.class 

return_intent.putExtra("result", 3); 
setResult(3, return_intent); 
+1

これは問題ではないのですか? –

+1

あなたはアクティビティ3の結果を取得したいので、結果コードではなくインテントを返す場合は、結果コードも返します。 –

関連する問題