使用意图在活动之间传递数据

29

我正在尝试在Activity之间传递数据。

我使用意图(Intent)在普通Activity之间传递数据。

考虑下面的代码:

AndroidTabRestaurantDescSearchListView.java

public class AndroidTabRestaurantDescSearchListView extends TabActivity {

    // TabSpec Names
    private static final String INBOX_SPEC = "Rating";
    private static final String OUTBOX_SPEC = "Price";

    Button Photos;
    Button Filter;
    Button Search;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TabHost tabHost = getTabHost();

        // Inbox Tab
        TabSpec inboxSpec = tabHost.newTabSpec(INBOX_SPEC);
        Intent inboxIntent = new Intent(this, RatingDescriptionSearchActivity.class);
        inboxSpec.setIndicator(INBOX_SPEC);
        // Tab Content
        inboxSpec.setContent(inboxIntent);

        // Outbox Tab
        TabSpec PriceSpec = tabHost.newTabSpec(OUTBOX_SPEC);
        Intent PriceIntent = new Intent(this, PriceDescriptionSearchActivity.class);
        PriceSpec .setIndicator(OUTBOX_SPEC);
        PriceSpec.setContent(PriceIntent);


        // Adding all TabSpec to TabHost
        tabHost.addTab(inboxSpec); 
        tabHost.addTab(PriceSpec); 

        //Set the current value tab to default first tab
        tabHost.setCurrentTab(0);

    }

}
假设我从另一个名为Activity-1的活动中作为意图将数据发送到AndroidTabRestaurantDescSearchListView,现在如何在AndroidTabRestaurantDescSearchListView中接收来自Activity-1的数据,然后再传递给RatingDescriptionSearchActivity

图示表示如下:

enter image description here

{编辑} -- 如果基于答案这是可能的 --- 因为AndroidTabRestaurantDescSearchListView是一个选项卡活动,所以存在歧义。

TabSpec inboxSpec = tabHost.newTabSpec(INBOX_SPEC);
        Intent inboxIntent = new Intent(this, RatingDescriptionActivity.class);
        intent.putExtra("keyName", value);
        inboxSpec.setIndicator(INBOX_SPEC);
        // Tab Content
        inboxSpec.setContent(inboxIntent);

请查看此链接以获取帮助:https://dev59.com/dGMl5IYBdhLWcg3wJUEC#18649849 - Haresh Chhelana
7个回答

64

将数据从Activity-1传递到AndroidTabRes..,如下所示:

在发送活动中...

Intent intent = new Intent(current.this, AndroidTabRestaurantDescSearchListView.class);
intent.putExtra("keyName","value");
startActivity(intent);

AndroidTabRes.. 活动中...

  String data = getIntent().getExtras().getString("keyName");

因此,您可以在接收活动中从发送活动获取数据...

在您的 AndroidTabRestaurantDescSearchListView 类中,进行如下操作:

String value= getIntent().getStringExtra("keyName");

Intent intent = new Intent(this, RatingDescriptionSearchActivity.class);
intent.putExtra("keyName", value);
startActivity(intent);

然后在你的 RatingDescriptionSearchActivity 类中,执行以下操作:

 String data= getIntent().getStringExtra("keyName");

请查看更新的问题......我的歧义在于其中一个是选项卡活动......根据您的答案,我是否按照正确的方式进行了编辑?请看编辑。 - Devrath
那么你的问题是什么? - GrIsHu
在编辑中....我有没有提到传递数据的正确方式....因为在TabActivity中...我们从来不使用startActivity(--);所以...我感到困惑! - Devrath
那没关系,你可以按照我展示的方式传递并获取数据。 - GrIsHu
如果活动已经在运行,是否需要执行 startActivity(i); ?我的意思是,我能否让 活动A 调用 活动B,并且返回数据给 活动A?我是否感到困惑? - Francisco Corrales Morales

