在多个活动之间传递信息

时间:2013-07-26 17:30:25

标签: android android-intent android-activity

我会喜欢一些帮助(对于Android来说是个新手)。

我目前有4个活动。前三个活动中包含EditText字段,然后最终活动显示到目前为止输入的所有信息。看起来很简单,对吧?

所以在查看这个网站后,我发现这样做的方法是使用putExtra()和getExtra();

这似乎不太有效,因为我添加到extras hashset的所有内容在最终活动中都不可用。有什么建议吗?

由于

以下代码寻求帮助

package com.example.smallchangebigloss;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class EnterName extends Activity {
    private EditText edit;
    private  Bundle extras = getIntent().getExtras();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_enter_name);
        edit = (EditText) findViewById(R.id.nameEdit);

    }

    public Bundle getExtras(){
        return extras;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.enter_name, menu);
    return true;
}

public void next(View view) {
    if (edit.getText().toString().equals("")) {
        new AlertDialog.Builder(this).setTitle("Ut Oh!")
                .setMessage("Please enter your name.")
                .setNeutralButton("Try again", null).show();
    }
    else {
        Intent i = new Intent(getApplicationContext(), CurrentWeight.class);
        i.putExtra("name", edit.getText().toString());
        startActivity(i);
    }
}

}

 package com.example.smallchangebigloss;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
 import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

公共类CurrentWeight扩展了Activity {

private EditText edit;
private String name;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_current_weight);
    Bundle extras = getIntent().getExtras();
    name = extras.getString("name");
    edit = (EditText) findViewById(R.id.currentWeightEdit);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.current_weight, menu);
    return true;
}

public void next(View view) {
    if (edit.getText().toString().equals("")) {
        new AlertDialog.Builder(this).setTitle("Ut Oh!")
                .setMessage("Please enter your current weight.")
                .setNeutralButton("Try again", null).show();
    }
    else {
        Intent i = new Intent(getApplicationContext(),GoalWeight.class);
        i.putExtra("name", name);
        i.putExtra("current", edit.getText().toString());
        startActivity(i);
    }
}

}

package com.example.smallchangebigloss;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

公共类GoalWeight扩展了Activity {

private EditText edit;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_goal_weight);
    Bundle extras = getIntent().getExtras();
    System.out.println(extras.containsKey("name"));
    extras.containsKey("current");



    edit = (EditText) findViewById(R.id.currentWeightEdit);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.goal_weight, menu);
    return true;
}

public void next(View view) {
    if (edit.getText().toString().equals("")) {
        new AlertDialog.Builder(this).setTitle("Ut Oh!")
                .setMessage("Please enter your Goal Weight.")
                .setNeutralButton("Try again", null).show();
    }
    else {
        Intent i = new Intent(getApplicationContext(), Complete.class);
        i.putExtra("goal", edit.getText().toString());
        startActivity(i);

    }
}

}

package com.example.smallchangebigloss;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class Complete extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();

//         TextView current = (TextView) findViewById(R.id.completeCurrentMod);
//         current.setText("hi");
////         current.setText(extras.getString("current"));   These lines break it

        setContentView(R.layout.activity_complete);
        System.out.println("name: " + extras.getString("name") + "Current weight: "
                + extras.getString("current") + "goal: " + extras.getString("goal"));//Only displaying last ones...bundle them everytime in each class?
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.complete, menu);
        return true;
    }

}

5 个答案:

答案 0 :(得分:2)

您似乎没有将所有extras附加到每个新Intent。由于您需要在每个Intent中创建新的Activity,因此您还需要附加上一个extras中的所有Activities。最简单的方法是创建Bundle然后在每个活动中获取此Bundle,并每次将新extras添加到Bundle

您可以采用另一种方式,因此您无需跟踪每个extrasBundle即可使用SharedPreferences。只需将值添加到新的首选项,然后在最终的Activity中获取所有值。该链接有一个创建和获取SharedPreferences

的好例子

答案 1 :(得分:1)

以下是您的代码正在做的事情:

活动1:

Start with no extras
Create and save extra called "name"

活动2:

Read name out of extras
create and save extra called "current"
save the value of name

活动3:

Read the whole bundle of extras
Create and save extra called "goal"
//Do nothing with the whole bundle 

活动4:

Read the whole bundle of extras

在活动3的内部,您将从额外内容中提取值,但不会“重新保存”它们,以便它们被传递到最终活动。因此,当你进入activity4时,你应该拥有的唯一额外内容是"goal",因为这是你在Activity3末尾添加的唯一内容。

答案 2 :(得分:1)

您面临的问题是您需要将每个类中的值从一个类传递到另一个类。因此,在GoalWeight活动中,您还需要传递“名称”和“当前”值。

开始下一个活动时,请执行以下操作。

Intent i = new Intent(getApplicationContext(), Complete.class);
        i.putExtra("goal", edit.getText().toString());
        i.putExtra("name", extras.getString("name"));
        i.putExtra("current", extras.getString("current"));
        startActivity(i);

答案 3 :(得分:1)

您正在每个文本输入活动中创建一个新的Intent并开始完成活动。 第一次创建Complete Activity实例时,您将获得额外的Intent,具体取决于触发的Activity,来自该Activity的意图。

如果您的完整活动被销毁并重新创建,那么它只会从创建它的人那里获得意图。

现在,如果您的完整活动已经创建并正在运行,并且您正在从其他活动中解雇意图,那么您应该看一下

http://developer.android.com/reference/android/app/Activity.html#onNewIntent(android.content.Intent)

 @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        // get your new intent data here
    }

顺便说一句,在一个真实世界的应用程序中,你不会成为遍布各个活动的输入字段,所以我假设你只是尝试一下,这很酷。

答案 4 :(得分:0)

在第一个Activity中,将字符串转换为EditText中的变量。

Intent in = new Intent(getApplicationContext(), B.class);
in.putExtra("TAG", String);
startActivity(in);

在第二项活动中,通过

获取
Intent x = getIntent();
String variable = x.getStringExtra("TAG");

等等..