Как начать новую деятельность по нажатию кнопки
В приложении Android, как вы запускаете новое действие (GUI), когда нажимается кнопка в другом действии, и как вы передаете данные между этими двумя действиями?
28 ответов
Легко.
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"/>
Текущие ответы - это здорово, но для начинающих нужен более полный ответ. Есть 3 различных способа начать новое действие в Android, и все они используют Intent
учебный класс; Намерение | Разработчики Android.
- С использованием
onClick
атрибут кнопки. (Начальный) - Назначение
OnClickListener()
через анонимный класс. (Средний) - Метод активного интерфейса с использованием
switch
заявление. (Pro)
Вот ссылка на мой пример, если вы хотите следовать: https://github.com/martinsing/ToNewActivityButtons
1. Использование 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
с тем же намерением.
Недостаток: сложность чтения при просмотре.
2. Назначение OnClickListener()
через анонимный класс. (Средний)
Это когда вы устанавливаете отдельный setOnClickListener()
для каждого button
и переопределить каждый onClick()
со своим собственным намерением.
В классе Java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
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);}
});
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);}
});
Преимущество: легко сделать на лету.
Недостаток: будет много анонимных классов, которые затруднят читабельность при просмотре.
3. Метод широкого интерфейса активности с использованием switch
заявление. (Pro)
Это когда вы используете switch
заявление для ваших кнопок в пределах onClick()
метод для управления всеми кнопками деятельности.
В классе Java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
button1 = (Button) findViewById(R.id.button1);
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?
Создайте намерение для действия 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");
}
Теперь, если вам нужно обмениваться данными между двумя действиями, вы также можете иметь Global Singleton.
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
Когда пользователь нажимает на кнопку, прямо внутри 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);
}
Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);
Intent in = new Intent(getApplicationContext(),SecondaryScreen.class);
startActivity(in);
This is an explicit intent to start secondscreen 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"))
Попробуйте этот простой метод.
startActivity(new Intent(MainActivity.this, SecondActivity.class));
Эммануэль,
Я думаю, что дополнительная информация должна быть помещена до начала действия, иначе данные будут недоступны, если вы обращаетесь к ним в методе onCreate NextActivity.
Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
myIntent.putExtra("key", value);
CurrentActivity.this.startActivity(myIntent);
Из отправляющей активности попробуйте следующий код
//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"
Intent i = new Intent(firstactivity.this, secondactivity.class);
startActivity(i);
Запуск действия из другого действия - очень распространенный сценарий среди приложений для Android.
Чтобы начать деятельность вам нужен[Intent][1]
объект.
Как создать Объекты Намерения?
Объект намерения принимает два параметра в своем конструкторе
- контекст
- Название действия, которое будет начато.
Пример:
Так, например, если у вас есть два вида деятельности, скажем HomeActivity
а также DetailActivity
и вы хотите начать DetailActivity
от HomeActivity
(HomeActivity ->DetailActivity).
Вот фрагмент кода, который показывает, как запустить DetailActivity из
HomeActivity.
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);
}
});
Способ начать новые действия - это передать намерение, и есть определенный тип намерения, который вы можете использовать для передачи данных из одного действия в другое. Я рекомендую вам ознакомиться с документами для разработчиков Android, связанными с намерениями; это обширная информация по этому вопросу, и есть примеры.
Вы можете попробовать этот код:
Intent myIntent = new Intent();
FirstActivity.this.SecondActivity(myIntent);
Запустите другое действие из этого действия, и вы также можете передать параметры через Bundle Object.
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);
Извлечь данные в другой деятельности (YourActivity)
String s = getIntent().getStringExtra("USER_NAME");
// В Kotlin вы можете сделать так: / * В First Activity пусть в макете активности есть кнопка, у которой id как button. Предположим, мне нужно передать данные в виде типа String из одного действия в другое * /
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")
/ * Предположим, вам нужно передать Custom Object, тогда он должен быть Parcelable. пусть есть класс типа Collage, который я должен переходить от одного действия к другому * /
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
class Collage(val name: String, val mobile: String, val email: String) : Parcelable
/ * Действие Во-первых, пусть здесь данные относятся к типу "Коллаж". который я должен передать другому виду деятельности. * /
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")
Котлин 2022
Самый простой способ:
val a = Intent(this.context, BarcodeActivity::class.java)
a.putExtra("barcode", barcode)
startActivity(a)
а с другой стороны (BarcodeActivity в моем случае):
val intent: Intent = intent
var data = intent.getStringExtra("barcode")
Подробнее здесь
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);
}
});
Реализуйте интерфейс 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;
}
Самый простой способ открыть действие по нажатию кнопки:
- Создайте два действия в папке 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>
Хотя правильные ответы уже были предоставлены, но я здесь для поиска ответа на языке Kotlin. Этот Вопрос не о конкретном языке, поэтому я добавляю код для выполнения этой задачи на языке Kotlin.
Вот как вы делаете это в Kotlin для andorid
testActivityBtn1.setOnClickListener{
val intent = Intent(applicationContext,MainActivity::class.java)
startActivity(intent)
}
Когда кнопка нажата:
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
}
Поместите виджет кнопки в 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);
}
});
Старый вопрос, но если целью является переключение отображаемых страниц, у меня есть только одно действие и вызывается 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().
Ваша кнопка xml:
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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);
}
});
Сначала возьмите кнопку в xml.
<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);
}
});
Напишите код в вашей первой деятельности.
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");