Como iniciar uma nova actividade ao carregar no botão
em uma aplicação Android, como você inicia uma nova atividade (GUI) quando um botão em outra atividade é clicado, e como você passa os dados entre essas duas atividades?
25 answers
Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
myIntent.putExtra("key", value); //Optional parameters
CurrentActivity.this.startActivity(myIntent);
Os Extras são recuperados do outro lado via:
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent = getIntent();
String value = intent.getStringExtra("key"); //if it's a string you stored.
}
Não te esqueças de adicionar a tua nova actividade no AndroidManifest.xml:
<activity android:label="@string/app_name" android:name="NextActivity"/>
Intent
; Intent | Android Desenvolvedores .
- usando o atributo
onClick
do botão. (Principiante) - atribuir um
OnClickListener()
através de uma classe anónima. (Intermédio) - método da interface de grande actividade usando a declaração
switch
. (Pro)
1. Usando o atributo onClick
do botão. (Principiante)
Buttons have an onClick
attribute that is found within the .ficheiro 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" />
Na classe 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);
}
Vantagem : fácil de fazer no momento, modular, e pode facilmente definir múltiplos onClick
para a mesma intenção.
Desvantagem : dificuldade de leitura ao rever.
2. Atribuir um OnClickListener()
através de um aula anónima. (Intermédio)
Isto é quando você define um separado setOnClickListener()
para cada button
e sobrepõe cada onClick()
com a sua própria intenção.
Na classe 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);}
});
Vantagem: Fácil de fazer no voo.
Desvantagem: haverá um monte de classes anônimas que tornará a legibilidade difícil ao rever.
3. Método da interface de nível alargado de actividade, utilizando a declaração switch
. (Pro)
Isto é quando você usa um switch
declaração para os seus botões dentro do método onClick()
para gerir todos os botões da actividade.
Na classe 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;
}
Vantagem : Gestão Fácil dos botões porque todas as intenções dos botões estão registadas num único método onClick()
Para a segunda parte da pergunta, passar dados, por favor veja como passo dados entre atividades na aplicação Android?
Crie uma intenção para uma atividade do visor e passe o PersonID (para uma pesquisa de banco de dados, por exemplo).
Intent i = new Intent(getBaseContext(), ViewPerson.class);
i.putExtra("PersonID", personID);
startActivity(i);
Em seguida, na atividade do visor, você pode obter o pacote de dados extras, certifique-se de que não é nulo (no caso de, por vezes, não passar dados), em seguida, obter os dados.
Bundle extras = getIntent().getExtras();
if(extras !=null)
{
personID = extras.getString("PersonID");
}
Agora, se você precisa compartilhar dados entre duas atividades, Você também pode ter um Singleton Global.
public class YourApplication extends Application
{
public SomeDataClass data = new SomeDataClass();
}
Então chama-o em qualquer actividade por:
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
Quando o utilizador clica no botão, directamente dentro do XML assim:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextButton"
android:onClick="buttonClickFunction"/>
Usando o atributo android:onClick
declaramos o nome do método que tem de estar presente na actividade parental. Então eu tenho que criar este método dentro de nossa atividade assim:
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.
Acho que a informação extra deve ser colocada antes de iniciar a actividade, caso contrário, os dados ainda não estarão disponíveis se estiver a aceder-lhe no método de onCreate da NextActivity.
Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
myIntent.putExtra("key", value);
CurrentActivity.this.startActivity(myIntent);
A partir da actividade de envio tente o seguinte código
//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);
}
A partir da actividade de recepção tente o seguinte código:
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);
Então adicione o seguinte código ao AndroidManifest.ficheiro 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);
startActivity(new Intent(MainActivity.this, SecondActivity.class));
Pode tentar este código:
Intent myIntent = new Intent();
FirstActivity.this.SecondActivity(myIntent);
Kotlin
Primeira Actividade
startActivity(Intent(this, SecondActivity::class.java)
.putExtra("key", "value"))
Segunda Actividade
val value = getIntent().getStringExtra("key")
Sugestão
Coloque sempre as chaves em Ficheiro constante para uma forma mais gerida.
companion object {
val PUT_EXTRA_USER = "user"
}
startActivity(Intent(this, SecondActivity::class.java)
.putExtra(PUT_EXTRA_USER, "value"))
Para iniciar uma actividade precisa de um objecto de intenção. Como criar objetos de intenção?
Um objecto de intenção toma dois parâmetro no seu construtor
- Contexto
- nome da actividade a iniciar. (ou pacote completo nome)
Por exemplo, se você tem duas atividades, digaExemplo:
HomeActivity
e DetailActivity
e você quer começar DetailActivity
de HomeActivity
(HomeActivity-->DetailActivity).
Aqui está o excerto de código que mostra como iniciar a DetailActivity a partir de
Homeactividade.
Intent i = new Intent(HomeActivity.this,DetailActivity.class);
startActivity(i);
E acabou-se.
Voltando à parte do botão clique.
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);
}
});
Iniciar outra actividade a partir desta actividade e u pode passar parâmetros através do objecto do feixe também.
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
startActivity(intent);
Obter dados noutra actividade (YourActivity)
String s = getIntent().getStringExtra("USER_NAME");
// In Kotlin , pode fazer como /* Na primeira atividade, deixe a disposição da atividade há um botão que tem id como botão. Suponha que eu tenha que passar dados como tipo de cadeia de uma atividade para outra * /
val btn = findViewById<Button>(R.id.button)
btn.setOnClickListener {
val intent = Intent(baseContext, SecondActivity::class.java).apply {
putExtra("KEY", data)
}
startActivity(intent)
}
/ / na segunda actividade, pode obter dados de outra actividade como
val name = intent.getStringExtra("KEY")
/* suponha que você tem que passar um objeto personalizado, então ele deve ser Parcelável. que haja um tipo de colagem de classe que eu tenho que passar de uma atividade para outra */
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
class Collage(val name: String, val mobile: String, val email: String) : Parcelable
/* actividade Primeiro, deixe aqui dados são tipo de colagem. que tenho de passar para outra actividade. */
val btn = findViewById<Button>(R.id.button)
btn.setOnClickListener {
val intent = Intent(baseContext, SecondActivity::class.java).apply {
putExtra("KEY", data)
}
startActivity(intent)
}
/ / / depois a partir da Segunda actividade teremos como
val item = intent.extras?.getParcelable<Collage>("KEY")
Implemente a vista.Interface OnClickListener e sobrepor o método 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;
}
testActivityBtn1.setOnClickListener{
val intent = Intent(applicationContext,MainActivity::class.java)
startActivity(intent)
}
A forma mais simples de abrir a actividade no botão é:
- crie duas actividades sob a pasta res, adicione um botão à primeira actividade e dê um nome à função
onclick
. - deve haver dois ficheiros java para cada actividade.
- abaixo está o código:
Actividade principal.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 (basta adicionar este bloco de código ao existente)
</activity>
<activity android:name=".SecondActivity">
</activity>
Primeiro pegue no botão em 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"
/>
Faça listner do botão.
pre.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
Quando carregar no botão:
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);
}
});
Para receber os dados extra de NextActivity.class
:
Bundle extra = getIntent().getExtras();
if (extra != null){
String str = (String) extra.get("data"); // get a object
}
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();
}
});
In secondActivity.classe
String name = getIntent().getStringExtra("Key");
Colocar o elemento do botão em xml, como por baixo
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
/>
Depois disso inicializar e manipular o Click listener na actividade como em baixo ..
Em actividade sobre o método de criação:
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);
}
});
Uma pergunta antiga, mas se o objectivo é mudar de páginas apresentadas, só tenho uma actividade e chamar a setContentView() quando quero mudar de páginas (normalmente em resposta ao Utilizador carregar num botão). Isto permite-me simplesmente ligar do conteúdo de uma página para outra. Sem intenção de insanidade de pacotes extras e qualquer coisa tentando passar dados para trás e para a frente.
Eu faço um monte de páginas em res/layout como de costume, mas não faço uma atividade para cada. Basta usar o setContentView() para mudar quando necessário.Então o meu oncreato único() tem:
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);
}
}
}
Se quiser que o botão de trás volte para trás através das suas páginas internas antes de sair da aplicação, basta embrulhar setContentView() para gravar as páginas numa pequena pilha de páginas, e colocar essas páginas no manipulador onBackPressed ().
O seu botão xml:
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="jump to activity b"
/>
Actividade principal.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);
}
});