按鍵響應的第一種方式:
- 在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。