2011-11-15 83 views
1

我有应用程序,其中活动A允许设置一些选项和启动(点击后按钮)活动B.用户可以做B中的东西,当他完成,他有选择(单选按钮):完成,重新加载活动

  1. 重复 - 这意味着B活动将与(从拍摄)相同的选项再次运行,
  2. 新的 - 这意味着应用程序完成B活动并回到A,其中用户可以重新设置选项,然后再入门C ,
  3. 结束 - 它从应用程序中退出(我想它应该完成B然后A活动)。

首先,我已经做了这种方式:

 Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 

我可以用另一种方式是清除本次活动的所有参数,但上面更迅速。第二只是finish()

三是最大的问题,我不知道如何去做到这一点。我尝试了startActivityForResult(),onActivityResult()setResult(),但我看到根据选定的RadioButton设置不同的结果是不可能的。

我发现另一种方法是

public static void closeAllBelowActivities(Activity current) { 
boolean flag = true; 
Activity below = current.getParent(); 
if (below == null) 
    return; 
System.out.println("Below Parent: " + below.getClass()); 
while (flag) { 
    Activity temp = below; 
    try { 
     below = temp.getParent(); 
     temp.finish(); 
    } catch (Exception e) { 
     flag = false; 
    } 
} 
} 

source

但不知道如何把当前活动。

你能帮我解决吗?

回答

2

首先,你需要跟踪用来调用B.尝试意图putExtra()方法B.您也可以打包一切都变成Bundle并与getExtras()恢复Intent的(如果我没有记错,这是方法名称)。在B上时,请阅读用于调用它的Intent并保存参数。你还需要startActivityForResult(B)以便以下工作。

重复 - 这意味着B活动将与 (从拍摄)相同的选项再次运行,

你可能想打电话,从B,活动B再次使用在FLAG_ACTIVITY_SINGLE_TOP标志这个案例。我假设你不想有两个B实例。否则,只是不要使用该标志。

Bundle你从意向(从A)再次接收,抓住它的onNewIntent()方法(如果使用单顶)(或直接按正常情况,的onCreate,如果不是单一的顶部)。它是这样的:B - > B onPause() - > B onNewIntent() - > B onResume()。

新的 - 这意味着应用程序完成B活动并回到A, 在那里用户可以重新设置选项,然后再开始B,

根据您想要的确切行为,你可以调用与FLAG_ACTIVITY_REORDER_TO_FRONT。在这种情况下,最终会在前景中出现A,在后台出现B(后退将回到B)。

或者你可以调用finish(),如果你只是不希望B了,想回去A.

结束 - 从应用熄灭(我想它应该完成B和 然后A活动)。

做第B没什么,的setResult(),以类似 “RESULT_FINISH_EVERYTHING”,并在A(覆盖 “onActivityResult()”,IIRC)录取结果的照顾时,完成活动A也。

,但我认为这是不可能取决于 选择单选按钮来设置不同的结果。

您可以根据单选按钮中选中的按钮设置结果()。您可以将收听者设置为收音机组并阅读选择哪个按钮。如果您需要eadch个人单选按钮的操作,请参阅RadioGroup.OnCheckedChangeListenerView.OnClickListener

真的,不是太复杂。这取决于你想要什么。如果你愿意,我可以澄清这一切。

祝你好运!

+0

也谢谢** David **!现在一切正常! – bLAZ

+0

不客气!我很高兴我解释了你的应用中需要的所有通用设计ceoncept。 – davidcesarino

3

“我看到根据所选RadioButton设置不同的结果是不可能的”对我来说并不是很清楚。无论如何,我建议你我会做什么:活动A用startActivityForResult()启动Activity B并等待来自B的bundle。当你从B到A构建出口函数时,用你的结果创建一个bundle。在A中,您将分析来自B的捆绑包并决定如何处理。如果您退出,请致电完成()。

编辑:好,这可能是你的情况:

活动答:

public class XY extends Activity { 
    // you need that as a flag to go back and forth: 
      protected static final int SUB_ACTIVITY_REQUEST_CODE_04 = 5337; // choose the number you want... 
    int result_from_B; // I usually use an int, choose as you want.... 
    static final String KEY_FROM_B = "mKey"; 
    @Override 
     protected void onActivityResult(int result,int resultCode,Intent data) { 
     super.onActivityResult(result, resultCode, data); 
    if (result == SUB_ACTIVITY_REQUEST_CODE_04) { 
      if (data!=null){ 
       Bundle extras = data.getExtras(); 
       result_from_B = extras.getInt(XY.KEY_FROM_B); 
if (result_from_B==1) { 
// do what you want 
} else { 
// do somthing else... 
} 
} 

要调用的活动B,使用:

Intent i = new Intent(this, 
        ActB.class); 
      this.startActivityForResult(i,SUB_ACTIVITY_REQUEST_CODE_04); 

在活动B:

public class ActB extends Activity{ 
    protected final int SUCCESS_RETURN_CODE = 1; // you need it to come back 
int result; // this is the result to give to activity A 
} 
// in the function to build the output: 
// I suppose you have already put something in result: 
Bundle bundle = new Bundle(); 
      bundle.putInt(XY.KEY_FORM_B, result); 
      Intent mIntent = new Intent(); 
      mIntent.putExtras(bundle); 
      ActB.this.setResult(SUCCESS_RETURN_CODE,mIntent); 
      finish(); 

这是b ASIC。你还可以管理布尔数组,来回数组,所有你想要的(被一个bundle承认)。只要把它放在一个包中去:) 不要忘记在清单中声明你的类(活动),否则它会抛出一个异常运行时。

+0

“我看到根据选定的RadioButton设置不同的结果是不可能的” 这意味着我不知道如何切换setResult在选中某个RadioButton时拥有的选项。但这是我的错误理解。 我想我现在明白了: 我不能例如setResult(1)当RadioButton1被选中时,setResult(2)当RadioButton2被选中时......然后根据结果值决定在主要活动中做什么。 – bLAZ

+0

但是我看到我可以在setRessult()中放入resultCode而且还放入Intent数据,并用这个做出决定。这可以提示你** Zappescu **想给我什么。所以我可以将数据放入捆绑包中,然后捆绑到意图中。 不幸的是还有问题,有“失败的结果ResultInfo {谁= null,请求= 77,结果= 0,数据=空}到活动”。 你知道也许有些例子吗? – bLAZ

+0

好的。所以你可以做到,只需创建一个包含结果的包(在B中),当你回到A时,从包中获取结果。捆绑就像一个信息活动之间的信息。你可以反复使用它,从一个活动切换到另一个活动,它们非常有用。编辑:我刚刚阅读你的答案。那么,我有什么东西写在什么地方...给我时间去接。 – Zappescu