endian11
2020-09-18 b41f9db09c0145d4530e78c0c53d0a1cacd29e03
完成线路采集(未充分测试——)
13个文件已修改
399 ■■■■ 已修改文件
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusOutWorker.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteBean.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteBeanDao.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteLineRepository.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteLineViewModel.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/app.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/bean/ExamPlatformData.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/SignalConfigFragment.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/routecollect/bean/RoadCrossInfo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/routecollect/bean/RoadInfo.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/widget/StatusDialog.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_project_collect.xml 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusOutWorker.kt
@@ -138,7 +138,7 @@
            if (listContainsSameValue(indexs)) {
                MyLog.i(TAG, "sendSignalConfigsToRemote: 有相同的index,不能发送" + gson.toJson(signalConfiglist))
            } else {
                AYSdk.getInstance().sendCmd(safeluck.drive.evaluation.Constant.SEND_CONFIG_SIGNAL, gson.toJson(signalConfiglist))
//                AYSdk.getInstance().sendCmd(safeluck.drive.evaluation.Constant.SEND_CONFIG_SIGNAL, gson.toJson(signalConfiglist))
            }
        }
    }
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteBean.java
@@ -17,6 +17,15 @@
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String routeName;
    private int currentCollectFlag;//1-当前正在采 ,整张表唯一,只有一个线路正处于采集当中
    public int getCurrentCollectFlag() {
        return currentCollectFlag;
    }
    public void setCurrentCollectFlag(int currentCollectFlag) {
        this.currentCollectFlag = currentCollectFlag;
    }
    public int getId() {
        return id;
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteBeanDao.java
@@ -19,6 +19,18 @@
public interface RouteBeanDao {
    @Query("SELECT * FROM RouteBean")
    LiveData<List<RouteBean>> getAllRoutes();
    @Query("SELECT * FROM RouteBean where currentCollectFlag=1")
    RouteBean getCurrRouteBean();
    //更新整张表的 采集标志
    @Query("UPDATE RouteBean SET currentCollectFlag=0 ")
    void setCurrtentNotCollectFlag();
    //更新某个id的采集标志
    @Query("UPDATE RouteBean SET currentCollectFlag=1 where routeName=:name ")
    void setCurrtentFlagWithName(String name);
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertRouteBean(RouteBean routeBean);
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteLineRepository.java
@@ -1,6 +1,7 @@
package safeluck.drive.evaluation.DB.route;
import android.app.Application;
import android.text.TextUtils;
import androidx.lifecycle.LiveData;
@@ -72,4 +73,15 @@
    public LiveData<List<RouteBean>> getAllRouteBeans() {
        return routeBeans;
    }
    public void updateCurrCollectFlag(String name) {
        WorkRoomDataBase.dataBaseWriteExecutor.execute(()->{
            routeBeanDao.setCurrtentNotCollectFlag();
            if (!TextUtils.isEmpty(name)){
                routeBeanDao.setCurrtentFlagWithName(name);
            }
        });
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/route/RouteLineViewModel.java
@@ -49,5 +49,7 @@
    }
    public void updateCurrCollectFlag(String name) {
        workRepository.updateCurrCollectFlag(name);
    }
}
app/src/main/java/safeluck/drive/evaluation/app.java
@@ -180,7 +180,10 @@
//                CEventCenter.dispatchEvent(Constant.BIND_RTKCONFIG_TOPIC,cmd,0,"");
                break;
            case Constant.JUDGE_INFO:
                if (ExamPlatformData.getInstance().getTrainingMode()==ExamPlatformData.ROUTE_MODE){
                    MyLog.i(TAG,"采集模式不接受评判消息");
                    return;
                }
                if(!TextUtils.isEmpty(json)){
                    final JKMessage0203 jkMessage0203 = new JKMessage0203();
app/src/main/java/safeluck/drive/evaluation/bean/ExamPlatformData.java
@@ -22,6 +22,7 @@
import safeluck.drive.evaluation.DB.appstatusdb.AppStatusWorker;
import safeluck.drive.evaluation.app;
import safeluck.drive.evaluation.platformMessage.PlatFormConstant;
import safeluck.drive.evaluation.routecollect.bean.RoadInfo;
import safeluck.drive.evaluation.util.SPUtils;
import safeluck.drive.evaluation.viewmodels.ExamPlatformModel;
import safeluck.drive.evaluation.viewmodels.MainViewModel;
@@ -34,6 +35,25 @@
    public static final int PERSON_TYPE_STU = 1;//人员类型为学员
    public static final int COACH_ID = 1002;//教练数据库表里面的唯一id
    public static final int STU_ID = 1001;//学员数据库表里面的唯一id
    //一id学员数据库表里面的唯
    public static final int  ROAD_ITEM_NONE = 0;
    //一id学员数据库表里面的唯
    public static final int  ROAD_ITEM_CHANGE_LANE        = 1;
    //一id学员数据库表里面的唯
    public static final int  ROAD_ITEM_OVERTAKE           = 2;
    //一id学员数据库表里面的唯
    public static final int  ROAD_ITEM_STRAIGHT           = 3;
    //一id学员数据库表里面的唯
    public static final int  ROAD_ITEM_OPERATE_GEAR       = 4;
    public static final int  ROAD_ITEM_START_CAR                = 5;
    public static final int  ROAD_ITEM_PARK_SIDE              = 6;
    public static final int  ROAD_ITEM_CROSS_WALK              = 7;
    public static final int  ROAD_ITEM_BUS_AREA               = 8;
    public static final int  ROAD_ITEM_SCHOOL_AREA               = 9;
    public static final int MODE_NONE = 0;
    public static final int EXAM_TYPE_LUKAO_Light = 3;
@@ -159,6 +179,12 @@
    private String rtkIP = "47.93.80.84";
    public final int MAX_SCORE_DUCT = 20;
    private String coachID;//教练员身份证号码
    //保存采集模式下的道路信息
    private RoadInfo roadInfo;
    //当前采集线路的名称
    private String routeLineName;
    private int routeItem= ROAD_ITEM_NONE;
    public static ExamPlatformData getInstance() {
        return ourInstance;
@@ -480,4 +506,32 @@
            mapInfoHeads.put(mapHeadInfo.getType(),mapHeadInfo);
        SPUtils.saveHashMap(mapInfoHeads,app.getAppContext());
    }
    public void setRouteCollectRoadInfo(RoadInfo roadInfo) {
        this.roadInfo = roadInfo;
    }
    public RoadInfo getRouteCollectRoadInfo() {
        return roadInfo;
    }
    public void setRouteCollectLineName(String string) {
        this.routeLineName = string;
    }
    public String getRouteLineName(){
        return routeLineName;
    }
    /**
     * 返回线路采集中当前采集的项目
     * @return
     */
    public int getCurrRouteItem() {
        return routeItem;
    }
    public void setCurrRouteItem(int roadItemChangeLane) {
        this.routeItem = roadItemChangeLane;
    }
}
app/src/main/java/safeluck/drive/evaluation/fragment/SignalConfigFragment.java
@@ -119,7 +119,7 @@
                Toast.makeText(_mActivity, "发送信号配置", Toast.LENGTH_SHORT).show();
                CThreadPoolExecutor.runInBackground(()->{
                    MyLog.i("click时间,发送信号");
                    DataInitKt.sendSignalConfigToRemote(app.getAppContext());
//                    DataInitKt.sendSignalConfigToRemote(app.getAppContext());
                });
                break;
app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java
@@ -7,15 +7,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import android.os.Handler;
import android.os.Message;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@@ -30,8 +26,7 @@
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TableRow;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
@@ -107,6 +102,8 @@
    private static final String TAG = TrainFragment.class.getSimpleName();
    private static final int ROUTE_COLLECT = 5;//线路采集标志
    private RouteBean currRouteBean;
    private ScrollView scrollView;
    public static SupportFragment newInstance() {
@@ -131,6 +128,11 @@
    private static final int ADD_DATA = 1;
    private TextView tv_speed,tv_total_score,tv_name
            ,tv_start_time,tv_coach_name;
    //主要用来展示线路采集时的信息
    private TextView tv_route_collect_info;
    private StringBuilder stringBuilder = new StringBuilder();
    private double speed=0.0;
    private ImageView iv_head,iv_coach_head;
    WokViewModel wokViewModel;
@@ -143,6 +145,12 @@
    private String content;//用以生成二维码的内容
    RouteCollectController routeCollectController;
    //要插入数据库的路口信息
    private RouteCross routeCross;
    //要插入数据库的触发线信息
    private RouteTriggerLine routeTriggerLine;
private List<Integer> btn_ids = new ArrayList<Integer>();
private HashMap<String,Integer> routeCollect_btn_ids = new HashMap<>();
@@ -375,6 +383,7 @@
        }else{
            if (exam_type == ROUTE_COLLECT){
                items_score.setVisibility(View.GONE);
                items.setVisibility(View.GONE);
                route_collect.setVisibility(View.VISIBLE);
@@ -397,6 +406,17 @@
                    mRouteBeans.clear();
                if (routeBeans.size()>0){
                    for (int i = 0; i < routeBeans.size(); i++) {
                        if (routeBeans.get(i).getCurrentCollectFlag()==1){
                            currRouteBean = routeBeans.get(i);
                            ExamPlatformData.getInstance().setRouteCollectLineName(currRouteBean.getRouteName());
                            stringBuilder.delete(0,stringBuilder.length());
                            stringBuilder.append("当前采集线路名称:"+currRouteBean.getRouteName());
                            stringBuilder.append("\n");
                            tv_route_collect_info.setText(stringBuilder.toString());
                            break;
                        }
                    }
                    mRouteBeans.addAll(routeBeans);
                }
            }
@@ -553,6 +573,8 @@
    private void initView(View view) {
        tv_route_collect_info = view.findViewById(R.id.tv_route_info);
        routeCollectController = new RouteCollectController(this);
        items = view.findViewById(R.id.items);
        items_score=view.findViewById(R.id.items_score);
@@ -681,10 +703,12 @@
                                            if (string.equalsIgnoreCase(bean.getRouteName())){
                                                //有重名的线路,提示用户并不开启线路采集
                                                Toast.makeText(_mActivity, "继续采集"+bean.getRouteName(), Toast.LENGTH_SHORT).show();
                                                routeLineViewModel.updateCurrCollectFlag(string);
                                                flag = true;
                                                break;
                                            }
                                        }
                                        Toast.makeText(_mActivity, "线路采集", Toast.LENGTH_SHORT).show();
                                        ExamPlatformData.getInstance().setTrainingMode(ExamPlatformData.ROUTE_MODE);
                                        exam_type = 5;
@@ -693,8 +717,11 @@
                                        items_score.setVisibility(View.GONE);
                                        route_collect.setVisibility(View.VISIBLE);
                                        if (!flag){
                                            RouteBean routeBean = new RouteBean();
                                            routeBean.setRouteName(string);
                                            routeBean.setCurrentCollectFlag(1);
                                            ExamPlatformData.getInstance().setRouteCollectLineName(string);
                                            routeLineViewModel.insertRouteBean(routeBean);
                                        }
@@ -715,7 +742,7 @@
                    if (exam_type == ROUTE_COLLECT){
                        Toast.makeText(_mActivity, "结束采集", Toast.LENGTH_SHORT).show();
                        routeLineViewModel.updateCurrCollectFlag("");
                        ExamPlatformData.getInstance().setTrainingMode(ExamPlatformData.MODE_NONE);
                        exam_type = 0;
                        examStatusViewModel.updateStartExam(exam_type);
@@ -791,6 +818,34 @@
                    Map.Entry<String, Integer> next = iterator.next();
                    if (next.getValue()== v.getId()){
                routeCollectController.startCollect();
                switch (next.getKey()){
                    case "超车":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_OVERTAKE);
                        break;
                        case "变更车道":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_CHANGE_LANE);
                        break;
                        case "直线行驶":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_STRAIGHT);
                        break;
                        case "加减档":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_OPERATE_GEAR);
                        break;
                        case "靠边停车":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_PARK_SIDE);
                        break;
                        case "通过人行横道":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_CROSS_WALK);
                        break;
                        case "通过学校区域":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_SCHOOL_AREA);
                        break;
                        case "通过公共汽车站":
                        ExamPlatformData.getInstance().setCurrRouteItem(ExamPlatformData.ROAD_ITEM_BUS_AREA);
                        break;
                }
                        stringBuilder.append("当前采集项目:"+next.getKey());
                        stringBuilder.append("\n");
                Toast.makeText(_mActivity, String.format("点击了%s",next.getKey()), Toast.LENGTH_SHORT).show();
                break;
                    }
