為什么我的Material Design程序點擊時沒有波紋擴散效果

這個問題是我在模仿Chessesquare項目的時候出現(xiàn)的,沒想到這個還挺棘手的,主要是麻煩,有幾個注意事項。

這個問題困擾的時間還挺長,有時候就打算不去管它了,但是在今天卻居然莫名其妙的解決了,總結起來就是幾個問題是跟很多地方的代碼有關,有一處代碼不一樣,就沒有這種效果。

其實這是一個關于RecyclerView的問題,當我們以前使用ListView的時候,系統(tǒng)默認會給設置一個點擊時的按下效果,但是當我們使用RecyclerView時,若不設置每一個條目的背景時,那么在點擊時就沒有任何效果。本文是通過獲取系統(tǒng)提供的背景資源來設置點擊時的顯示效果。在5.0以上,會出現(xiàn)波紋擴散的效果,而在以前的Android版本,就只是單單的背景色改變,效果就是在上面的庫中展示的樣子。

上段里已經(jīng)說明的這個問題的解決方式,那么下面就通過幾個步驟來解決這個問題。不過解決不僅僅是通過改變背景資源,還有其他值得注意的地方。

1,首先要注意主題格式:

這里的話需要看一下關于5.0中的設計的顏色方案,以及style中的幾個重要item:

<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimaryDark">@color/purple_600</item>
    <item name="colorPrimary">@color/purple_400</item>
    <item name="colorAccent">@color/purple_A400</item>
    <item name="android:windowBackground">@color/purple_100</item>
</style>

此處注意下面這張圖(該圖中給出了主題顏色的主要屬性名):

material_theme 主題顏色對應.png

2,在加載layout的時候,需要給布局設置相同主題的背景資源id:

View view = LayoutInflater.from(viewGroup.getContext())
        .inflate(R.layout.check_item, viewGroup, false);
TypedValue typedValue = new TypedValue();
getActivity().getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
view.setBackgroundResource(typedValue.resourceId);

3,itemView必須要設置clickabletrue;

下面的就是整體的Adapter的代碼,如果與下面的代碼一致,那么這個效果就是有的:

final RecyclerView view = (RecyclerView) inflater.inflate(R.layout.fragment_read,container, false);
view.setLayoutManager(new LinearLayoutManager(getActivity()));
view.setAdapter(new RecyclerView.Adapter() {

    class ViewHolder extends RecyclerView.ViewHolder {
        public TextView textView;
        public ViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.check_item_textview);
            }
        }
    
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.check_item, viewGroup, false);
        TypedValue typedValue = new TypedValue();
        getActivity().getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true);
        view.setBackgroundResource(typedValue.resourceId);
        return new ViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
        ((ViewHolder)viewHolder).textView.setText("VIDEO");
        viewHolder.itemView.setClickable(true);
    }
    
    @Override
    public int getItemCount() {
        return 50;
    }
});
return view;

另外,在使用RecyclerView的時候,其Adapter不建議使用匿名內部類,因為當你不這么做時,極有可能在后續(xù)的編碼中獲益。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容