Как начать новую деятельность по нажатию кнопки - PullRequest
574 голосов
/ 15 ноября 2010

В приложении Android как запустить новое действие (GUI) при нажатии кнопки в другом действии и как вы передаете данные между этими двумя действиями?

Ответы [ 22 ]

1027 голосов
/ 15 ноября 2010

Легко.

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"/>
54 голосов
/ 15 ноября 2010

Создайте намерение для действия 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
50 голосов
/ 30 декабря 2016

Текущие ответы - это здорово, но для начинающих нужен более полный ответ.Есть 3 различных способа начать новое действие в Android, и все они используют класс Intent; Намерение |Разработчики Android .

  1. Использование атрибута onClick кнопки.(Начинающий)
  2. Назначение OnClickListener() через анонимный класс.(Средний уровень)
  3. Метод интерфейса широкого действия с использованием оператора 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 s для одного и того же намерения.

Недостаток : Трудность чтения при просмотре.

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;
    }

Advantage : простое управление кнопками, поскольку все намерения кнопок регистрируются в одном методе onClick()


В отношении второй части вопроса о передаче данных см. Как передавать данные между действиями в приложении Android?

35 голосов
/ 29 июля 2015

Когда пользователь нажимает кнопку, непосредственно внутри 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);
}
18 голосов
/ 11 февраля 2013
Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);
9 голосов
/ 03 декабря 2013
    Intent in = new Intent(getApplicationContext(),SecondaryScreen.class);    
    startActivity(in);

    This is an explicit intent to start secondscreen activity.
7 голосов
/ 17 апреля 2012

Эммануил,

Я думаю, что дополнительная информация должна быть помещена до начала действия, иначе данные будут недоступны, если вы обращаетесь к ним в методе onCreate NextActivity.

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

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);
6 голосов
/ 24 мая 2016
Intent i = new Intent(firstactivity.this, secondactivity.class);
startActivity(i);
6 голосов
/ 29 января 2016

При отправке активности попробуйте следующий код

   //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"
4 голосов
/ 26 декабря 2012

Вы можете попробовать этот код:

Intent myIntent = new Intent();
FirstActivity.this.SecondActivity(myIntent);
...