1.概述
CoordinateLayout相當于一個加強版的FrameLayout偶然,是一個由Design Support庫提供的控件。在普通情況下的作用域FrameLayout一樣。特殊在于,CoordinateLayout可以監聽其所有子控件的各種事件,然後自動幫助做出最為合理的響應。
舉個例子,在前文SnackBar章節中,彈出的SnackBar提供将懸浮按鈕遮擋住了,使用CoordinateLayout可以監聽到SnackBar的彈出事件,進而自動将内部的懸浮按鈕FloatingActionButton向上偏移,確定不會被SnackBar遮擋住。如下圖所示:
未使用CoordinateLayout時效果:
使用CoordinateLayout後效果:
2.注意事項:
CoordinateLayout需要配合支援嵌套滾動的控件才能直線折疊效果。
3.實作
3.1 布局
在acticvity_main.xml中:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 添加CoordinatorLayout --> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 懸浮按鈕控件 --> <android.support.design.widget.FloatingActionButton android:id="@+id/fb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:layout_margin="35dp" android:src="@drawable/ic_mail" android:scaleType="centerCrop" app:elevation="8dp"/> </android.support.design.widget.CoordinatorLayout> </RelativeLayout>
3 處理業務
在MainActivity.java中:public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FloatingActionButton fab =findViewById(R.id.fb); //為懸浮按鈕設定監聽事件 fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //這裡需要指定MainActivity.this //Toast.makeText(MainActivity.this,"點選了懸浮按鈕",Toast.LENGTH_SHORT).show();; Snackbar.make(view,"點選了懸浮按鈕",Snackbar.LENGTH_LONG) //設定動作:第一個參數表示按鈕的文本資訊說明;第二個參數表示監聽事件 .setAction("點選我", new View.OnClickListener() { //處理按鈕監聽事件 @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "點選了SnackBar提示裡面的按鈕,展示額外資訊",Toast.LENGTH_SHORT).show(); } }).show(); } }); } }
3.3 分析
從上面可以看出,實作效果隻需要在布局檔案中添加一個CoordinateLayout即可,這裡CoordinateLayout之是以能夠監聽到SnackBar彈出事件,是因為在SnackBar的make()方法裡面傳入的view,即FloatingActionButton懸浮按鈕本身,而FloatingActionButton懸浮按鈕是CoordinateLayout中的子控件,是以SnackBar的彈出事件就能夠被監聽。