如何在按钮点击时启动新的活动。

720
在安卓应用中,如果要在一个活动(GUI)中点击按钮后启动另一个活动,并且需要在这两个活动之间传递数据,该怎么做?

你也可以跟随帮助我的答案 点击这里 - user14860952
28个回答

1276

简单。

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
myIntent.putExtra("key", value); //Optional parameters
CurrentActivity.this.startActivity(myIntent);

通过以下方式可以在另一侧检索Extras:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent();
    String value = intent.getStringExtra("key"); //if it's a string you stored.
}

不要忘记在AndroidManifest.xml文件中添加你的新活动:

<activity android:label="@string/app_name" android:name="NextActivity"/>

23
按钮点击部分在哪里?(按钮点击→转至下一个活动) - Jonny
5
@Jonny:这是一个按钮点击的示例。http://stackoverflow.com/a/7722428/442512 - Emmanuel
10
CurrentActivity.this.startActivity(myIntent)startActivity(myIntent)之间有什么区别吗? - Confuse
8
好的,简单易懂lol。缺失的代码比实际输入的代码还要多。缺失了所有的xml接口和.java代码在哪里?Downvote。 - Liquid Core
150
液体,你希望他也将它打包成apk文件吗?;) - Casey Murray
显示剩余2条评论

90

目前的回答很好,但初学者需要更全面的回答。在Android中有三种不同的方法来启动新活动,它们都使用 Intent 类;Intent | Android Developers

  1. 使用Button的 onClick 属性。(初学者)
  2. 通过匿名类分配一个 OnClickListener()。(中级)
  3. 使用 switch 语句的Activity范围接口方法。(非“Pro”)

如果您想跟着我示例走,这是链接

  1. 使用Button的 onClick 属性。(初学者)

按钮有一个 onClick 属性,可以在 .xml 文件中找到:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="goToAnActivity"
    android:text="to an activity" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="goToAnotherActivity"
    android:text="to another activity" />

在Java类中:

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

public void goToAnActivity(View view) {
    Intent intent = new Intent(this, AnActivity.class);
    startActivity(intent);
}

public void goToAnotherActivity(View view) {
    Intent intent = new Intent(this, AnotherActivity.class);
    startActivity(intent);
}

优点: 可以轻松地临时制作,模块化,并且可以轻松地为同一意图设置多个onClick

缺点: 在回顾时难以阅读。

  1. 通过匿名类分配OnClickListener()。(中级)

这是当您为每个分别设置单独的setOnClickListener(),并覆盖每个onClick()的自己的意图时所发生的情况。

在Java类中:

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

        Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), AnActivity.class);
                view.getContext().startActivity(intent);}
            });

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), AnotherActivity.class);
                view.getContext().startActivity(intent);}
            });

优点: 可以轻松地快速制作。

缺点: 将会有很多匿名类,这将使得在审核时难以阅读。

  1. 使用 switch 语句的 Activity 全局接口方法。(非“专业”)

当您在 onClick() 方法中为按钮使用 switch 语句来管理所有 Activity 的按钮时,就会出现这种情况。

Java 类中:

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

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    button1.setOnClickListener(this);
    button2.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.button1:
            Intent intent1 = new Intent(this, AnActivity.class);
            startActivity(intent1);
            break;
        case R.id.button2:
            Intent intent2 = new Intent(this, AnotherActivity.class);
            startActivity(intent2);
            break;
        default:
            break;
    }

优点: 因为所有按钮意图都在一个单独的 onClick() 方法中注册,所以按钮管理非常容易。


关于第二个问题,传递数据,请参见如何在Android应用程序中在Activity之间传递数据?

编辑:不是“Pro”


1
非常好的回答,谢谢!您知道使用这些建议是否会有任何性能损失吗? - lmedinas
9
#3不是专业的选择。它是最难以阅读和维护的选项,任何有经验的开发人员在看到它时都会将其重构为#1或#2。 (或者他们会使用Butterknife,这是#1的增强版。) - Kevin Krumwiede
1
我认为专业程序员根本不喜欢#3。在一个方法中放置10个按钮点击处理程序是一场噩梦,也不是专业的做法。代码行数多并不能证明你的专业水平。KISS原则(保持简单)才是关键。 - Mehdi Dehghani
2
3 绝对不是“专业”的。 - Kaiser Keister
好的,好的,好的,这不是“专业”答案,但我没有得到任何其他建议,除了“不是专业版”。好吧,我会修复它。 - Martin Sing

64

创建一个到ViewPerson活动的意图,并传递PersonID(例如用于数据库查找)。

Intent i = new Intent(getBaseContext(), ViewPerson.class);                      
i.putExtra("PersonID", personID);
startActivity(i);

然后在ViewPerson Activity中,你可以获取额外数据的bundle,确保它不为空(以防有时候没有传递数据),然后获取数据。

Bundle extras = getIntent().getExtras();
if(extras !=null)
{
     personID = extras.getString("PersonID");
}

现在如果你需要在两个活动之间共享数据,你也可以使用全局单例模式。

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

然后在任何活动中调用它:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.CallSomeFunctionHere(); // Do whatever you need to with data here.  Could be setter/getter or some other type of logic

37
用户点击该按钮时,直接在XML中进行如下操作:
<Button
         android:id="@+id/button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="TextButton"
         android:onClick="buttonClickFunction"/>

使用属性android:onClick我们声明必须存在于父活动中的方法名称。因此,我必须在我们的活动中创建这个方法,如下所示:

public void buttonClickFunction(View v)
{
            Intent intent = new Intent(getApplicationContext(), Your_Next_Activity.class);
            startActivity(intent);
}

21
Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);

2
这只是一个部分答案。此外,它不足以在项目中使用,即需要进行其他修改才能正常工作。 - andr

11
    Intent in = new Intent(getApplicationContext(),SecondaryScreen.class);    
    startActivity(in);

    This is an explicit intent to start secondscreen activity.

9

Kotlin

第一个 Activity

startActivity(Intent(this, SecondActivity::class.java)
  .putExtra("key", "value"))

第二个活动

val value = getIntent().getStringExtra("key")

建议

始终将密钥放在常量文件中,以更好地进行管理。

companion object {
    val PUT_EXTRA_USER = "user"
}
startActivity(Intent(this, SecondActivity::class.java)
  .putExtra(PUT_EXTRA_USER, "value"))

8
尝试这个简单的方法。
startActivity(new Intent(MainActivity.this, SecondActivity.class));

8

Emmanuel,

我认为额外的信息应该在启动活动之前放置,否则如果您在NextActivity的onCreate方法中访问它,则数据将尚不可用。

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);

7
Intent i = new Intent(firstactivity.this, secondactivity.class);
startActivity(i);

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