Material Design 兼容性控件學習

簡述

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

1、SwipeRefreshLayout

一、使用

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);複製代碼

二、效果預覽:

SwipeRefreshLayout

2、ListPopupWindow

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();複製代碼

二、效果預覽:

ListPopupWindow

3、PopupMenu

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();複製代碼

二、效果預覽:

PopupMenu

4、LinearLayoutCompat

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>複製代碼

二、效果預覽:

LinearLayoutCompat

5、RecyclerView

RecyclerView是v7包中最重要、最經常使用的控件之一,可實現線性列表、網格列表、瀑布流列表效果,卻具備高度解耦、性能優化的優點,能夠說是ListView、GridView的加強版。佈局

一、使用

RecyclerViewr的使用大致分兩步:

  • 設置適配器Adapter
  • 設置佈局管理器LayoutManager

1)設置適配器Adapter

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);
        }
    }

}複製代碼

2)設置佈局管理器LayoutManager

RecyclerView可使用佈局管理器有三種:

  • LinearLayoutManager:線性列表
  • GridLayoutManager:網格列表
  • StaggeredGridLayoutManager:瀑布流列表

以LinearLayoutManager爲例:

LinearLayoutManager(Context context, int orientation, boolean reverseLayout)複製代碼

在建立LinearLayoutManage時,能夠經過參數二指定列表的方向,經過參數三指定數據是否反轉(原本數據是從上到下進行填充,當設置了reverseLayout爲true時,數據則從下到上進行填充),GridLayoutManager及StaggeredGridLayoutManager的使用也差很少。

調用RecyclerView的setLayoutManager()便可設置佈局管理器

mRv.setLayoutManager(new LinearLayoutManager(this));複製代碼

二、效果預覽:

RecyclerView

最後附上Demo連接

github.com/GitLqr/Mate…

相關文章
相關標籤/搜索