@@ -1050,26 +1105,128 @@
    @Override
    public void beginCollectView() {
        Log.i(TAG,"BIND_RTK_INFO_MAP");
        CThreadPoolExecutor.runOnMainThread(()->{
            StatusDialog.with(_mActivity).setType(StatusDialog.Type.PROGRESS).setCancelable(true).show();
        });
    }
    @Override
    public void endCollectView() {
        Log.i(TAG,"endCollectView");
        CThreadPoolExecutor.runOnMainThread(()->{
//            StatusDialog.with(_mActivity).setType(StatusDialog.Type.PROGRESS).dismiss();
        });
        routeCollectController.endCollect();
    }
    @Override
    public void routeItem(CollectPointResult collectPointResult) {
        Log.i(TAG,String.format("x=%f,y=%f",collectPointResult.getX(),collectPointResult.getY()));
        RoadInfo roadInfo = ExamPlatformData.getInstance().getRouteCollectRoadInfo();
        if (roadInfo != null && roadInfo.getStatus()==1){
            Log.i(TAG,"在某个路里面"+roadInfo.getRoad_id());
            routeTriggerLine.setX(collectPointResult.getX());
            routeTriggerLine.setY(collectPointResult.getY());
            routeTriggerLine.setType(ExamPlatformData.getInstance().getCurrRouteItem());
            routeTriggerLine.setRoad(roadInfo.getRoad_id());
            routeTriggerLine.setRouteline_id(currRouteBean.getId());
            routeLineViewModel.insertRouteTriggerLine(routeTriggerLine);
        }
        stringBuilder.append(String.format("x=%f,y=%f",collectPointResult.getX(),collectPointResult.getY()));
        stringBuilder.append("\n");
        showRouteCollectInfoText();
    }
    private void showRouteCollectInfoText(){
        CThreadPoolExecutor.runOnMainThread(new Runnable() {
            @Override
            public void run() {
                tv_route_collect_info.setText(stringBuilder.toString());
            }
        });
    }
    @Override
    public void roadinfo(RoadInfo roadInfo) {
            Log.i(TAG,String.format("道路信息%s",roadInfo.toString()));
            //道路信息是没有进行本地保存的,如果崩溃的话,就有问题
            ExamPlatformData.getInstance().setRouteCollectRoadInfo(roadInfo);
            stringBuilder.append(String.format("道路信息%s",roadInfo.toString()));
            stringBuilder.append("\n");
            showRouteCollectInfoText();
    }
    @Override
    public void roadcrossInfo(RoadCrossInfo roadCrossInfo) {
        Log.i(TAG,String.format("道路路口信息%s",roadCrossInfo.toString()));
        stringBuilder.append(String.format("道路路口信息%s",roadCrossInfo.toString()));
        stringBuilder.append("\n");
        showRouteCollectInfoText();
        CThreadPoolExecutor.runInBackground(new Runnable() {
            @Override
            public void run() {
                routeCross = new RouteCross();
                routeCross.setRouteline_id(currRouteBean.getId());
                routeCross.setRoad(roadCrossInfo.getRoad_id());
                routeCross.setIdx(roadCrossInfo.getCrossing_index());
                if (roadCrossInfo.getStatus() == 1){
                    CThreadPoolExecutor.runOnMainThread(new Runnable() {
                        @Override
                        public void run() {
                            SelectDialogThree selectDialogThree = SelectDialogThree.newInstance("路口直行","路口左转弯","路口右转弯","路口掉头");
                            selectDialogThree.show(getFragmentManager(),"aaa");
                            selectDialogThree.setSelectedListener(new SelectDialogThree.OnSelectedListener() {
                                @Override
                                public void makeYourChoice(int res) {
                                    switch (res){
                                        case 0:
                                            //直行
                                            routeCross.setActive(1);
                                            break;
                                        case 1:
                                            //左转弯
                                            routeCross.setActive(2);
                                            break;
                                        case 2:
                                            //右转弯
                                            routeCross.setActive(4);
                                            break;
                                        case 3:
                                            //调头
                                            routeCross.setActive(8);
                                            break;
                                    }
                                    if (res != SelectDialogThree.SELECT_NONE){
                                        routeLineViewModel.insertRouteCross(routeCross);
                                    }else{
                                        Log.i(TAG,"在路口没有做出选择");
                                    }
                                }
                            });
                        }
                    });
                }
            }
        });
    }
    private int getRouteLine_id() {
        for (int i = 0; i < mRouteBeans.size(); i++){
            if (mRouteBeans.get(i).getRouteName().equalsIgnoreCase(ExamPlatformData.getInstance().getRouteLineName())){
                return mRouteBeans.get(i).getId();
            }
        }
        return -1;
    }
}
app/src/main/java/safeluck/drive/evaluation/routecollect/bean/RoadCrossInfo.java
@@ -41,4 +41,13 @@
    public void setStatus(int status) {
        this.status = status;
    }
    @Override
    public String toString() {
        return "RoadCrossInfo{" +
                "road_id=" + road_id +
                ", crossing_index=" + crossing_index +
                ", status=" + status +
                '}';
    }
}
app/src/main/java/safeluck/drive/evaluation/routecollect/bean/RoadInfo.java
@@ -31,4 +31,12 @@
    public void setStatus(int status) {
        this.status = status;
    }
    @Override
    public String toString() {
        return "RoadInfo{" +
                "road_id=" + road_id +
                ", status=" + status +
                '}';
    }
}
app/src/main/java/safeluck/drive/evaluation/widget/StatusDialog.java
@@ -167,5 +167,12 @@
            return progressDialog;
        }
        public void dismiss() {
            if (P.type == -1) {
                throw new IllegalArgumentException("Please set type");
            }
            progressDialog.dismiss();
        }
    }
}
app/src/main/res/layout/layout_project_collect.xml
@@ -50,29 +50,30 @@
            android:background="@drawable/btn_item_collect_bg"
            />
        <Button android:text="@string/turn_around"
            android:layout_marginTop="@dimen/ui_margin_10dp"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:id="@+id/btn_route_3"
        <Button android:text="@string/crosswalk"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:textColor="@color/color_ffffff"
            android:background="@drawable/btn_item_collect_bg"
            />
            android:layout_width="wrap_content"
            android:layout_columnWeight="1"
            android:layout_marginTop="@dimen/ui_margin_10dp"
        <Button android:text="@string/by_crossing"
            android:layout_marginTop="@dimen/ui_margin_10dp"
            android:layout_rowWeight="1"
            android:id="@+id/btn_route_12"
            android:background="@drawable/btn_item_collect_bg"/>
        <Button android:text="@string/straight_line"
            android:textColor="@color/color_ffffff"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:id="@+id/btn_route_4"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:background="@drawable/btn_item_collect_bg"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            />
            android:layout_marginTop="@dimen/ui_margin_10dp"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:id="@+id/btn_route_13"
            android:background="@drawable/btn_item_collect_bg"/>
        <Button android:text="@string/lane_change"
            android:layout_marginTop="@dimen/ui_margin_10dp"
