完成,重新加载活动

时间:2011-11-15 13:03:50

标签: java android android-activity

我有应用程序,其中活动A允许设置一些选项并启动(点击按钮后)活动B.用户可以在B中做一些事情,当他完成时,他有选择(RadioButtons):

  1. 重复 - 这意味着B活动将使用相同的选项(取自A)再次运行,
  2. new - 表示应用程序完成B Activity并返回A,用户可以再次设置选项并再次启动B,
  3. 结束 - 它从应用程序中消失(我想它应该完成B然后是A活动)。
  4. 首先我这样做了:

            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 个答案:

答案 0 :(得分:3)

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

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

活动A:

    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(); 

这是基本的。您也可以来回管理布尔,阵列,所有你想要的东西(由一个捆绑包进入)。把它放在捆绑中然后去:) 不要忘记在Manifest中声明您的类(活动),否则会抛出异常运行时。

答案 1 :(得分:2)

首先,您需要跟踪用于调用B的Intent。尝试将意图的putExtra()方法转换为B.您还可以将所有内容打包成Bundle并使用getExtras()恢复它(如果我没记错的话,那就是方法名称)。在B上时,读取用于调用它的Intent并保存参数。您还需要startActivityForResult(B)才能使以下工作。

  

重复 - 这意味着B活动将使用相同的选项再次运行   (取自A),

在这种情况下,您可能希望再次使用FLAG_ACTIVITY_SINGLE_TOP标志从B调用活动B.我假设您不希望有两个B实例。否则,就是不要使用旗帜。

再次从意图(来自A)收到Bundle,并在onNewIntent()方法中捕获它(如果使用单顶)(或者通常,onCreate,如果不是单顶) 。它是这样的:B - > B onPause() - > B onNewIntent() - > B onResume()。

  

new - 表示应用程序完成B Activity并返回A,   用户可以再次设置选项并再次启动B,

根据您想要的确切行为,您可以使用FLAG_ACTIVITY_REORDER_TO_FRONT致电A.在这种情况下,你最终得到前景中的A和背景中的B(按下后面将回到B)。

如果你不再想要B,你可以打电话给finish(),并想回到A.

  

结束 - 它从应用程序中消失(我想它应该完成B和   然后A活动)。

在B上执行任何操作,setResult()执行类似“RESULT_FINISH_EVERYTHING”的操作,并在处理A中的结果时(覆盖“onActivityResult()”,IIRC),也完成活动A.

  

但是我看到根据不可能设置不同的结果   选择了RadioButton。

你可以根据单选按钮中选中的thw按钮设置setResult()。您可以将侦听器设置为单选按钮组并读取选择的按钮。如果您需要针对eadch个人单选按钮的操作,请参阅RadioGroup.OnCheckedChangeListenerView.OnClickListener

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

祝你好运!