通过AsyncTask将第一个活动的值传递给第三个活动

时间:2017-01-29 10:49:15

标签: android android-activity android-asynctask global-variables

我有一个在线订购系统,用户可以从中完成订单,至少需要三个步骤。以下每个步骤都是一项单独的活动:

  1. 选择计划
  2. 选择开始日期
  3. 根据步骤1中选定的计划选择内容。
  4. 现在我在第1步中所做的是,一旦用户点击了计划和订单,下面的代码就会运行onClick。

    Intent intent = new Intent(context, SelectDate.class);
    
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    Bundle extras = new Bundle();
    
    extras.putString("pass_selected_meal_plan_id",mp_id_pass);
    extras.putString("pass_selected_meal_name",mp_name_display);
    
    intent.putExtras(extras);
    
    context.startActivity(intent);
    
    Toast.makeText(context, mp_name_display+" Selected",
    Toast.LENGTH_SHORT).show();
    

    否则在第二个Activity中,我要求用户选择订单开始日期。这也很简单,没有任何问题。但是当我试图切换到第三个活动时,问题就开始了。

    由于我的第三个活动内容取决于第一个活动中的计划选择,因此我必须将选定的ID转移到第三个活动。我在第二个活动的Extra Bundle中有#34; pass_selected_meal_plan_id"。

    我加载第三项活动的方式也很重要。有两种方法可以启动第三项活动。首先是点击下一个按钮非常简单。我假设转移所需的选择也很简单。但在这种情况下,据我所知,作为Android App Development的初学者,我必须根据所选计划提供一个按钮来点击和加载内容。

    第二种方式是我想要使用的方式。我正在第二个活动onClick Next上运行AsyncTask。它工作得非常好。唯一的一点就是我无法从上一个Activity中的onPostExecute获取exxt,即第一个活动。

    我甚至愿意使用全局变量,但我真的不知道该怎么做。知道全局变量是什么,我不太热衷于使用它们。

    这是我的onPostExecute代码:

    @Override
    protected void onPostExecute(String result) {
        Intent intent = new Intent(ctx, SelectMeals.class);
    
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
        Bundle extras = new Bundle();
    
        //Instead of "1" I want the value from previous Activity, which already available in Extras from previous Activity
        extras.putString("pass_selected_meal_plan_id", "1");
    
        //This is the second value I want to be transferred from first activity to the third activity
        extras.putString("pass_selected_meal_name","Test");
    
        intent.putExtras(extras);
    
        ctx.startActivity(intent);
    }
    

    如果有人可以提供帮助,我们将非常感激。

1 个答案:

答案 0 :(得分:2)

您可以使用以下代码

在你的第二个活动中

// declare global variables

String id;
String name;

onCreate

中使用以下代码
Bundle bundle = getIntent().getExtras();

//Extract the data…
 id = bundle.getString("pass_selected_meal_plan_id");  
 name = bundle.getString("pass_selected_meal_name");  

现在在你的Asynctask中,在启动第三个活动之前编写下面的代码。

@Override
protected void onPostExecute(String result) {
    Intent intent = new Intent(ctx, SelectMeals.class);

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Bundle extras = new Bundle();         
    extras.putString("pass_selected_meal_plan_id",id); // first activity data
    extras.putString("pass_selected_meal_name",name); // first activity data
    intent.putExtras(extras);

    ctx.startActivity(intent);
}

最后,您可以在第三个活动中获取这些值。

我要强调的一点是避免使用通用变量名称,例如: ID。它在本答复中仅供参考,但并不是一个好主意。您可能面临的一个明显问题是Refactor>改名。它甚至会改变XML文件中的@ + id。