2016-12-17 59 views
3

我想從android工作室的意圖回來的結果。如何處理來自多個活動的getResults?

在我主我開始一個活動,並使用startActivityForResult(intent, 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(); 
      } 

在我的片段在活動1我打電話了新startActivityForResult(i, 2)

我如何獲得主要活動以從活動3獲取setResults()

活動3是這樣做的:

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

我試圖讓我的主要活動通話if (requestCode == 2)

但它的工作原理無濟於事。

下面是引用的所有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 
    } 
} 

這裏是正在調用片段中的startActivityForResult()上的活動代碼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

請出示含有相關代碼'如果(requestCode == 2)',因爲這是正確的 –

+0

只是把其餘的在這裏! –

+0

'Person'是否實現了Comparable或是否實現了equals方法?否則'if(people.contains(p)){'將不起作用 –

回答

3

這是一個有點不清楚你」重試,但聽起來像:

  1. Activity1啓動Activity2的結果
  2. 活性2的結果開始Activity3
  3. Activity3返回結果
  4. 活性1有望獲得Activity3的結果。

如果我明白了,那麼這裏似乎缺少的關鍵元素是您期望Activity1從Activity3獲取結果,即使它是Activity2啓動它的結果。在這種情況下,您應該在Activity2中執行onActivityResult,處理從Activity3返回的結果,並將它們設置爲Activity2的結果以返回到Activity1,然後完成;一項活動只​​會通過startActivityForResult直接從其活動中獲得結果。

+0

讓我試試這個真快!這是我建立的方式,我想知道它是如何工作才能得到這些信息的! –

+0

我可以讓活動2實現一個接口,活動1可以重寫,調用Activity 3上的startActivityForResult()? –

+0

Nope在活動之間存在一個非常頑固的序列化邊界,以防止以OO方式執行此類事情。 (ActivityX不應該能夠直接引用ActivityY的一個實例)如果你願意,你可以使用廣播事件,但它不會比活動結果IMO更好。 – Nick

1

使用不同的代碼,推出不同的活動, 如

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

然後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; 
    } 
} 

然後設置Retrun導致這些類

Person1.class

return_intent.putExtra("result", 1); 
setResult(1, return_intent); 
Person2。

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

你想抓取Activity 3的結果,並且你的意圖不是返回結果代碼,也返回結果代碼。 –

相關問題