Material Design從Android 5.0開始引入,是一種全新的設計語言,稱爲「原材料設計」,是谷歌提倡的一種設計風格、理念、原則。結合擬物設計和扁平化設計風格,融入了一些科技理念。javascript
想深刻了解的話,能夠查這篇wiki:Material Design 中文版html
*注:使用下文中介紹的控件,需在項目中引入v7包的支持。正如上面所說,Material Design從Android 5.0開始引入,故低版本的系統沒有這類控件。java
如:使用Android Studio能夠在gradle的dependencies中寫入:android
compile 'com.android.support:appcompat-v7:25.3.0'複製代碼
Eclipse的請自行百度吧,畢竟就算導入了v7包,若編譯版本和v7包的版本存在新舊問題時,v7包工程自身會報錯的,還有其餘一些細節要注意,這裏就不作介紹了。git
SwipeRefreshLayout是谷歌推出的一個下拉刷新控件,符合MD設計,使用方便,可經過其提供的方法設置控件的尺寸、顏色、刷新距頂懸浮距離等,具體使用以下:github
//設置 SwipeRefreshLayout 的尺寸
mSrl.setSize(SwipeRefreshLayout.LARGE);
//設置 SwipeRefreshLayout 刷新時的顏色切換(能夠有無數種)
mSrl.setColorSchemeColors(Color.RED, Color.YELLOW, Color.GREEN);
//設置 SwipeRefreshLayout 的背景色
mSrl.setBackgroundColor(Color.GRAY);
//設置 SwipeRefreshLayout 的下拉距離
mSrl.setDistanceToTriggerSync(100);
//設置 SwipeRefreshLayout 正在刷新監聽
mSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
...
刷新數據源
...
}
});
//手動中止刷新
mSrl.setRefreshing(false);複製代碼
popupWindow你們都知道,是Android中彈出式菜單,而ListPopupWindow顧名思義就是列表型的彈出式菜單,使用該控件能夠作到相似下拉菜單的功能,但不限如此。性能優化
mListPopupWindow = new ListPopupWindow(this);
//設置 ListPopupWindow 的數據適配器
mListPopupWindow.setAdapter(mAdapter);
//設置 ListPopupWindow 的顯示位置(在指定控件下方)
mListPopupWindow.setAnchorView(view);
//設置 ListPopupWindow 的寬度
mListPopupWindow.setWidth(200);
//設置 ListPopupWindow 的高度
mListPopupWindow.setHeight(500);
//設置 ListPopupWindow 的條目點擊事件(必須在show方法前設置,不然無效)
mListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), mItemArr[position], Toast.LENGTH_SHORT).show();
mListPopupWindow.dismiss();
}
});
mListPopupWindow.show();複製代碼
PopupMenu表明彈出式菜單,它會在指定組件上彈出PopupMenu,默認狀況下,PopupMenu會顯示在該組件的下方或上方。與ListPopupWindow的區別在於,ListPopupWindow使用適配器來填充條目,而PopupMenu則是使用menu佈局來填充條目。app
PopupMenu popupMenu = new PopupMenu(this, view);
//設置 PopupMenu 的顯示菜單項
popupMenu.inflate(R.menu.main);
// popupMenu.getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());//與一行沒什麼區別
//默認 PopupMenu 不顯示條目icon,能夠經過反射來強制使其顯示icon
Field field = popupMenu.getClass().getDeclaredField("mPopup");
field.setAccessible(true);
MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popupMenu);
mHelper.setForceShowIcon(true);
//設置 PopupMenu 的條目點擊事件(點擊後會自動dismiss)
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
return false;
}
});
//顯示 PopupMenu
popupMenu.show();複製代碼
LinearLayoutCompat是對LinearLayout的擴展,能夠爲此佈局中的子View之間添加分割線divider。能夠經過自定義屬性divider來指定分割線的樣式,經過自定義屬性showDividers來指定分割線的顯示位置。ide
<android.support.v7.widget.LinearLayoutCompat
android:id="@+id/llc"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical"
app:divider="@drawable/line"
app:showDividers="beginning">
...
子控件
...
</android.support.v7.widget.LinearLayoutCompat>複製代碼
RecyclerView是v7包中最重要、最經常使用的控件之一,可實現線性列表、網格列表、瀑布流列表效果,卻具備高度解耦、性能優化的優點,能夠說是ListView、GridView的加強版。佈局
RecyclerViewr的使用大致分兩步:
RecyclerView使用的適配器必須繼承RecyclerView.Adapter,並指定RecyclerView.ViewHolder,在onCreateViewHolder()中建立自定義的RecyclerView.ViewHolder,在onBindViewHolder()中對條目進行設置,理解上相對簡單,代碼以下:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<String> mData;
public MyAdapter(List<String> data) {
mData = data;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = View.inflate(parent.getContext(), android.R.layout.simple_list_item_1, null);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.mTv.setText(mData.get(position));
}
@Override
public int getItemCount() {
return mData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView mTv;
public MyViewHolder(View itemView) {
super(itemView);
mTv = (TextView) itemView.findViewById(android.R.id.text1);
}
}
}複製代碼
RecyclerView可使用佈局管理器有三種:
以LinearLayoutManager爲例:
LinearLayoutManager(Context context, int orientation, boolean reverseLayout)複製代碼
在建立LinearLayoutManage時,能夠經過參數二指定列表的方向,經過參數三指定數據是否反轉(原本數據是從上到下進行填充,當設置了reverseLayout爲true時,數據則從下到上進行填充),GridLayoutManager及StaggeredGridLayoutManager的使用也差很少。
調用RecyclerView的setLayoutManager()便可設置佈局管理器
mRv.setLayoutManager(new LinearLayoutManager(this));複製代碼