如何在按钮单击时启动新活动

时间:2010-11-15 15:43:37

标签: android android-intent android-activity android-button android-lifecycle

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

26 个答案:

答案 0 :(得分:1016)

易。

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"/>

答案 1 :(得分:53)

为ViewPerson活动创建一个intent并传递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

答案 2 :(得分:49)

目前的反应非常好,但初学者需要更全面的答案。在Android中有3种不同的方式来开始新活动,它们都使用Intent类; Intent | Android Developers

  1. 使用Button的onClick属性。 (初级)
  2. 通过匿名类分配OnClickListener()。 (中级)
  3. 使用switch语句的活动范围界面方法。 (Pro)的
  4. 如果您想跟随我的示例,请点击以下链接:https://github.com/martinsing/ToNewActivityButtons

    1.使用Button的onClick属性。 (初级)

    按钮具有{。1}}属性,可在.xml文件中找到:

    onClick

    在Java类中:

    <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" />
    

    优势:易于动态制作,模块化,并且可以轻松地将多个@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); } 设置为相同的意图。

    缺点:审核时难以辨认。

    2.通过匿名类分配onClick。 (中间体)

    这是您为每个OnClickListener()设置单独的setOnClickListener()并以自己的意图覆盖每个button的时间。

    在Java类中:

    onClick()

    优势:易于动态制作。

    缺点:会有很多匿名课程在审核时会使阅读变得困难。

    3.使用@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);} }); 语句的活动范围界面方法。 (Pro)的

    当您在switch方法中使用switch语句来管理所有Activity的按钮时。

    在Java类中:

    onClick()

    优势:简单的按钮管理,因为所有按钮意图都在一个@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; } 方法中注册

    关于问题的第二部分,传递数据,请参阅How do I pass data between Activities in Android application?

答案 3 :(得分:34)

当用户点击按钮时,直接在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);
}

答案 4 :(得分:17)

Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);

答案 5 :(得分:9)

    Intent in = new Intent(getApplicationContext(),SecondaryScreen.class);    
    startActivity(in);

    This is an explicit intent to start secondscreen activity.

答案 6 :(得分:7)

Emmanuel,

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

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

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);

答案 7 :(得分:6)

Intent i = new Intent(firstactivity.this, secondactivity.class);
startActivity(i);

答案 8 :(得分:6)

从发送活动中尝试以下代码

module.exports = {
entry: "./app/components/Main.js",
output: {
    filename: "public/bundle.js"
},
module: {
    loaders: [
        {
            test: /\.jsx?$/,
            exclude: /(node_modules | bower_components)/,
            loader: 'babel',
            query: {
                presets: ['react', 'es2015']
            }
        }
    ]
}

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

w<-c(0.5,0.5)
A<-runif(100)
B<-runif(100)
c<-function(w,A,B) sqrt(w[1]*A + w[2]*B)
optim(w,c)
Error in w[1]*A:'A' is missing

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

   //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);

            }

答案 9 :(得分:4)

您可以尝试以下代码:

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

答案 10 :(得分:4)

尝试这种简单的方法。

startActivity(new Intent(MainActivity.this, SecondActivity.class));

答案 11 :(得分:3)

从另一个活动开始活动是Android应用程序中非常常见的情况 要开始一项活动,您需要一个Intent对象。

如何创建意图对象?

intent对象在其构造函数

中使用两个参数
  1. 上下文
  2. 要启动的活动名称。 (或完整的包裹名称)
  3.   

    实施例

    enter image description here

    例如,如果您有两项活动,请说HomeActivityDetailActivity,并且您希望从DetailActivity 开始HomeActivity(HomeActivity - &gt; 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);  
          }
    
    });
    

答案 12 :(得分:3)

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

答案 13 :(得分:3)

//在科特林中,您可以按照 / *在第一个活动中,让活动布局中包含以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")

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

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

//然后从第二个活动中我们将得到

val item = intent.extras?.getParcelable<Collage>("KEY")

答案 14 :(得分:2)

从此活动开始另一个活动,你也可以通过Bundle Object传递参数。

public class Search_vender extends AppCompatActivity {

    String  catname,city;
    int catid;

