如何在按钮单击时开始新活动
Posted
技术标签:
【中文标题】如何在按钮单击时开始新活动【英文标题】:How to start new activity on button click 【发布时间】:2011-05-10 07:38:35 【问题描述】:在 android 应用程序中,当单击另一个 Activity 中的按钮时如何启动新的 Activity (GUI),以及如何在这两个 Activity 之间传递数据?
【问题讨论】:
你也可以关注帮助我的ansClick here 【参考方案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);
);
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:目前的回答很好,但初学者需要更全面的回答。在 Android 中启动新活动有 3 种不同的方式,它们都使用 Intent
类; Intent | Android Developers.
-
使用按钮的
onClick
属性。 (初学者)
通过匿名类分配OnClickListener()
。 (中级)
使用switch
语句的活动范围接口方法。 (非“专业版”)
如果你想跟着我的例子,这里是link:
-
使用按钮的
onClick
属性。 (初学者)
按钮具有在 .xml 文件中找到的 onClick
属性:
<Button
android:id="@+id/button1"
android:layout_
android:layout_
android:onClick="goToAnActivity"
android:text="to an activity" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
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
s 设置为相同的意图。
缺点:复习时难以阅读。
-
通过匿名类分配
OnClickListener()
。 (中级)
这是当您为每个 button
设置单独的 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);
);
优势:易于即时制作。
缺点:会有很多匿名类,会导致复习时的可读性变差。
-
使用
switch
语句的活动范围接口方法。 (非“专业版”)
这是当您在 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()
方法中
问题的第二部分,传递数据,请看How do I pass data between Activities in Android application?
编辑:不是-“Pro”
【讨论】:
很好的答案,谢谢!您知道使用任何建议会导致性能损失吗? #3 不是“专业”。这是可读性和可维护性最低的选项,第一个看到它的有经验的开发人员会将其重构为 #1 或 #2。 (或者他们会使用 Butterknife,这是类固醇的选项#1。) 我认为专业程序员根本不喜欢#3。在 1 个方法中放置 Idk 10 个按钮单击处理程序是一场噩梦,根本不专业。拥有无数行代码的方法并不能让你变得专业。 KISS. 3 绝对不是“专业” 好吧好吧好吧,这不是“专业”的答案,但除了“非专业”之外,我没有得到任何其他建议。好的,我会解决的。【参考方案3】: imageView.setOnClickListener(v ->
// your code here
);
【讨论】:
【参考方案4】:您的按钮 xml:
<Button
android:id="@+id/btn"
android:layout_
android:layout_
android:text="jump to activity b"
/>
Mainactivity.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);
);
【讨论】:
【参考方案5】:// 在 Kotlin 中,你可以这样做 /* 在第一个活动中,让活动布局中有一个按钮,其 id 为按钮。 假设我必须将数据作为字符串类型从一个活动传递到另一个 */
val btn = findViewById<Button>(R.id.button)
btn.setOnClickListener
val intent = Intent(baseContext, SecondActivity::class.java).apply
putExtra("KEY", data)
startActivity(intent)
//在Second Activity中,你可以从另一个Activity中获取数据
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")
【讨论】:
【参考方案6】:一个老问题,但如果目标是切换显示的页面,我只有一个活动,当我想切换页面时调用 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() 处理程序中弹出这些页面。
【讨论】:
我真的很喜欢这个解决方案。我不知道有没有什么缺点,但是这种方法看起来超级简单,而且一切都保持在同一个实例中,因此管理状态更容易。【参考方案7】:从另一个 Activity 启动一个 Activity 是 Android 应用程序中非常常见的场景。 要开始一项活动,您需要一个 Intent 对象。
如何创建 Intent 对象?
意图对象在其构造函数中采用两个参数
-
上下文
要开始的活动的名称。 (或完整的包名)
示例:
例如,如果你有两个活动,比如HomeActivity
和DetailActivity
,你想从HomeActivity
开始DetailActivity
(HomeActivity-->DetailActivity)。
这里是代码 sn-p,它显示了如何启动 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);
);
【讨论】:
【参考方案8】:点击按钮打开活动的最简单方法是:
-
在 res 文件夹下创建两个活动,为第一个活动添加一个按钮,并为
onclick
函数命名。
每个活动应该有两个 java 文件。
下面是代码:
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>
【讨论】:
【参考方案9】:科特林
第一个活动
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"))
【讨论】:
【参考方案10】:将按钮小部件放在 xml 中,如下所示
<Button
android:id="@+id/button"
android:layout_
android:layout_
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);
);
【讨论】:
【参考方案11】:在您的第一个活动中编写代码。
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");
【讨论】:
【参考方案12】:点击按钮时:
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
【讨论】:
【参考方案13】:先在 xml 中取 Button。
<Button
android:id="@+id/pre"
android:layout_
android:layout_
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);
);
【讨论】:
【参考方案14】:虽然已经提供了正确的答案,但我在这里是为了用 Kotlin 语言搜索答案。此问题与特定语言无关,因此我正在添加代码以使用 Kotlin 语言完成此任务。
这是你在 Kotlin 中为 andorid 执行此操作的方法
testActivityBtn1.setOnClickListener
val intent = Intent(applicationContext,MainActivity::class.java)
startActivity(intent)
【讨论】:
【参考方案15】:当用户点击按钮时,直接在 XML 中:
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:text="TextButton"
android:onClick="buttonClickFunction"/>
使用 android:onClick
属性,我们声明必须出现在父活动上的方法名称。所以我必须像这样在我们的活动中创建这个方法:
public void buttonClickFunction(View v)
Intent intent = new Intent(getApplicationContext(), Your_Next_Activity.class);
startActivity(intent);
【讨论】:
【参考方案16】:从此活动开始另一个活动,您也可以通过捆绑对象传递参数。
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);
在另一个活动 (YourActivity) 中检索数据
String s = getIntent().getStringExtra("USER_NAME");
【讨论】:
【参考方案17】:实现 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;
【讨论】:
【参考方案18】:试试这个简单的方法。
startActivity(new Intent(MainActivity.this, SecondActivity.class));
【讨论】:
【参考方案19】:Intent i = new Intent(firstactivity.this, secondactivity.class);
startActivity(i);
【讨论】:
【参考方案20】:简单。
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"/>
【讨论】:
按钮点击部分在哪里? (按钮点击→过渡到下一个活动) @Jonny:这是一个按钮点击示例。 ***.com/a/7722428/442512CurrentActivity.this.startActivity(myIntent)
和startActivity(myIntent)
有区别吗?
是的,很简单,哈哈。有比实际键入的代码更多的代码丢失。所有 xml 接口和 .java 代码都在哪里丢失?投反对票
Liquid,要不要他也把它打包成一个apk? ;)【参考方案21】:
从发送活动中尝试以下代码
//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"
【讨论】:
【参考方案22】: Intent in = new Intent(getApplicationContext(),SecondaryScreen.class);
startActivity(in);
This is an explicit intent to start secondscreen activity.
【讨论】:
【参考方案23】:Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);
【讨论】:
这只是部分答案。此外,这还不够,即如果不对项目进行额外修改,它将无法工作。【参考方案24】:你可以试试这个代码:
Intent myIntent = new Intent();
FirstActivity.this.SecondActivity(myIntent);
【讨论】:
【参考方案25】:伊曼纽尔,
我认为应该在开始活动之前放置额外的信息,否则如果您在 NextActivity 的 onCreate 方法中访问它,则数据将不可用。
Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
myIntent.putExtra("key", value);
CurrentActivity.this.startActivity(myIntent);
【讨论】:
【参考方案26】:为 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
【讨论】:
【参考方案27】:启动新活动的方法是广播一个意图,您可以使用一种特定的意图将数据从一个活动传递到另一个活动。我的建议是您查看与intents 相关的 Android 开发者文档;这是有关该主题的丰富信息,并且也有示例。
【讨论】:
以上是关于如何在按钮单击时开始新活动的主要内容,如果未能解决你的问题,请参考以下文章
从 Activity 返回时如何获取最后一个 ListView 状态