690

在 Android 应用程序中,当单击另一个 Activity 中的按钮时,如何启动新的 Activity (GUI),以及如何在这两个 Activity 之间传递数据?

4

27 回答 27

1231

简单的。

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

通过以下方式在另一侧检索额外内容:

@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"/>
于 2010-11-15T15:51:23.870 回答
77

目前的反应很好,但初学者需要更全面的答案。在 Android 中启动一个新的 Activity 有 3 种不同的方式,它们都使用Intent类;意图 | 安卓开发者

  1. 使用onClickButton 的属性。(初学者)
  2. OnClickListener()通过匿名类分配。(中间的)
  3. 使用声明的Activity范围接口方法switch。(不是“专业版”)

如果您想继续,这是我的示例的链接:

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

按钮具有可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);
}

优点:易于即时制作,模块化,并且可以轻松地将多个onClicks 设置为相同的意图。

缺点:复习时难以阅读。

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

setOnClickListener()这是当您为每个设置单独的并以自己的意图button覆盖每个时。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. 使用声明的Activity范围接口方法switch。(不是“专业版”)

这是当您在方法中为您的按钮使用switch语句onClick()来管理所有 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 应用程序中的活动之间传递数据?

编辑:不是-“Pro”

于 2016-12-30T02:14:16.713 回答
63

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

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

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

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
于 2010-11-15T16:07:57.827 回答
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);
}
于 2015-07-29T12:41:48.820 回答
21
Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);
于 2013-02-11T10:28:46.747 回答
11
    Intent in = new Intent(getApplicationContext(),SecondaryScreen.class);    
    startActivity(in);

    This is an explicit intent to start secondscreen activity.
于 2013-12-03T11:58:34.333 回答
8

伊曼纽尔,

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

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

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);
于 2012-04-16T23:53:39.093 回答
7

从发送活动尝试以下代码

   //EXTRA_MESSAGE is our key and it's value is 'packagename.MESSAGE'
    public static final String EXTRA_MESSAGE = "packageName.MESSAGE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       ....

        //Here we declare our send button
        Button sendButton = (Button) findViewById(R.id.send_button);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //declare our intent object which takes two parameters, the context and the new activity name

                // the name of the receiving activity is declared in the Intent Constructor
                Intent intent = new Intent(getApplicationContext(), NameOfReceivingActivity.class);

                String sendMessage = "hello world"
                //put the text inside the intent and send it to another Activity
                intent.putExtra(EXTRA_MESSAGE, sendMessage);
                //start the activity
                startActivity(intent);

            }

从接收活动尝试以下代码:

   protected void onCreate(Bundle savedInstanceState) {
 //use the getIntent()method to receive the data from another activity
 Intent intent = getIntent();

//extract the string, with the getStringExtra method
String message = intent.getStringExtra(NewActivityName.EXTRA_MESSAGE);

然后只需将以下代码添加到 AndroidManifest.xml 文件中

  android:name="packagename.NameOfTheReceivingActivity"
  android:label="Title of the Activity"
  android:parentActivityName="packagename.NameOfSendingActivity"
于 2016-01-29T13:27:03.297 回答
7
Intent i = new Intent(firstactivity.this, secondactivity.class);
startActivity(i);
于 2016-05-24T07:03:43.917 回答
7

试试这个简单的方法。

startActivity(new Intent(MainActivity.this, SecondActivity.class));
于 2017-04-16T20:53:42.367 回答
5

启动新活动的方法是广播一个意图,您可以使用一种特定的意图将数据从一个活动传递到另一个活动。我的建议是您查看与意图相关的 Android 开发人员文档;这是有关该主题的丰富信息,并且也有示例。

于 2010-11-15T15:48:39.627 回答
5

你可以试试这段代码:

Intent myIntent = new Intent();
FirstActivity.this.SecondActivity(myIntent);
于 2012-12-26T11:32:01.430 回答
5

科特林

第一个活动

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"))
于 2018-11-12T12:09:35.660 回答
4

从另一个活动启动一个活动是 android 应用程序中非常常见的场景。
要开始一项活动,您需要一个Intent对象。

如何创建意图对象?

意图对象在其构造函数中有两个参数

  1. 语境
  2. 要开始的活动的名称。(或完整的包名)

例子:

在此处输入图像描述

因此,例如,如果您有两个活动,比如说HomeActivityDetailActivity并且您想DetailActivityHomeActivity (HomeActivity-->DetailActivity) 开始。

这是显示如何启动 DetailActivity 的代码片段

家庭活动。

Intent i = new Intent(HomeActivity.this,DetailActivity.class);
startActivity(i);

你完成了。

回到按钮点击部分。

Button button = (Button) findViewById(R.id.someid);

button.setOnClickListener(new View.OnClickListener() {
     
     @Override
     public void onClick(View view) {
         Intent i = new Intent(HomeActivity.this,DetailActivity.class);
         startActivity(i);  
      }

});
于 2017-05-24T19:11:08.943 回答
3

从这个活动开始另一个活动,你也可以通过捆绑对象传递参数。

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

在另一个活动 (YourActivity) 中检索数据

String s = getIntent().getStringExtra("USER_NAME");
于 2017-06-23T12:02:45.837 回答
3

// 在Kotlin中,你可以这样做 /* 在第一个 Activity 中,让 Activity 布局中有一个按钮,其 id 为按钮。假设我必须将数据作为字符串类型从一个活动传递到另一个 */

     val btn = findViewById<Button>(R.id.button)
     btn.setOnClickListener {
        val intent = Intent(baseContext, SecondActivity::class.java).apply {
             putExtra("KEY", data)
        }
        startActivity(intent)
     }

// 在第二个活动中,您可以从另一个活动中获取数据

 val name = intent.getStringExtra("KEY")

/* 假设你必须传递一个自定义对象,那么它应该是 Parcelable。让我必须从一个活动传递到另一个活动的类拼贴类型 */

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
class Collage(val name: String, val mobile: String, val email: String) : Parcelable

/* Activity 首先,这里的数据是拼贴类型。我必须将其传递给另一个活动。*/

val btn = findViewById<Button>(R.id.button)
         btn.setOnClickListener {
            val intent = Intent(baseContext, SecondActivity::class.java).apply {
                 putExtra("KEY", data)
            }
            startActivity(intent)
         }

// 然后从第二个 Activity 我们将得到

val item = intent.extras?.getParcelable<Collage>("KEY")
于 2020-08-05T03:23:22.550 回答
2

实现 View.OnClickListener 接口并覆盖 onClick 方法。

ImageView btnSearch;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search1);
        ImageView btnSearch = (ImageView) findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(this);
    }

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnSearch: {
                Intent intent = new Intent(Search.this,SearchFeedActivity.class);
                startActivity(intent);
                break;
            }
