【Midtest】工程模式下测试界面的修改

需要将以一行三个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,即一项测试结束后返回主界面时还会进行一次界面的重绘,显示最新的结果。
【Midtest】工程模式下测试界面的修改_第1张图片
得到最新的num值后,对textView文本进行设置。

对listView的adapter的设置与监听事件都写在了initialize()中,应该也可以写在onCreate中,为了最小程度的破坏源代码的结构,尽量将代码写在了initialize中。这样就每次onResume时会重复执行。并不是太好。

点击事件中通过测试节点的集合获取当前位置的节点的activity相关参数,通过intent实现界面的跳转。
与原始代码中的button的点击事件几乎相同,可以直接查看button的点击事件

以及一些自己添加的变量
【Midtest】工程模式下测试界面的修改_第2张图片
lastPos用来记录每次点击的位置,然后再重新初始化时,使用ListView的setSelection方法,使上一次测试的项目显示在最上方,避免测试到下方项目时每次重新进入时都需要重新往下拉。

大致的代码与过程差不多就是这样。

你可能感兴趣的:(android,测试,界面)