    SearchView Vendname;
    private Session session;
    ListView listview;
    SearchAdapter adapter;
    ArrayList<Search> vendersearchlist = new ArrayList<Search>();
    ArrayList<Search> filteredSearchResults = new ArrayList<Search>();
    ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search_vender);

        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        session = new Session(Search_vender.this);

        progressDialog = new ProgressDialog(Search_vender.this);
        progressDialog.setCancelable(false);

        catid = getIntent().getIntExtra("CatId",00);
        catname= getIntent().getStringExtra("CatName");
        city = session.getUserLocation().get(session.KEY_UCITY);

        //Toast.makeText(Search_vender.this,catid + city,Toast.LENGTH_LONG).show();
        listview = (ListView) findViewById(R.id.listview);
        Vendname = (SearchView) findViewById(R.id.searchitem);
        Vendname.setQueryHint("Search "+catname+" in "+city);




        Vendname.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // TODO Auto-generated method stub

                //Toast.makeText(Search_vender.this, String.valueOf(hasFocus),Toast.LENGTH_SHORT).show();
            }
        });

        Vendname.setOnQueryTextListener(new OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                // TODO Auto-generated method stub

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                if(newText.length() > 2){

                    listview.setVisibility(View.VISIBLE);
                    GetDataVender gv = (GetDataVender) new GetDataVender().execute(newText);
                }else{

                    listview.setVisibility(View.INVISIBLE);
                }

                return false;
            }
        });

    }

    public void filterSearchArray(String newText){
        String pName;

        filteredSearchResults.clear();
        for (int i = 0; i < vendersearchlist.size(); i++)
        {
            pName = vendersearchlist.get(i).getVname().toLowerCase();
            if ( pName.contains(newText.toLowerCase()))
            {
                filteredSearchResults.add(vendersearchlist.get(i));
            }
        }
    }


    class GetDataVender extends AsyncTask<String, Void, String>{
        String textsearch;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.setMessage("Loading Please Wait...");
            showDialog();
        }

        @Override
        protected String doInBackground(String... strings) {

            OkHttpClient client = new OkHttpClient();
            okhttp3.Request request = new okhttp3.Request.Builder()
                    .url("http://api.zesteve.com/autosearch.php?city="+city+"&catid="+catid+"&name="+strings[0])
                    .build();
            this.textsearch = strings[0];
            try {

                Response response = client.newCall(request).execute();
                JSONArray array = new JSONArray(response.body().string());

                for (int i=0; i<array.length(); i++){

                    JSONObject object =array.getJSONObject(i);

                    Search catagory = new Search(object.getInt("id"),
                            object.getString("name"));

                    vendersearchlist.add(catagory);
                }

            }catch (IOException e){
                e.printStackTrace();
            } catch (JSONException e) {
                System.out.println("End of Catagory");
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            if(result != null && result.equalsIgnoreCase("Exception Caught")){
                Toast.makeText(Search_vender.this, "Unable to connect to server,please try later", Toast.LENGTH_LONG).show();
                hideDialog();
            }else{

                filterSearchArray(textsearch);
                listview.setAdapter(new SearchAdapter(Search_vender.this,filteredSearchResults));
                hideDialog();
            }

            //hideDialog();
            //adapter.notifyDataSetChanged();
        }
    }

    private void showDialog() {
        if (!progressDialog.isShowing())
            progressDialog.show();
    }

    private void hideDialog() {
        if (progressDialog.isShowing())
            progressDialog.dismiss();
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}

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

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

答案 15 :(得分:2)

科特林

第一个活动

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"))

答案 16 :(得分:1)

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

答案 17 :(得分: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()处理程序中弹出这些页面。

答案 18 :(得分:1)

虽然已经提供了正确的答案,但我在这里用Kotlin语言搜索答案。这个问题不是针对特定语言的,所以我在Kotlin语言中添加代码来完成这个任务。

以下是如何在Kotlin中为andorid

执行此操作
testActivityBtn1.setOnClickListener{
      val intent = Intent(applicationContext,MainActivity::class.java)
      startActivity(intent)

 }

答案 19 :(得分:0)

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

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");

答案 20 :(得分:0)

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

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

在初始化并处理活动中的点击监听器后,如下所示。

在“创建活动时”方法中:

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

答案 21 :(得分:0)

点击按钮后

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
}

答案 22 :(得分:0)

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

  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>

答案 23 :(得分:0)

首先在xml中使用Button。

 pre.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });

制作按钮列表。

$('[name="TEXT_BOX_FIELD"]').val("Hello");

答案 24 :(得分:0)

您的按钮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);
    }
});

答案 25 :(得分:0)

 imageView.setOnClickListener(v -> {
// your code here
        });