7
尝试在你的AndroidTabRestaurantDescSearchListView活动中使用此代码。
Intent intent  = new Intent(this,RatingDescriptionSearchActivity.class );
intent.putExtras( getIntent().getExtras() );
startActivity( intent );  

然后从 RatingDescriptionSearchActivity 活动中调用。
getIntent().getStringExtra("key")

请查看已编辑的问题...我的疑惑是因为中间的活动是一个选项卡活动。 - Devrath
1
答案仍然是一样的,你必须从第一个活动发送一个“Intent”到“TabActivity”,当你想要启动第三个活动时,你必须执行答案设置。 - Jans

5
您可以使用Bundle来获取数据:
Bundle extras = intent.getExtras();
String data = extras.getString("data"); // use your key 

再次,您可以将此数据传递到下一个活动中:

 Intent intent = new Intent(this, next_Activity.class);
   intent.putExtra("data", data);
   startActivity(intent);

如果活动已经在运行,是否需要执行 startActivity(i); ?我的意思是,我能否让 活动A 调用 活动B,并且返回数据给 活动A?我是否感到困惑? - Francisco Corrales Morales
1
当B完成时,您可以使用StartActivityForResult从B返回结果到Activity A。 - SweetWisher ツ
太好了,这似乎很有用!你知道StartActivityForResult能否与AsynkTask一起使用吗? - Francisco Corrales Morales
是的,你也可以在 AsynkTask 中使用它.... :) 很高兴看到它对你有用.. :) - SweetWisher ツ

3

主活动

public class MainActivity extends Activity {

    EditText user, password;
    Button login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        user = (EditText) findViewById(R.id.username_edit);
        password = (EditText) findViewById(R.id.edit_password);
        login = (Button) findViewById(R.id.btnSubmit);
        login.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,Second.class);

                String uservalue = user.getText().toString();
                String name_value = password.getText().toString();
                String password_value = password.getText().toString();

                intent.putExtra("username", uservalue);
                intent.putExtra("password", password_value);
                startActivity(intent);
            }
        });
    }
}

第二个活动,您想要接收数据

public class Second extends Activity{

    EditText name, pass;
    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);

        name = (EditText) findViewById(R.id.editText1);
        pass = (EditText) findViewById(R.id.editText2);

        String value = getIntent().getStringExtra("username");
        String pass_val = getIntent().getStringExtra("password");
        name.setText(value);
        pass.setText(pass_val);
    }
}

3

简单易懂。

假设在你的Activity-1中,你这样做了:

String stringExtra = "Some string you want to pass";

Intent intent = new Intent(this, AndroidTabRestaurantDescSearchListView.class);

//include the string in your intent
intent.putExtra("string", stringExtra);

startActivity(intent);

在你的AndroidTabRestaurantDescSearchListView类中,进行以下操作:
//fetch the string  from the intent
String extraFromAct1 = getIntent().getStringExtra("string");

Intent intent = new Intent(this, RatingDescriptionSearchActivity.class);

//attach same string and send it with the intent
intent.putExtra("string", extraFromAct1);
startActivity(intent);

在你的RatingDescriptionSearchActivity类中,进行以下操作:

String extraFromAct1 = getIntent().getStringExtra("string");

1
在FirstActivity中:
Intent sendDataToSecondActivity = new Intent(FirstActivity.this, SecondActivity.class);
sendDataToSecondActivity.putExtra("USERNAME",userNameEditText.getText().toString());
sendDataToSecondActivity.putExtra("PASSWORD",passwordEditText.getText().toString());
startActivity(sendDataToSecondActivity);

在SecondActivity中,在onCreate()方法中。
String userName = getIntent().getStringExtra("USERNAME");
String passWord = getIntent().getStringExtra("PASSWORD");

0

我喜欢使用这个干净的代码来传递一个值:

startActivity(new Intent(context, YourActivity.class).putExtra("key","value"));

这使编写和理解代码更加简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接