需要将以一行三个button显示的工程模式下的测试选项改为列表形式。
首先可以使用ListView对相应的选项进行显示。
ListView所需要的:1.数据源 2.显示形式
1.首先在xml文件中定义主界面所需要的控件
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#555"
android:gravity="center"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/white" />
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
TextView用于显示有多少选项被选中
ListView用于显示所有的测试选项
2.ListView所需的布局,由一个TextView 和一个 CheckBox组成.
<TextView
android:id="@+id/tv_item"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/white"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<CheckBox
android:id="@+id/cb_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:enabled="false"/>
通过设置权重,使checkBox可以在每个item的最右方。通过对checkbox的点击和获取焦点设置使点击事件由ListView的item进行拦截。
3.具体代码
需要listView所用的adapter,以及adapter所接收的数据源。
// chenzilong add start
public class ListAdapter extends BaseAdapter {
Context context;
List<ItemBean> beans;
public ListAdapter(Context context, List<ItemBean> beans) {
this.context = context;
this.beans = beans;
}
@Override
public int getCount() {
return beans.size();
}
@Override
public Object getItem(int arg0) {
return beans.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.item_view, null);
holder = new ViewHolder();
holder.tv_item = (TextView) convertView
.findViewById(R.id.tv_item);
holder.cb_item = (CheckBox) convertView
.findViewById(R.id.cb_item);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_item.setText(beans.get(position).getmName());
holder.cb_item.setChecked(beans.get(position).ismChecked());
if(beans.get(position).getmStatus() == 1){
convertView.setBackgroundColor(Color.GREEN);
}else if(beans.get(position).getmStatus() == -1){
convertView.setBackgroundColor(Color.RED);
}else{
convertView.setBackgroundColor(Color.BLACK);
}
return convertView;
}
class ViewHolder {
public TextView tv_item;
public CheckBox cb_item;
}
}
public class ItemBean {
private String mName;
private boolean mChecked;
private int mStatus = 0;
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public boolean ismChecked() {
return mChecked;
}
public void setmChecked(boolean mChecked) {
this.mChecked = mChecked;
}
public int getmStatus() {
return mStatus;
}
public void setmStatus(int mStatus) {
this.mStatus = mStatus;
}
public ItemBean(String mName, boolean mChecked) {
super();
this.mName = mName;
this.mChecked = mChecked;
}
}
// chenzilong add end
itemBean的三个参数分别是测试名,是否已经测试,以及测试结束后返回的结果,通过对ListView的背景色进行设置。
当mStatus为1时,测试pass,为-1时,测试fail,分别显示绿色和红色。如果为0时不进行背景色的设置,会发生背景色乱串的情况,这样的情况是因为convertView的复用产生的。
4.MidTest执行的流程
所有的测试选项显示的界面为HandleActivity,当进入这个activity后,会调用initialize()方法进行界面的绘制。原本的情况是通过initialize方法,动态的一个个添加button并给button赋值以及其他属性的一些设置。
现在需要将initialize方法中原来的代码注释掉换上新的代码。
private void initialize() {
android.util.Log.d("test", "========== HandleActivity -> initialize()");
/*
mainLayout = (RelativeLayout) this.findViewById(R.id.handle_layout);
quit_btn = (Button) this.findViewById(R.id.quit_btn);
quit_btn.setBackgroundColor(0xFF5A595B);
Map<String, int[]> brigeMap = Utils.getBridgeMap();
List<TestPointer> pointers = XmlUtil.getPointers();
if ((null != pointers) && (0 < pointers.size())) {
LinearLayout row = null;
Button itemBtn = null;
TestPointer testPointer = null;
int itemNum = pointers.size();
for (int i=0; i<itemNum; i++) {
testPointer = pointers.get(i);
Log.d(tag,"num " + i + " " + testPointer.toString());
String activityName = testPointer.getActivity();
int[] idName = brigeMap.get(activityName);
if (0 == (i%RANK_NUM)) {
Log.d(tag,"===>>> i=" + i + ", " + "new row!");
row = new LinearLayout(this);
row.setId(Utils.rowIds[i/RANK_NUM]);
row.setOrientation(0);
RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
rllp.addRule(RelativeLayout.CENTER_HORIZONTAL);
if (0 ==(i/RANK_NUM)) {
rllp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
} else{
rllp.addRule(RelativeLayout.BELOW, Utils.rowIds[i/RANK_NUM-1]);
}
row.setLayoutParams(rllp);
}
Log.d(tag,"===>>> i=" + i + ", " + "new btn!");
itemBtn = new Button(this);
itemBtn.setText(idName[0]);
itemBtn.setId(idName[1]);
itemBtn.setBackgroundColor(0xFF5A595B);
//Add by Huanglijun 20151029 for bug SWYE-261 (Begin)
String result = Utils.getTestResult(activityName);
Log.e(tag, "result="+result);
if(Utils.RESULT_PASS.equals(result)) {
itemBtn.setBackgroundColor(Color.GREEN);
} else if(Utils.RESULT_FAIL.equals(result)) {
itemBtn.setBackgroundColor(Color.RED);
} //Add by Huanglijun 20151029 for bug SWYE-261 (End) itemBtn.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams mLinearLayout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
mLinearLayout.setMargins(5, 5, 5, 5);
itemBtn.setLayoutParams(mLinearLayout);
//itemBtn.setTextAppearance(this, R.style.handle_btn_style);
itemBtn.setTextSize(16.0f); itemBtn.setSingleLine();
itemBtn.setEllipsize(TextUtils.TruncateAt.valueOf("END"));
itemBtn.setTag(activityName); //Modify by Huanglijun 20151029 for bug SWYE-261 (Begin) itemBtn.setOnClickListener(this);
//itemBtn.setOnClickListener(this); //Modify by Huanglijun 20151029 for bug SWYE-261 (End)
row.addView(itemBtn);
itemBtn = null;
//do with last row
if (i == (itemNum-1)) {
int lastRowVirtualBtn = RANK_NUM - row.getChildCount();
if (0 != lastRowVirtualBtn) {
while(0 < lastRowVirtualBtn) {
itemBtn = new Button(this);
itemBtn.setGravity(Gravity.CENTER);
itemBtn.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout
.LayoutParams.WRAP_CONTENT,1.0f));
itemBtn.setVisibility(View.INVISIBLE);
row.addView(itemBtn);
lastRowVirtualBtn--;
}
}
}
if (RANK_NUM == row.getChildCount()) {
mainLayout.addView(row);
row = null;
}
}
}
*/
final Context context = this;
num = 0;
for (int i = 0; i < beans.size(); i++) {
TestPointer testPointer = pointers.get(i);
Log.d(tag, "num " + i + " " + testPointer.toString());
String activityName = testPointer.getActivity();
String result = Utils.getTestResult(activityName);
Log.e(tag, "result=" + result);
if (Utils.RESULT_PASS.equals(result)) {
//lv.getChildAt(i).setBackgroundColor(Color.GREEN);
beans.get(i).setmStatus(1);
num++;
} else if (Utils.RESULT_FAIL.equals(result)) {
//lv.getChildAt(i).setBackgroundColor(Color.RED);
beans.get(i).setmStatus(-1);
num++;
}
}
adapter.notifyDataSetChanged();
if ((null != pointers) && (0 < pointers.size())) {
tv_num.setText("Completed:" + num + "/27");
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
lastPos = position;
Intent intent = null;
String tag = pointers.get(position).getActivity();
String packageName = Utils.getPackageName(tag);
ItemBean bean = beans.get(position);
if (!bean.ismChecked()) {
bean.setmChecked(true);
adapter.notifyDataSetChanged();
}
v.setBackgroundColor(0xFF333333);
if (null != packageName) {
if (Utils.FM_PACKAGE.equals(packageName)) {
intent = new Intent(context, FmMainActivity.class);
context.startActivity(intent);
return;
}
if (tag.equalsIgnoreCase("EarphoneTestActivity")) {
intent = new Intent(context,
EarphoneTestActivity.class);
context.startActivity(intent);
return;
}
ComponentName componetName = new ComponentName(
packageName, packageName + "." + tag);
intent = new Intent();
intent.setComponent(componetName);
context.startActivity(intent);
}
}
});
}
}
每次进入initialize方法时,首先,通过得到每个测试项的activityName,再通过Utils方法中的方法查看该项是否有result,当result结果为pass时,我们给数据源中单项的mStatus值设置为1,失败则设置为-1。每得到一个结果就对TextView所显示的文本中需要的变量num进行++的操作,使主界面最上方的TextView动态显示已测试项目的数量。
在遍历结束后,通过adapter的notifyDataSetChanged()进行listView的重绘,得到不同的颜色背景与点击情况。
因为在onCreate和onResume中都进行了initialize()方法的调用,因此没有销毁activity,即一项测试结束后返回主界面时还会进行一次界面的重绘,显示最新的结果。
得到最新的num值后,对textView文本进行设置。
对listView的adapter的设置与监听事件都写在了initialize()中,应该也可以写在onCreate中,为了最小程度的破坏源代码的结构,尽量将代码写在了initialize中。这样就每次onResume时会重复执行。并不是太好。
点击事件中通过测试节点的集合获取当前位置的节点的activity相关参数,通过intent实现界面的跳转。
与原始代码中的button的点击事件几乎相同,可以直接查看button的点击事件
以及一些自己添加的变量
lastPos用来记录每次点击的位置,然后再重新初始化时,使用ListView的setSelection方法,使上一次测试的项目显示在最上方,避免测试到下方项目时每次重新进入时都需要重新往下拉。
大致的代码与过程差不多就是这样。