@@ -86,16 +87,6 @@
            android:background="@drawable/btn_item_collect_bg"
     />
        <Button android:text="@string/side_by_side"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:id="@+id/btn_route_6"
            android:layout_marginBottom="10dp"
            android:textColor="@color/color_ffffff"
            android:background="@drawable/btn_item_collect_bg"
            />
        <Button android:text="@string/over_take"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
@@ -127,11 +118,23 @@
            android:layout_rowWeight="1"
            android:background="@drawable/btn_item_collect_bg"/>
        <Button android:text="@string/side_by_side"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:id="@+id/btn_route_6"
            android:visibility="gone"
            android:layout_marginBottom="10dp"
            android:textColor="@color/color_ffffff"
            android:background="@drawable/btn_item_collect_bg"
            />
        <Button android:text="@string/junction_left"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:textColor="@color/color_ffffff"
            android:visibility="gone"
            android:id="@+id/btn_route_10"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
@@ -142,33 +145,56 @@
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:textColor="@color/color_ffffff"
            android:visibility="gone"
            android:layout_columnWeight="1"
            android:id="@+id/btn_route_11"
            android:layout_rowWeight="1"
            android:background="@drawable/btn_item_collect_bg"/>
        <Button android:text="@string/crosswalk"
        <Button android:text="@string/turn_around"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:id="@+id/btn_route_3"
            android:visibility="gone"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:textColor="@color/color_ffffff"
            android:layout_width="wrap_content"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:id="@+id/btn_route_12"
            android:background="@drawable/btn_item_collect_bg"/>
            android:background="@drawable/btn_item_collect_bg"
            />
        <Button android:text="@string/straight_line"
        <Button android:text="@string/by_crossing"
            android:textColor="@color/color_ffffff"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            android:layout_marginLeft="@dimen/ui_margin_20dp"
            android:id="@+id/btn_route_4"
            android:visibility="gone"
            android:layout_marginRight="@dimen/ui_margin_20dp"
            android:layout_marginBottom="10dp"
            android:id="@+id/btn_route_13"
            android:background="@drawable/btn_item_collect_bg"/>
            android:background="@drawable/btn_item_collect_bg"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            />
    </GridLayout>
<ScrollView
    android:layout_width="380dp"
    android:id="@+id/scrollview"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="380dp"
        android:layout_height="wrap_content"
        android:background="@drawable/stu_score_title"
        android:id="@+id/tv_route_info"
        android:gravity="center_vertical"
        android:descendantFocusability="blocksDescendants"
        android:textColor="#FFFFFF"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:drawablePadding="5dp"
        android:paddingLeft="19dp"
        android:textSize="@dimen/network_train_textsize22px"
        android:text="项目列表"/>
</ScrollView>
</LinearLayout>