close

每個android 開發者都知道 可以在string.xml 裡面新增字串

但若要自由組合成array並給list view 處理, 到後面維護會很麻煩

因為你可能會需要記array中的順序, 並依序給相印的動作

到後面實在是很麻煩, 這邊介紹一個進階用法, 讓你用看的就知道那是啥, 不用再記順序了

這邊介紹 TypedArray 這物件

大部分的認知都是用來針對自定義屬性的處理.

不過我把當作 resource 物件的處理

在Resource Strings.xml 中的範例如下:

<string name="app_text_size">Text Size</string>
<string name="app_text_color">Text Color</string>
<string name="app_background">Background Color</string>

<array name="setting_array">
    <item>@string/app_text_size</item>
    <item>@string/app_text_color</item>
    <item>@string/app_background</item>
</array>

 

在程式碼中寫使用下面方式

//一般方式 直接使用getStringArray來處理
//getResources().getStringArray(R.array.setting_array)
// 利用TypedArray 便可知道 id 與 string
// 方便處理 item click 後續處理
TypedArray array = getResources().obtainTypedArray(R.array.setting_array);
for (int i = 0; i < array.length(); i++) {
    // getResourceId(int index, int default value )
    System.out.println("id:" + array.getResourceId(i, 0) + ", String :" + array.getString(i));
}

 

其效果如下

01-06 08:26:22.279 5795-5795/com.owen.blogapp I/System.out: id:2131623969, String :Text Size
01-06 08:26:22.279 5795-5795/com.owen.blogapp I/System.out: id:2131623968, String :Text Color
01-06 08:26:22.279 5795-5795/com.owen.blogapp I/System.out: id:2131623965, String :Background Color

這樣大致上有感覺了吧, 若不懂 那看過下面的範例應來就懂了.


應用如下:

範例使用簡易的RecyclerView  來實作

在一個簡單Fragment中實作recycler view 與相對的物件

package com.owen.blogapp.fragment;

import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.owen.blogapp.R;

public class SettingFragmentSupport extends Fragment implements View.OnClickListener{
    private static final String TAG = SettingFragmentSupport.class.getSimpleName();
    public static String ID = TAG + ".ID";

    private RecyclerView mRecyclerView;
    private TextView mTextView;

    public static SettingFragmentSupport newInstance(String id) {
        Bundle args = new Bundle();
        args.putString(ID, id);
        SettingFragmentSupport fragment = new SettingFragmentSupport();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_list, container, false);
        mRecyclerView = root.findViewById(R.id.recycler_view);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                        ((LinearLayoutManager)mRecyclerView.getLayoutManager()).getOrientation()));

        mTextView = root.findViewById(R.id.item_name);
        return root;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        //一般方式 直接使用getStringArray來處理
        //getResources().getStringArray(R.array.setting_array);

        // 利用TypedArray 便可知道 id 與 string
        // 方便處理 item click 後續處理
        TypedArray array = getResources().obtainTypedArray(R.array.setting_array);
        for (int i = 0; i < array.length(); i++) {
            // getResourceId(int index, int default value )
            System.out.println("id:" + array.getResourceId(i, 0) + ", String :" + array.getString(i));
        }
        mRecyclerView.setAdapter(new Adapter(array));

    }

    @Override
    public void onClick(View v) {
        switch ((int)v.getTag()){
            case R.string.app_text_size:
                //do something
                break;
            case R.string.app_text_color:
                //do something
                break;
            case R.string.app_background:
                //do something
                break;
        }

        mTextView.setText((int)v.getTag());
    }

    private class Adapter extends RecyclerView.Adapter {

        private TypedArray mItemsArray;

        public Adapter(TypedArray array) {
            mItemsArray = array;
        }

        @Override
        public ItemVH onCreateViewHolder(ViewGroup parent, int viewType) {
            View root = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
            root.setOnClickListener(SettingFragmentSupport.this);
            return new ItemVH(root);
        }

        @Override
        public void onBindViewHolder(ItemVH holder, int position) {
            holder.setText(mItemsArray.getString(position));
            holder.setTag(mItemsArray.getResourceId(position, 0));
        }

        @Override
        public int getItemCount() {
            if (mItemsArray != null)
                return mItemsArray.length();

            return 0;
        }
    }

    private class ItemVH extends RecyclerView.ViewHolder {

        private TextView mTextView;
        private View mRoot;

        public ItemVH(View itemView) {
            super(itemView);
            mRoot = itemView;
            mTextView = itemView.findViewById(R.id.list_item_text);
        }

        public void setText(String text) {
            mTextView.setText(text);
        }

        public void setTag(int id) {
            mRoot.setTag(id);
        }
    }
}

 

經過android 轉換後 onclick function 內容會變成如下:

螢幕快照 2018-01-06 下午5.09.25.png

這樣維護起來就很方便了, 一目瞭然得知道click 事件要做什麼事情了.

arrow
arrow
    創作者介紹
    創作者 Owen Chen 的頭像
    Owen Chen

    歐文的BLOG

    Owen Chen 發表在 痞客邦 留言(0) 人氣()