Android開發-設定監聽器的四種方法
阿新 • • 發佈:2019-02-06
Android四種監聽方式:
- 實現監聽的介面
- 實現匿名內部類
- 使用外部類
- 直接在xml中設定監聽
1、使用介面方式實現監聽事件:
可直接在Activity中定義事件處理方法
優點:簡潔
缺點:可能造成程式結構混亂
2、實現匿名內部類實現監聽:
優點:可以在當前類中複用該監聽器,可自由訪問外部類的所有介面元件
3、使用外部類實現監聽:
優點:當某事件監聽器被多個GUI介面共享,且只要是完成某種業務邏輯的實現
缺點:不利於提供程式內聚性,不能自由訪問建立GUI介面類的元件,介面不夠簡潔
4、直接在xml檔案中設定監聽:
在需要監聽的控制元件中新增:Android:conClick="xxx"
再在佈局對應的Activity中定義public void xxx(View view){}
測試程式:
activity_main:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/button1" android:text="介面方式設定監聽器" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button2" android:text="直接在xml檔案中繫結" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="button2OnClick"/> <Button android:id="@+id/button3" android:text="使用匿名內部類設定監聽器" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button4" android:text="使用外部類設定監聽器" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
MainActivity:
import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Context context = MainActivity.this; private Button button1; private Button button2; private Button button3; private Button button4; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3); button4 = (Button) findViewById(R.id.button4); button1.setOnClickListener(this); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context,"使用匿名內部類實現監聽", Toast.LENGTH_SHORT).show(); } }); button4.setOnClickListener(new MyOnClickListener() { public void onClick(View view){ super.onClick(view); } }); } public void button2OnClick(View view){ Toast.makeText(context,"直接在xml檔案中繫結", Toast.LENGTH_SHORT).show(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button1: Toast.makeText(context,"以介面的方式設定監聽器", Toast.LENGTH_SHORT).show(); break; } } class MyOnClickListener implements View.OnClickListener{ @Override public void onClick(View view) { Toast.makeText(context,"使用外部類設定監聽器", Toast.LENGTH_SHORT).show(); } } }