每個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 事件要做什麼事情了.
文章標籤
全站熱搜
