2016-12-17 30 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的结果,并且你的意图不是返回结果代码,也返回结果代码。 –

相关问题