按键响应的第一种方式:
- 在XML文件里面设置按键的onClick绑定函数。就像下面的代码,给Button设置onClick属性,在按键被按下的时候,会调用java文件里面的onClickbtton1这个函数,因为现已将它和这个按钮进行了绑定。利用布局文件中的onClick属性,并在实现文件中实现该方法。注意的是这里的方法名应该和布局文件中onClick属性的方法名相同,该方法必须是public方法。
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickbtton1"
android:text="按键一"
/>
- 下面是两个通过两个按键来调用绑定的函数的XML代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickbtton1"
android:text="按键一"
/>
<Button
android:id="@+id/btn2"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickbtton1"
android:text="按键二"
/>
</RelativeLayout>
- java代码:
package com.fhn.buttonresponse;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickbtton1(View v) //这个函数的权限必须是public,否则会找不到这个函数
{
int id=v.getId(); //通过getId()来获取当前对象的ID,v表示函数的调用者
//按键一按下V就表示按键一,按键二被按下V就表示按键二,通过getId可以获取他们的ID
switch(id){
case R.id.btn1:
System.out.println("按键一被按下");
System.out.println(id);
Toast.makeText(this, "按键一",0).show(); //this指代当前类,按键一指示要显示的内容,第三个参数表示要显示的时长0表示默认时长,这个就是在安卓APP上显示的信息
//makeText是一个构造方法,它最终会产生一个对象,通过.show来调用对象的方法
break;
case R.id.btn2:
System.out.println("按键二被按下");
System.out.println(id);
Toast.makeText(this, "按键二", 0).show();
break;
default: break;
}
}
}
按键响应的第二种方式:
关于监听器:监听器是一个存在于View类下的接口,一般以On**Llistener命名,实现该接口需要复写相应的on(View v)方法(如onClick(View v))。Android提供的基于事件监听接口有OnClickListener、OnLongClickListener、OnFocusChangeListener、OnKeyListener、OnTouchListener、OnCreateContextMenuListener等。
- OnClickListener接口:该接口处理的是点击事件。在触摸模式下,是在某个View上按下并抬起的组合动作,而在键盘模式下,是某个View获得焦点后点击确定键或者按下轨迹球事件。
- OnLongClickListener接口: OnLongClickListener接口与上述的OnClickListener接口原理基本相同,只是该接口为View长按事件的捕捉接口,即当长时间按下某个View时触发的事件。
- OnFocusChangeListener接口:OnFocusChangeListener接口用来处理控件焦点发生改变的事件。如果注册了该接口,当某个控件失去焦点或者获得焦点时都会触发该接口中的回调方法。
- OnKeyListener接口:是对手机键盘进行监听的接口,通过对某个View注册并监听,当View获得焦点并有键盘事件时,便会触发该接口中的回调方法。
- OnTouchListener接口:是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。
- OnCreateContextMenuListener接口:是用来处理上下文菜单显示事件的监听接口。该方法是定义和注册上下文菜单的另一种方式。
方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener)。常见的继承方法如下:
class MyListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"you have clicked Button2",Toast.LENGTH_SHORT).show();
}
OnClickListener接口的使用(XML文件只需要为控件设置ID即可,不用绑定函数,需要在java文件中将XML文件中的按键和java代码通过findViewById关联起来):
package com.fhn.buttonresponse;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
首先应该实现接口类,再类中实现onClick方法,实现业务代码。
class Myclick implements View.OnClickListener //继承View的OnClickListener这个方法
{
@Override
public void onClick(View v) {
int id=v.getId();
switch(id){
case R.id.btn1:
System.out.println("按键一被按下");
System.out.println(id);
//Toast.makeText(this, "按键一",0).show(); //this指代当前类,按键一指示要显示的内容,第三个参数表示要显示的时长0表示默认时长
//makeText是一个构造方法,它最终会产生一个对象,通过.show来调用对象的方法
break;
case R.id.btn2:
System.out.println("按键二被按下");
System.out.println(id);
//Toast.makeText(this, "按键二", 0).show();
break;
default: break;
}
}
}
public class MainActivity extends Activity {
Button btu1;
Button btu2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btu1 =(Button)findViewById(R.id.btn1);//将java文件里面的btu1和XML文件里面的btn1相关联
btu2 =(Button)findViewById(R.id.btn2);//将java文件里面的btu2和XML文件里面的btn2相关联
btu1.setOnClickListener(new Myclick());
btu2.setOnClickListener(new Myclick());
}
}
方法二:实现匿名内部类。这种方法适合只希望对监听器进行一次性使用的情况,在该代码块运行完毕之后,该监听器也就不复存在了。
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"you have clicked Button1",Toast.LENGTH_SHORT).show();
}
});
使用匿名内部类的方式创建监听器:
package com.fhn.buttonresponse;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
Button btu1;
Button btu2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btu1 =(Button)findViewById(R.id.btn1);//将java文件里面的btu1和XML文件里面的btn1相关联
btu2 =(Button)findViewById(R.id.btn2);//将java文件里面的btu2和XML文件里面的btn2相关联
btu1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) { //new View.OnClickListener(){}相当于new了一个匿名内部类,然后还要实现内部类的接口onClick
// TODO Auto-generated method stub
System.out.println("按键一被按下");
System.out.println(v.getId());
Toast.makeText(MainActivity.this, "按键一", 0).show();
}
});
btu2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println("按键二被按下");
System.out.println(v.getId());
Toast.makeText(MainActivity.this, "按键二", 0).show();
}});
}
}
按键响应第三种方式(为整个Activity设置监听器):
package com.fhn.buttonresponse;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener { //MainActivity继承View.OnClickListener
//这个接口,说明这个页面具有监听按键的功能
Button btu1;
Button btu2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btu1 =(Button)findViewById(R.id.btn1);//将java文件里面的btu1和XML文件里面的btn1相关联
btu2 =(Button)findViewById(R.id.btn2);//将java文件里面的btu2和XML文件里面的btn2相关联
btu1.setOnClickListener(this); //将MainActivity这个类有的按键监听到功能设置给btu1
btu2.setOnClickListener(this);//将MainActivity这个类有的按键监听到功能设置给btu2
}
@Override
public void onClick(View v) { //按键被按下后执行这个函数
int id=v.getId();
switch(id){
case R.id.btn1:
System.out.println("按键一被按下");
System.out.println(id);
Toast.makeText(this, "按键一",0).show(); //this指代当前类,按键一指示要显示的内容,第三个参数表示要显示的时长0表示默认时长
//makeText是一个构造方法,它最终会产生一个对象,通过.show来调用对象的方法
break;
case R.id.btn2:
System.out.println("按键二被按下");
System.out.println(id);
Toast.makeText(this, "按键二", 0).show();
break;
default: break;
}
}
}
安卓页面的跳转:
- 为安卓添加一个新的界面,新建完成后可以看到
Manifest.xml
下面会新注册一个界面。
页面跳转(可以通过绑定函数加Intent实现):
就是在绑定函数里面添加Intent,新建Intent对象然后设置上下文(当前界面)和将要跳转界面的类。然后使用startActivity
方法实现跳转。
- 第一个界面的JAVA代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goSecond(View v) {
//intent去声明要跳转的界面
Intent intent=new Intent(this,SecondMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
startActivity(intent); //用startActivity去跳转页面
}
}
- 第二个文件的JAVA代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class SecondMainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_main);
}
public void gothird(View v){
Intent intent=new Intent(this,ThirdMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
//用startActivity去跳转页面
startActivity(intent);
}
}
- 第三个界面的JAVA代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class ThirdMainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third_main);
}
public void gofirst(View v){
Intent intent=new Intent(this,MainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
//用startActivity去跳转页面
startActivity(intent);
}
}
以整个Activity监听的方式实现界面跳转(以下代码能够实现由界面1到2,2到3,3到1):
- 第一个界面代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener{
Button btu1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btu1=(Button)findViewById(R.id.btn1);
btu1.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
Intent intent=new Intent(this,SecondMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
//用startActivity去跳转页面
startActivity(intent);
}
}
- 第二个界面代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class SecondMainActivity extends Activity implements View.OnClickListener {
Button btu1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_main);
btu1=(Button)findViewById(R.id.btn2);
btu1.setOnClickListener(this);
}
public void onClick(View arg0) {
Intent intent=new Intent(this,ThirdMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
//用startActivity去跳转页面
startActivity(intent);
}
}
- 第三个界面代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class ThirdMainActivity extends Activity implements View.OnClickListener {
Button btu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third_main);
btu=(Button)findViewById(R.id.btn3);
btu.setOnClickListener(this);
}
public void onClick(View arg0) {
Intent intent=new Intent(this,MainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
//用startActivity去跳转页面
startActivity(intent);
}
}
页面跳转如何传参(整型或者字符串——putExtra):
第一个界面向第二个界面传参(整数1),第二个界面向第三个界面传参(字符串sting),第三个界面向第一个界面传参(字符串string2)
- MainActivity的代码(第一个界面):
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btu1;
private String data2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent i=this.getIntent();//获取当前界面的Intent
data2=i.getStringExtra("Mydata");
Toast.makeText(this,data2, Toast.LENGTH_LONG).show();
}
public void goSecond(View v) {
//intent去声明要跳转的界面
Intent intent=new Intent(this,SecondMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
intent.putExtra("Mydata", 1);//putExtra参数是键值对的方式,这里就表示Mydata=1
startActivity(intent); //用startActivity去跳转页面
}
}
- SecondActivity文件代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class SecondMainActivity extends Activity {
private int data1;
private String data2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_main);
Intent i=this.getIntent();//获取当前界面的Intent
// data2=i.getStringExtra("Mydata");
// Toast.makeText(this,data2, Toast.LENGTH_LONG).show();
data1 =i.getIntExtra("Mydata",0);
System.out.println(data1);
Toast.makeText(this,String.valueOf(data1), Toast.LENGTH_LONG).show();
}
public void gothird(View v){
Intent intent=new Intent(this,ThirdMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
intent.putExtra("Mydata","string");//putExtra参数是键值对的方式,这里就表示Mydata=1
//用startActivity去跳转页面
startActivity(intent);
}
}
- ThirdActivity文件代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class ThirdMainActivity extends Activity {
private String data2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third_main);
Intent i=this.getIntent();//获取当前界面的Intent
data2=i.getStringExtra("Mydata");
Toast.makeText(this,data2, Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.third_main, menu);
return true;
}
public void gofirst(View v){
Intent intent=new Intent(this,MainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
intent.putExtra("Mydata","string2");//putExtra参数是键值对的方式,这里就表示Mydata=1
//用startActivity去跳转页面
startActivity(intent);
}
}
使用Bundle的方式实现界面的数据传输:
- MainActivity文件代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
Button btu1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goSecond(View v) {
//intent去声明要跳转的界面
Intent intent=new Intent(this,SecondMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
Bundle bundle1=new Bundle();//新建一个bundle对象
bundle1.putChar("char", 'a'); //传一个字符
bundle1.putString("string", "string");//传字符串
intent.putExtras(bundle1);//将bundle1进行传输
startActivity(intent);//用startActivity去跳转页面
}
}
- SecondActivity文件代码:
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SecondMainActivity extends Activity {
char a;
String d;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_main);
Intent i=this.getIntent(); //获取当前界面的Intent
Bundle b=i.getExtras(); //新建Bundle对象,来获取大量数据
a=b.getChar("char"); //获得字符
d=b.getString("string"); //获得字符串
Toast.makeText(this,Character.toString(a),0).show();
Toast.makeText(this,d,0).show();
}
public void gothird(View v){
Intent intent=new Intent(this,ThirdMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
//用startActivity去跳转页面
startActivity(intent);
}
}
安卓界面实现自动跳转:
当使用Thread.sleep();
这个线程延时函数的时候,会出现第一个界面无法显示的问题,因为在一个APP启动的时候会有一个主要的UI线程,而这个sleep实在当前的UI线程去做了阻塞的,UI显示会不断的刷新屏幕界面,而这时候sleep就是在刷新屏幕界面的时候阻塞,所以会造成界面出不来(无法看到界面的任何字符)。既然要实现界面的自动跳转就一定要用到sleep
但是不能在当前线程,要在一个新的线程里面去sleep,启动另外一个线程,在新的线程里面sleep后显示一个新的界面。
使用java开辟线程:
Thread t=new Thread(); //实例化了一个线程,但是没有启动线程
t.start(); //这时候才启动了线程
但是这样并不知道你要在新的线程里面干什么,所以要要实例化的时候,添加参数:
Thread t=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
Runnable是一个接口,你需要重写里面的run方法(run方法里面就是写的你真正要干的工作)
- 实现运行APP3S后从第一界面跳转到第二界面
package com.fhn.jump;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000); //3000毫秒
} catch (InterruptedException e) { // 这里有一个异常处理
// TODO Auto-generated catch block
e.printStackTrace();
}
// intent去声明要跳转的界面
Intent intent = new Intent(MainActivity.this, SecondMainActivity.class);// 这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
// 第二个参数就是目标页面的类
startActivity(intent);// 用startActivity去跳转页面
}
});
t.start(); //启动线程去执行run里面的内容
}
public void goSecond(View v) {
//intent去声明要跳转的界面
Intent intent=new Intent(this,SecondMainActivity.class);//这个构造方法,第一个参数就是上下文(当前页面)的意思,这里this就是指代MainActivity
//第二个参数就是目标页面的类
startActivity(intent); //用startActivity去跳转页面
}
}
Activity的生命周期:
相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程。
- 启动Activity:系统会先调用
onCreate
方法,然后调用onStart
方法,最后调用onResume
,Activity进入运行状态。 - 当前Activity被其他Activity覆盖其上或被锁屏:系统会调用
onPause
方法,暂停当前Activity的执行。 - 当前Activity由被覆盖状态回到前台或解锁屏:系统会调用
onResume
方法,再次进入运行状态。 - 当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用
onStop
方法,进入停滞状态。 - 用户后退回到此Activity:系统会先调用
onRestart
方法,然后调用onStart
方法,最后调用onResume
方法,再次进入运行状态。 - 当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
- 用户退出当前Activity,系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。