按键响应的第一种方式:
- 在XML文件里面设置按键的onClick绑定函数。就像下面的代码,给Button设置onClick属性,在按键被按下的时候,会调用java文件里面的onClickbtton1这个函数,因为现已将它和这个按钮进行了绑定。利用布局文件中的onClick属性,并在实现文件中实现该方法。注意的是这里的方法名应该和布局文件中onClick属性的方法名相同,该方法必须是public方法。
<Buttonandroid: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" ><Buttonandroid:id="@+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onClickbtton1"android:text="按键一"/><Buttonandroid: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 {@Overrideprotected 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可以获取他们的IDswitch(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{@Overridepublic 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这个方法
{@Overridepublic 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;@Overrideprotected 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() {@Overridepublic 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;@Overrideprotected 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(){@Overridepublic void onClick(View v) { //new View.OnClickListener(){}相当于new了一个匿名内部类,然后还要实现内部类的接口onClick// TODO Auto-generated method stubSystem.out.println("按键一被按下");System.out.println(v.getId());Toast.makeText(MainActivity.this, "按键一", 0).show();} });btu2.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubSystem.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;@Overrideprotected 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这个类有的按键监听到功能设置给btu1btu2.setOnClickListener(this);//将MainActivity这个类有的按键监听到功能设置给btu2}@Overridepublic 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 {@Overrideprotected 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 {@Overrideprotected 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 {@Overrideprotected 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btu1=(Button)findViewById(R.id.btn1);btu1.setOnClickListener(this);}@Overridepublic 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;@Overrideprotected 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;@Overrideprotected 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent i=this.getIntent();//获取当前界面的Intentdata2=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=1startActivity(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;@Overrideprotected 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_third_main);Intent i=this.getIntent();//获取当前界面的Intentdata2=i.getStringExtra("Mydata");Toast.makeText(this,data2, Toast.LENGTH_LONG).show();}@Overridepublic 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;@Overrideprotected 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second_main);Intent i=this.getIntent(); //获取当前界面的IntentBundle 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() {@Overridepublic 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Thread t = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000); //3000毫秒} catch (InterruptedException e) { // 这里有一个异常处理// TODO Auto-generated catch blocke.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。