每個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 內容會變成如下:
這樣維護起來就很方便了, 一目瞭然得知道click 事件要做什麼事情了.
留言列表