于 2017-06-15T14:38:23.877 回答
2

虽然已经提供了正确的答案,但我在这里用 Kotlin 语言搜索答案。此问题与特定语言无关,因此我正在添加代码以使用 Kotlin 语言完成此任务。

这是您在 Kotlin 中为 andorid 执行此操作的方法

testActivityBtn1.setOnClickListener{
      val intent = Intent(applicationContext,MainActivity::class.java)
      startActivity(intent)

 }
于 2017-10-14T10:32:45.470 回答
2

在按钮单击时打开活动的最简单方法是:

  1. 在 res 文件夹下创建两个活动,为第一个活动添加一个按钮并为onclick函数命名。
  2. 每个活动应该有两个 java 文件。
  3. 下面是代码:

MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.content.Intent;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

SecondActivity.java

package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity1);
    }
}

AndroidManifest.xml(只需将此代码块添加到现有的)

 </activity>
        <activity android:name=".SecondActivity">
  </activity>
于 2019-03-04T09:26:54.873 回答
1

先取 xml 中的 Button。

  <Button
        android:id="@+id/pre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/ic_launcher"
        android:text="Your Text"
        />

制作按钮的监听器。

 pre.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });
于 2018-01-01T08:30:19.370 回答
1

单击按钮时:

loginBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent= new Intent(getApplicationContext(), NextActivity.class);
        intent.putExtra("data", value); //pass data
        startActivity(intent);
    }
});

从以下位置接收额外数据NextActivity.class

Bundle extra = getIntent().getExtras();
if (extra != null){
    String str = (String) extra.get("data"); // get a object
}
于 2018-05-31T18:52:04.923 回答
1

在您的第一个活动中编写代码。

button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


Intent intent = new Intent(MainActivity.this, SecondAcitvity.class);
                       //You can use String ,arraylist ,integer ,float and all data type.
                       intent.putExtra("Key","value");
                       startActivity(intent);
                        finish();
            }
         });

在 secondActivity.class

String name = getIntent().getStringExtra("Key");
于 2018-07-20T09:37:18.143 回答
1

将按钮小部件放在 xml 中,如下所示

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
/>

之后初始化并处理 Activity 中的单击侦听器,如下所示..

在 Activity On Create 方法中:

Button button =(Button) findViewById(R.id.button); 
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
       Intent intent = new 
            Intent(CurrentActivity.this,DesiredActivity.class);
            startActivity(intent);
    }
});
于 2018-11-09T12:53:58.847 回答
1

一个老问题,但如果目标是切换显示的页面,我只有一个活动并在我想切换页面时调用 setContentView() (通常是为了响应用户单击按钮)。这使我可以简单地从一个页面的内容调用到另一个页面。没有意图疯狂的额外包裹包以及任何试图来回传递数据的东西。

我像往常一样在 res/layout 中制作了一堆页面,但没有为每个页面制作活动。只需使用 setContentView() 根据需要切换它们。

所以我唯一的 onCreate() 有:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LayoutInflater layoutInflater = getLayoutInflater();

    final View mainPage = layoutInflater.inflate(R.layout.activity_main, null);
    setContentView (mainPage);
    Button openMenuButton = findViewById(R.id.openMenuButton);

    final View menuPage = layoutInflatter.inflate(R.layout.menu_page, null);
    Button someMenuButton = menuPage.findViewById(R.id.someMenuButton);

    openMenuButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            setContentView(menuPage);
        }
    });

    someMenuButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            do-something-interesting;
            setContentView(mainPage);
        }
    }
}

如果您希望后退按钮在退出应用程序之前返回您的内部页面,只需包装 setContentView() 以将页面保存在一小堆页面中,然后在 onBackPressed() 处理程序中弹出这些页面。

于 2020-06-24T20:33:32.273 回答
1
Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(SplashActivity.this,HomeActivity.class);
            startActivity(intent);
        }
    });
于 2022-01-07T12:48:06.277 回答
0

你的按钮 xml:

 <Button
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="jump to activity b"
    />

主要活动.java:

 Button btn=findViewVyId(R.id.btn);
btn.setOnClickListener(btnclick);
btnclick.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
               Intent intent=new Intent();
                intent.setClass(Mainactivity.this,b.class);
                startActivity(intent);
    }
});
于 2020-11-26T03:58:00.987 回答
0
 imageView.setOnClickListener(v -> {
// your code here
        });
于 2021-04-06T03:42:28.967 回答