RaoMeng 9 years ago
parent
commit
380d3eeb37

+ 404 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/SwipeDismissListViewTouchListener.java

@@ -0,0 +1,404 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.xzjmyk.pm.activity;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.graphics.Rect;
+import android.os.SystemClock;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewPropertyAnimator;
+import android.widget.AbsListView;
+import android.widget.ListView;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A {@link View.OnTouchListener} that makes the list items in a {@link ListView}
+ * dismissable. {@link ListView} is given special treatment because by default it handles touches
+ * for its list items... i.e. it's in charge of drawing the pressed state (the list selector),
+ * handling list item clicks, etc.
+ *
+ * <p>After creating the listener, the caller should also call
+ * {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}, passing
+ * in the scroll listener returned by {@link #makeScrollListener()}. If a scroll listener is
+ * already assigned, the caller should still pass scroll changes through to this listener. This will
+ * ensure that this {@link SwipeDismissListViewTouchListener} is paused during list view
+ * scrolling.</p>
+ *
+ * <p>Example usage:</p>
+ *
+ * <pre>
+ * SwipeDismissListViewTouchListener touchListener =
+ *         new SwipeDismissListViewTouchListener(
+ *                 listView,
+ *                 new SwipeDismissListViewTouchListener.OnDismissCallback() {
+ *                     public void onDismiss(ListView listView, int[] reverseSortedPositions) {
+ *                         for (int position : reverseSortedPositions) {
+ *                             adapter.remove(adapter.getItem(position));
+ *                         }
+ *                         adapter.notifyDataSetChanged();
+ *                     }
+ *                 });
+ * listView.setOnTouchListener(touchListener);
+ * listView.setOnScrollListener(touchListener.makeScrollListener());
+ * </pre>
+ *
+ * <p>This class Requires API level 12 or later due to use of {@link
+ * ViewPropertyAnimator}.</p>
+ *
+ * <p>For a generalized {@link View.OnTouchListener} that makes any view dismissable,
+ * see {@link SwipeDismissTouchListener}.</p>
+ *
+ * @see SwipeDismissTouchListener
+ */
+public class SwipeDismissListViewTouchListener implements View.OnTouchListener {
+    // Cached ViewConfiguration and system-wide constant values
+    private int mSlop;
+    private int mMinFlingVelocity;
+    private int mMaxFlingVelocity;
+    private long mAnimationTime;
+
+    // Fixed properties
+    private ListView mListView;
+    private DismissCallbacks mCallbacks;
+    private int mViewWidth = 1; // 1 and not 0 to prevent dividing by zero
+
+    // Transient properties
+    private List<PendingDismissData> mPendingDismisses = new ArrayList<PendingDismissData>();
+    private int mDismissAnimationRefCount = 0;
+    private float mDownX;
+    private float mDownY;
+    private boolean mSwiping;
+    private int mSwipingSlop;
+    private VelocityTracker mVelocityTracker;
+    private int mDownPosition;
+    private View mDownView;
+    private boolean mPaused;
+
+    /**
+     * The callback interface used by {@link SwipeDismissListViewTouchListener} to inform its client
+     * about a successful dismissal of one or more list item positions.
+     */
+    public interface DismissCallbacks {
+        /**
+         * Called to determine whether the given position can be dismissed.
+         */
+        boolean canDismiss(int position);
+
+        /**
+         * Called when the user has indicated they she would like to dismiss one or more list item
+         * positions.
+         *
+         * @param listView               The originating {@link ListView}.
+         * @param reverseSortedPositions An array of positions to dismiss, sorted in descending
+         *                               order for convenience.
+         */
+        void onDismiss(ListView listView, int[] reverseSortedPositions);
+    }
+
+    /**
+     * Constructs a new swipe-to-dismiss touch listener for the given list view.
+     *
+     * @param listView  The list view whose items should be dismissable.
+     * @param callbacks The callback to trigger when the user has indicated that she would like to
+     *                  dismiss one or more list items.
+     */
+    public SwipeDismissListViewTouchListener(ListView listView, DismissCallbacks callbacks) {
+        ViewConfiguration vc = ViewConfiguration.get(listView.getContext());
+        mSlop = vc.getScaledTouchSlop();
+        mMinFlingVelocity = vc.getScaledMinimumFlingVelocity() * 16;
+        mMaxFlingVelocity = vc.getScaledMaximumFlingVelocity();
+        mAnimationTime = listView.getContext().getResources().getInteger(
+                android.R.integer.config_shortAnimTime);
+        mListView = listView;
+        mCallbacks = callbacks;
+    }
+
+    /**
+     * Enables or disables (pauses or resumes) watching for swipe-to-dismiss gestures.
+     *
+     * @param enabled Whether or not to watch for gestures.
+     */
+    public void setEnabled(boolean enabled) {
+        mPaused = !enabled;
+    }
+
+    /**
+     * Returns an {@link AbsListView.OnScrollListener} to be added to the {@link
+     * ListView} using {@link ListView#setOnScrollListener(AbsListView.OnScrollListener)}.
+     * If a scroll listener is already assigned, the caller should still pass scroll changes through
+     * to this listener. This will ensure that this {@link SwipeDismissListViewTouchListener} is
+     * paused during list view scrolling.</p>
+     *
+     * @see SwipeDismissListViewTouchListener
+     */
+    public AbsListView.OnScrollListener makeScrollListener() {
+        return new AbsListView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(AbsListView absListView, int scrollState) {
+                setEnabled(scrollState != AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
+            }
+
+            @Override
+            public void onScroll(AbsListView absListView, int i, int i1, int i2) {
+            }
+        };
+    }
+
+    @Override
+    public boolean onTouch(View view, MotionEvent motionEvent) {
+        if (mViewWidth < 2) {
+            mViewWidth = mListView.getWidth();
+        }
+
+        switch (motionEvent.getActionMasked()) {
+            case MotionEvent.ACTION_DOWN: {
+                if (mPaused) {
+                    return false;
+                }
+
+                // TODO: ensure this is a finger, and set a flag
+
+                // Find the child view that was touched (perform a hit test)
+                Rect rect = new Rect();
+                int childCount = mListView.getChildCount();
+                int[] listViewCoords = new int[2];
+                mListView.getLocationOnScreen(listViewCoords);
+                int x = (int) motionEvent.getRawX() - listViewCoords[0];
+                int y = (int) motionEvent.getRawY() - listViewCoords[1];
+                View child;
+                for (int i = 0; i < childCount; i++) {
+                    child = mListView.getChildAt(i);
+                    child.getHitRect(rect);
+                    if (rect.contains(x, y)) {
+                        mDownView = child;
+                        break;
+                    }
+                }
+
+                if (mDownView != null) {
+                    mDownX = motionEvent.getRawX();
+                    mDownY = motionEvent.getRawY();
+                    mDownPosition = mListView.getPositionForView(mDownView);
+                    if (mCallbacks.canDismiss(mDownPosition)) {
+                        mVelocityTracker = VelocityTracker.obtain();
+                        mVelocityTracker.addMovement(motionEvent);
+                    } else {
+                        mDownView = null;
+                    }
+                }
+                return false;
+            }
+
+            case MotionEvent.ACTION_CANCEL: {
+                if (mVelocityTracker == null) {
+                    break;
+                }
+
+                if (mDownView != null && mSwiping) {
+                    // cancel
+                    mDownView.animate()
+                            .translationX(0)
+                            .alpha(1)
+                            .setDuration(mAnimationTime)
+                            .setListener(null);
+                }
+                mVelocityTracker.recycle();
+                mVelocityTracker = null;
+                mDownX = 0;
+                mDownY = 0;
+                mDownView = null;
+                mDownPosition = ListView.INVALID_POSITION;
+                mSwiping = false;
+                break;
+            }
+
+            case MotionEvent.ACTION_UP: {
+                if (mVelocityTracker == null) {
+                    break;
+                }
+
+                float deltaX = motionEvent.getRawX() - mDownX;
+                mVelocityTracker.addMovement(motionEvent);
+                mVelocityTracker.computeCurrentVelocity(1000);
+                float velocityX = mVelocityTracker.getXVelocity();
+                float absVelocityX = Math.abs(velocityX);
+                float absVelocityY = Math.abs(mVelocityTracker.getYVelocity());
+                boolean dismiss = false;
+                boolean dismissRight = false;
+                if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) {
+                    dismiss = true;
+                    dismissRight = deltaX > 0;
+                } else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity
+                        && absVelocityY < absVelocityX && mSwiping) {
+                    // dismiss only if flinging in the same direction as dragging
+                    dismiss = (velocityX < 0) == (deltaX < 0);
+                    dismissRight = mVelocityTracker.getXVelocity() > 0;
+                }
+                if (dismiss && mDownPosition != ListView.INVALID_POSITION) {
+                    // dismiss
+                    final View downView = mDownView; // mDownView gets null'd before animation ends
+                    final int downPosition = mDownPosition;
+                    ++mDismissAnimationRefCount;
+                    mDownView.animate()
+                            .translationX(dismissRight ? mViewWidth : -mViewWidth)
+                            .alpha(0)
+                            .setDuration(mAnimationTime)
+                            .setListener(new AnimatorListenerAdapter() {
+                                @Override
+                                public void onAnimationEnd(Animator animation) {
+                                    performDismiss(downView, downPosition);
+                                }
+                            });
+                } else {
+                    // cancel
+                    mDownView.animate()
+                            .translationX(0)
+                            .alpha(1)
+                            .setDuration(mAnimationTime)
+                            .setListener(null);
+                }
+                mVelocityTracker.recycle();
+                mVelocityTracker = null;
+                mDownX = 0;
+                mDownY = 0;
+                mDownView = null;
+                mDownPosition = ListView.INVALID_POSITION;
+                mSwiping = false;
+                break;
+            }
+
+            case MotionEvent.ACTION_MOVE: {
+                if (mVelocityTracker == null || mPaused) {
+                    break;
+                }
+
+                mVelocityTracker.addMovement(motionEvent);
+                float deltaX = motionEvent.getRawX() - mDownX;
+                float deltaY = motionEvent.getRawY() - mDownY;
+                if (Math.abs(deltaX) > mSlop && Math.abs(deltaY) < Math.abs(deltaX) / 2) {
+                    mSwiping = true;
+                    mSwipingSlop = (deltaX > 0 ? mSlop : -mSlop);
+                    mListView.requestDisallowInterceptTouchEvent(true);
+
+                    // Cancel ListView's touch (un-highlighting the item)
+                    MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);
+                    cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
+                            (motionEvent.getActionIndex()
+                                    << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
+                    mListView.onTouchEvent(cancelEvent);
+                    cancelEvent.recycle();
+                }
+
+                if (mSwiping) {
+                    mDownView.setTranslationX(deltaX - mSwipingSlop);
+                    mDownView.setAlpha(Math.max(0f, Math.min(1f,
+                            1f - 2f * Math.abs(deltaX) / mViewWidth)));
+                    return true;
+                }
+                break;
+            }
+        }
+        return false;
+    }
+
+    class PendingDismissData implements Comparable<PendingDismissData> {
+        public int position;
+        public View view;
+
+        public PendingDismissData(int position, View view) {
+            this.position = position;
+            this.view = view;
+        }
+
+        @Override
+        public int compareTo(PendingDismissData other) {
+            // Sort by descending position
+            return other.position - position;
+        }
+    }
+
+    private void performDismiss(final View dismissView, final int dismissPosition) {
+        // Animate the dismissed list item to zero-height and fire the dismiss callback when
+        // all dismissed list item animations have completed. This triggers layout on each animation
+        // frame; in the future we may want to do something smarter and more performant.
+
+        final ViewGroup.LayoutParams lp = dismissView.getLayoutParams();
+        final int originalHeight = dismissView.getHeight();
+
+        ValueAnimator animator = ValueAnimator.ofInt(originalHeight, 1).setDuration(mAnimationTime);
+
+        animator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                --mDismissAnimationRefCount;
+                if (mDismissAnimationRefCount == 0) {
+                    // No active animations, process all pending dismisses.
+                    // Sort by descending position
+                    Collections.sort(mPendingDismisses);
+
+                    int[] dismissPositions = new int[mPendingDismisses.size()];
+                    for (int i = mPendingDismisses.size() - 1; i >= 0; i--) {
+                        dismissPositions[i] = mPendingDismisses.get(i).position;
+                    }
+                    mCallbacks.onDismiss(mListView, dismissPositions);
+                    
+                    // Reset mDownPosition to avoid MotionEvent.ACTION_UP trying to start a dismiss 
+                    // animation with a stale position
+                    mDownPosition = ListView.INVALID_POSITION;
+
+                    ViewGroup.LayoutParams lp;
+                    for (PendingDismissData pendingDismiss : mPendingDismisses) {
+                        // Reset view presentation
+                        pendingDismiss.view.setAlpha(1f);
+                        pendingDismiss.view.setTranslationX(0);
+                        lp = pendingDismiss.view.getLayoutParams();
+                        lp.height = originalHeight;
+                        pendingDismiss.view.setLayoutParams(lp);
+                    }
+
+                    // Send a cancel event
+                    long time = SystemClock.uptimeMillis();
+                    MotionEvent cancelEvent = MotionEvent.obtain(time, time,
+                            MotionEvent.ACTION_CANCEL, 0, 0, 0);
+                    mListView.dispatchTouchEvent(cancelEvent);
+
+                    mPendingDismisses.clear();
+                }
+            }
+        });
+
+        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator valueAnimator) {
+                lp.height = (Integer) valueAnimator.getAnimatedValue();
+                dismissView.setLayoutParams(lp);
+            }
+        });
+
+        mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView));
+        animator.start();
+    }
+}

+ 138 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/AskForLeaveActivity.java

@@ -1,25 +1,49 @@
 package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 
+import android.app.AlertDialog;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
+import android.widget.Button;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 import com.andreabaccega.widget.FormEditText;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.activity.SaleSelectActivity;
+import com.xzjmyk.pm.activity.ui.erp.net.ViewUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
+import com.xzjmyk.pm.activity.ui.erp.util.Constants;
+import com.xzjmyk.pm.activity.ui.erp.util.FlexJsonUtil;
+import com.xzjmyk.pm.activity.ui.erp.view.DateTimePickerDialog;
+import com.xzjmyk.pm.activity.ui.erp.view.SingleDialog;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 请假申请
  * Created by RaoMeng on 2016/10/18.
  */
-public class AskForLeaveActivity extends BaseActivity implements View.OnTouchListener {
+public class AskForLeaveActivity extends BaseActivity implements View.OnTouchListener, View.OnClickListener {
     private FormEditText mExplainEt;
+    private RelativeLayout mStartTimeRl, mEndTimeRl, mCategoryRl;
+    private Button mCommitBtn;
+    private DateTimePickerDialog dialog;
+    private TextView mStartTimeTv, mEndTimeTv, mCategoryTv;
 
+    private final static int CATEGORY_REQUEST = 101;
+    private List<String> mCategoryList = new ArrayList<>();
+    private SingleDialog singleDialog;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -28,14 +52,125 @@ public class AskForLeaveActivity extends BaseActivity implements View.OnTouchLis
 
         initViews();
         initEvents();
+        initDates();
+    }
+
+    private void initDates() {
+
     }
 
     private void initEvents() {
         mExplainEt.setOnTouchListener(this);
+        mStartTimeRl.setOnClickListener(this);
+        mEndTimeRl.setOnClickListener(this);
+        mCategoryRl.setOnClickListener(this);
+        mCommitBtn.setOnClickListener(this);
     }
 
     private void initViews() {
         mExplainEt = (FormEditText) findViewById(R.id.ask_leave_explain_et);
+        mStartTimeRl = (RelativeLayout) findViewById(R.id.ask_leave_starttime_rl);
+        mEndTimeRl = (RelativeLayout) findViewById(R.id.ask_leave_endtime_rl);
+        mCategoryRl = (RelativeLayout) findViewById(R.id.ask_leave_category_rl);
+        mCommitBtn = (Button) findViewById(R.id.ask_leave_commit_btn);
+
+        mStartTimeTv = (TextView) findViewById(R.id.ask_leave_starttime_tv);
+        mEndTimeTv = (TextView) findViewById(R.id.ask_leave_endtime_tv);
+        mCategoryTv = (TextView) findViewById(R.id.ask_leave_category_tv);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.ask_leave_starttime_rl:
+                showDataPickDialog(v);
+                break;
+            case R.id.ask_leave_endtime_rl:
+                showDataPickDialog(v);
+                break;
+            case R.id.ask_leave_category_rl:
+                progressDialog.show();
+                loadCategory("va_vacationtype", CATEGORY_REQUEST);
+                break;
+            case R.id.ask_leave_commit_btn:
+                break;
+        }
+    }
+
+    private Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case CATEGORY_REQUEST:
+                    progressDialog.dismiss();
+                    mCategoryList = (List<String>) FlexJsonUtil.fromJson(msg.getData().getString("result")).get(
+                            "combdatas");
+                    if (mCategoryList.isEmpty()) {
+                        mCategoryList.add("无");
+                    }
+                    showSimpleDialog();
+                    break;
+            }
+        }
+    };
+
+    public void showSimpleDialog() {
+        if (singleDialog == null) {
+            singleDialog = new SingleDialog(ct, "请假类型",
+                    new SingleDialog.PickDialogListener() {
+                        @Override
+                        public void onListItemClick(int position, String value) {
+                            mCategoryTv.setText(value);
+                        }
+                    });
+            singleDialog.show();
+            singleDialog.initViewData(mCategoryList);
+        } else {
+            singleDialog.show();
+            singleDialog.initViewData(mCategoryList);
+        }
+    }
+
+    /**
+     * 获取请假类型
+     *
+     * @param field
+     * @param what
+     */
+    public void loadCategory(String field, int what) {
+        Log.i("leave", "what=" + what);
+        String url = Constants.getAppBaseUrl(ct) + "mobile/common/getCombo.action";
+        Map<String, String> param = new HashMap<String, String>();
+        param.put("caller", "Ask4Leave");
+        param.put("field", field);
+        param.put("sessionId", CommonUtil.getSharedPreferences(ct, "sessionId"));
+        ViewUtil.getDataFormServer(ct, mHandler, url, param, what);
+    }
+
+
+    public void showDataPickDialog(final View view) {
+        if (dialog == null) {
+            dialog = new DateTimePickerDialog(this, System.currentTimeMillis());
+        }
+
+        dialog.setOnDateTimeSetListener(new DateTimePickerDialog.OnDateTimeSetListener() {
+            public void OnDateTimeSet(AlertDialog dia, long date) {
+                if ((view.getId() == R.id.ask_leave_starttime_rl)) {
+                    mStartTimeTv.setText(CommonUtil.getStringDateMM(date));
+                }
+
+                if ((view.getId() == R.id.ask_leave_endtime_rl)) {
+                    mEndTimeTv.setText(CommonUtil.getStringDateMM(date));
+                }
+
+                /** @注释:保证 初始化当前时间 */
+                dialog = null;
+            }
+        });
+
+        if (!dialog.isShowing()) {
+            dialog.show();
+        }
     }
 
     @Override
@@ -46,9 +181,9 @@ public class AskForLeaveActivity extends BaseActivity implements View.OnTouchLis
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()){
+        switch (item.getItemId()) {
             case R.id.oa_form:
-                Intent it_scale = new Intent(ct,SaleSelectActivity.class);
+                Intent it_scale = new Intent(ct, SaleSelectActivity.class);
                 it_scale.putExtra("caller", "Ask4Leave");
                 it_scale.putExtra("title", "请假单查询");
                 it_scale.putExtra("from", "SignMain");

+ 31 - 3
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/OvertimeApplyActivity.java

@@ -6,6 +6,9 @@ import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
+import android.widget.Button;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 import com.andreabaccega.widget.FormEditText;
 import com.xzjmyk.pm.activity.R;
@@ -17,9 +20,11 @@ import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
  * 加班申请
  * Created by RaoMeng on 2016/10/18.
  */
-public class OvertimeApplyActivity extends BaseActivity implements View.OnTouchListener {
+public class OvertimeApplyActivity extends BaseActivity implements View.OnTouchListener, View.OnClickListener {
     private FormEditText mExplainEt;
-
+    private RelativeLayout mStartTimeRl,mEndTimeRl;
+    private TextView mStartTimeTv,mEndTimeTv;
+    private Button mCommitBtn;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -32,10 +37,32 @@ public class OvertimeApplyActivity extends BaseActivity implements View.OnTouchL
 
     private void initEvents() {
         mExplainEt.setOnTouchListener(this);
+        mStartTimeRl.setOnClickListener(this);
+        mEndTimeRl.setOnClickListener(this);
+        mCommitBtn.setOnClickListener(this);
     }
 
     private void initViews() {
         mExplainEt = (FormEditText) findViewById(R.id.overtime_apply_explain_et);
+        mStartTimeRl = (RelativeLayout) findViewById(R.id.overtime_apply_starttime_rl);
+        mEndTimeRl = (RelativeLayout) findViewById(R.id.overtime_apply_endtime_rl);
+        mStartTimeTv = (TextView) findViewById(R.id.overtime_apply_starttime_tv);
+        mEndTimeTv = (TextView) findViewById(R.id.overtime_apply_endtime_tv);
+        mCommitBtn = (Button) findViewById(R.id.overtime_apply_commit_btn);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.overtime_apply_starttime_rl:
+                CommonUtil.showDataPickDialog(this,mStartTimeTv);
+                break;
+            case R.id.overtime_apply_endtime_rl:
+                CommonUtil.showDataPickDialog(this,mEndTimeTv);
+                break;
+            case R.id.overtime_apply_commit_btn:
+                break;
+        }
     }
 
     @Override
@@ -62,7 +89,7 @@ public class OvertimeApplyActivity extends BaseActivity implements View.OnTouchL
     @Override
     public boolean onTouch(View view, MotionEvent motionEvent) {
         //触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理;否则将事件交由其父类处理
-        if ((view.getId() == R.id.ask_leave_explain_et && CommonUtil.canVerticalScroll(mExplainEt))) {
+        if ((view.getId() == R.id.overtime_apply_explain_et && CommonUtil.canVerticalScroll(mExplainEt))) {
             view.getParent().requestDisallowInterceptTouchEvent(true);
             if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                 view.getParent().requestDisallowInterceptTouchEvent(false);
@@ -70,4 +97,5 @@ public class OvertimeApplyActivity extends BaseActivity implements View.OnTouchL
         }
         return false;
     }
+
 }

+ 1 - 1
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/SpecialAttendanceActivity.java

@@ -62,7 +62,7 @@ public class SpecialAttendanceActivity extends BaseActivity implements View.OnTo
     @Override
     public boolean onTouch(View view, MotionEvent motionEvent) {
         //触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理;否则将事件交由其父类处理
-        if ((view.getId() == R.id.ask_leave_explain_et && CommonUtil.canVerticalScroll(mExplainEt))) {
+        if ((view.getId() == R.id.special_attendance_explain_et && CommonUtil.canVerticalScroll(mExplainEt))) {
             view.getParent().requestDisallowInterceptTouchEvent(true);
             if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                 view.getParent().requestDisallowInterceptTouchEvent(false);

+ 111 - 2
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/activity/oa/TravelRequestActivity.java

@@ -2,23 +2,62 @@ package com.xzjmyk.pm.activity.ui.erp.activity.oa;
 
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
+import android.widget.Button;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
 
 import com.andreabaccega.widget.FormEditText;
 import com.xzjmyk.pm.activity.R;
 import com.xzjmyk.pm.activity.ui.base.BaseActivity;
 import com.xzjmyk.pm.activity.ui.erp.activity.SaleSelectActivity;
+import com.xzjmyk.pm.activity.ui.erp.net.ViewUtil;
 import com.xzjmyk.pm.activity.ui.erp.util.CommonUtil;
+import com.xzjmyk.pm.activity.ui.erp.util.Constants;
+import com.xzjmyk.pm.activity.ui.erp.util.FlexJsonUtil;
+import com.xzjmyk.pm.activity.ui.erp.view.SingleDialog;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 出差申请
  * Created by RaoMeng on 2016/10/18.
  */
-public class TravelRequestActivity extends BaseActivity implements View.OnTouchListener {
+public class TravelRequestActivity extends BaseActivity implements View.OnTouchListener, View.OnClickListener {
     private FormEditText mExplainEt;
+    private RelativeLayout mStartTimeRl,mEndTimeRl,mBasisRl;
+    private TextView mStartTimeTv,mEndTimeTv,mBasisTv;
+    private FormEditText mDaysEt,mDestinationEt,mTargetEt,mProjectEt;
+    private Button mCommitBtn;
+
+    private final static int TRAVEL_BASIS_REQUEST = 102;
+    private SingleDialog signDialog;
+    private List<String> mBasisList = new ArrayList<>();
+    private Handler mHandler = new Handler(){
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what){
+                case TRAVEL_BASIS_REQUEST:
+                    progressDialog.dismiss();;
+                    mBasisList = (List<String>) FlexJsonUtil.fromJson(msg.getData().getString("result")).get(
+                            "combdatas");
+                    if (mBasisList.isEmpty()) {
+                        mBasisList.add("无");
+                    }
+                    showSignDialog(findViewById(R.id.et_extra_sign));
+                    break;
+            }
+        }
+    };
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -32,10 +71,79 @@ public class TravelRequestActivity extends BaseActivity implements View.OnTouchL
 
     private void initEvents() {
         mExplainEt.setOnTouchListener(this);
+        mStartTimeRl.setOnClickListener(this);
+        mEndTimeRl.setOnClickListener(this);
+        mBasisRl.setOnClickListener(this);
+        mCommitBtn.setOnClickListener(this);
     }
 
     private void initViews() {
         mExplainEt = (FormEditText) findViewById(R.id.travel_request_explain_et);
+        mStartTimeRl = (RelativeLayout) findViewById(R.id.travel_request_starttime_rl);
+        mEndTimeRl = (RelativeLayout) findViewById(R.id.travel_request_endtime_rl);
+        mBasisRl = (RelativeLayout) findViewById(R.id.travel_request_basis_rl);
+        mStartTimeTv = (TextView) findViewById(R.id.travel_request_starttime_tv);
+        mEndTimeTv = (TextView) findViewById(R.id.travel_request_endtime_tv);
+        mBasisTv = (TextView) findViewById(R.id.travel_request_basis_tv);
+        mDaysEt = (FormEditText) findViewById(R.id.travel_request_days_et);
+        mDestinationEt = (FormEditText) findViewById(R.id.travel_request_destination_et);
+        mTargetEt = (FormEditText) findViewById(R.id.travel_request_target_et);
+        mProjectEt = (FormEditText) findViewById(R.id.travel_request_project_et);
+        mCommitBtn = (Button) findViewById(R.id.travel_request_commit_btn);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()){
+            case R.id.travel_request_starttime_rl:
+                CommonUtil.showDataPickDialog(this,mStartTimeTv);
+                break;
+            case R.id.travel_request_endtime_rl:
+                CommonUtil.showDataPickDialog(this,mEndTimeTv);
+                break;
+            case R.id.travel_request_basis_rl:
+                progressDialog.show();
+                loadTravelBasis("fp_v6", TRAVEL_BASIS_REQUEST);
+                break;
+            case R.id.travel_request_commit_btn:
+                break;
+        }
+    }
+
+    /**
+     * 获取考勤依据列表
+     * @param field
+     * @param what
+     */
+    public void loadTravelBasis(String field,int what){
+        Log.i("leave", "what=" + what);
+        String url= Constants.getAppBaseUrl(ct)+"mobile/common/getCombo.action";
+        Map<String, String> param = new HashMap<String, String>();
+        param.put("caller", "FeePlease!CCSQ");
+        param.put("field", field);
+        param.put("sessionId", CommonUtil.getSharedPreferences(ct, "sessionId"));
+        ViewUtil.getDataFormServer(ct, mHandler, url, param, what);
+    }
+
+
+    /**
+     * 展示考勤列表
+     * @param view
+     */
+    public void showSignDialog(View view) {
+        if (signDialog == null) {
+            signDialog = new SingleDialog(ct, "考勤", new SingleDialog.PickDialogListener() {
+                @Override
+                public void onListItemClick(int position, String value) {
+                    mBasisTv.setText(value);
+                }
+            });
+            signDialog.show();
+            signDialog.initViewData(mBasisList);
+        } else {
+            signDialog.show();
+            signDialog.initViewData(mBasisList);
+        }
     }
 
     @Override
@@ -62,7 +170,7 @@ public class TravelRequestActivity extends BaseActivity implements View.OnTouchL
     @Override
     public boolean onTouch(View view, MotionEvent motionEvent) {
         //触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理;否则将事件交由其父类处理
-        if ((view.getId() == R.id.ask_leave_explain_et && CommonUtil.canVerticalScroll(mExplainEt))) {
+        if ((view.getId() == R.id.travel_request_explain_et && CommonUtil.canVerticalScroll(mExplainEt))) {
             view.getParent().requestDisallowInterceptTouchEvent(true);
             if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                 view.getParent().requestDisallowInterceptTouchEvent(false);
@@ -70,4 +178,5 @@ public class TravelRequestActivity extends BaseActivity implements View.OnTouchL
         }
         return false;
     }
+
 }

+ 27 - 0
WeiChat/src/main/java/com/xzjmyk/pm/activity/ui/erp/util/CommonUtil.java

@@ -5,6 +5,7 @@ import android.accounts.AccountManager;
 import android.annotation.SuppressLint;
 import android.app.ActivityManager;
 import android.app.ActivityManager.RunningTaskInfo;
+import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.ComponentName;
 import android.content.Context;
@@ -56,6 +57,7 @@ import com.xzjmyk.pm.activity.ui.erp.activity.WebViewCommActivity;
 import com.xzjmyk.pm.activity.ui.erp.activity.WebViewLoadActivity;
 import com.xzjmyk.pm.activity.ui.erp.db.DBManager;
 import com.xzjmyk.pm.activity.ui.erp.entity.B2BMsg;
+import com.xzjmyk.pm.activity.ui.erp.view.DateTimePickerDialog;
 import com.xzjmyk.pm.activity.util.DateFormatUtil;
 import com.xzjmyk.pm.activity.util.TimeUtils;
 import com.xzjmyk.pm.activity.xmpp.listener.ChatMessageListener;
@@ -1082,4 +1084,29 @@ public class CommonUtil {
         return (scrollY > 0) || (scrollY < scrollDifference - 1);
     }
 
+    private static DateTimePickerDialog datePickDialog = null;
+
+    /**
+     * 弹出选择时间框,并显示在指定TextView上
+     * @param context
+     * @param textView
+     */
+    public static void showDataPickDialog(Context context, final TextView textView) {
+        if (datePickDialog == null) {
+            datePickDialog = new DateTimePickerDialog(context, System.currentTimeMillis());
+        }
+
+        datePickDialog.setOnDateTimeSetListener(new DateTimePickerDialog.OnDateTimeSetListener() {
+            public void OnDateTimeSet(AlertDialog dia, long date) {
+                textView.setText(CommonUtil.getStringDateMM(date));
+                /** @注释:保证 初始化当前时间 */
+                datePickDialog = null;
+            }
+        });
+
+        if (!datePickDialog.isShowing()) {
+            datePickDialog.show();
+        }
+    }
+
 }

+ 6 - 6
WeiChat/src/main/res/layout/activity_ask_for_leave.xml

@@ -45,12 +45,12 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/tv_start_time1"
+                        android:id="@+id/ask_leave_starttime_tv"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_toLeftOf="@+id/Start_time_img"
-                        android:hint="2016-10-11 17:00" />
+                        android:hint="选择时间(必填)"/>
 
                     <ImageView
                         android:id="@+id/Start_time_img"
@@ -75,12 +75,12 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/tv_end_time"
+                        android:id="@+id/ask_leave_endtime_tv"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_toLeftOf="@+id/end_time_img"
-                        android:hint="2016-10-12 17:00" />
+                        android:hint="选择时间(必填)" />
 
                     <ImageView
                         android:id="@+id/end_time_img"
@@ -106,7 +106,7 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_leave_category"
+                        android:id="@+id/ask_leave_category_tv"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
@@ -158,7 +158,7 @@
         style="@style/form_linear_customer">
 
         <Button
-            android:id="@+id/bt_save"
+            android:id="@+id/ask_leave_commit_btn"
             style="@style/from_button_base_bule"
             android:layout_marginTop="10dp"
             android:text="提   交" />

+ 7 - 7
WeiChat/src/main/res/layout/activity_overtime_apply.xml

@@ -32,7 +32,7 @@
                     android:layout_marginTop="8dp"/>
 
                 <RelativeLayout
-                    android:id="@+id/ry_leave_man"
+                    android:id="@+id/overtime_apply_starttime_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color1">
 
@@ -45,10 +45,10 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_extra_starttime"
+                        android:id="@+id/overtime_apply_starttime_tv"
                         android:layout_height="wrap_content"
                         android:layout_width="wrap_content"
-                        android:hint="2016-10-11 17:00"
+                        android:hint="选择时间(必填)"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_toLeftOf="@+id/Start_time_img"
                         />
@@ -65,7 +65,7 @@
                     />
 
                 <RelativeLayout
-                    android:id="@+id/ry_set_endTime"
+                    android:id="@+id/overtime_apply_endtime_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color2">
 
@@ -77,10 +77,10 @@
                         android:textSize="@dimen/text_main"  />
 
                     <TextView
-                        android:id="@+id/et_extra_endtime"
+                        android:id="@+id/overtime_apply_endtime_tv"
                         android:layout_height="wrap_content"
                         android:layout_width="wrap_content"
-                        android:hint="2016-10-12 17:00"
+                        android:hint="选择时间(必填)"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_toLeftOf="@+id/end_time_img"
                         />
@@ -131,7 +131,7 @@
         style="@style/form_linear_customer">
 
         <Button
-            android:id="@+id/bt_worksubmit"
+            android:id="@+id/overtime_apply_commit_btn"
             style="@style/from_button_base_bule"
             android:layout_marginTop="10dp"
             android:text="提   交" />

+ 10 - 10
WeiChat/src/main/res/layout/activity_special_attendance.xml

@@ -32,7 +32,7 @@
                     android:layout_marginTop="8dp"/>
 
                 <RelativeLayout
-                    android:id="@+id/ry_leave_man"
+                    android:id="@+id/special_attendance_starttime_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color1">
 
@@ -45,10 +45,10 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_extra_date"
+                        android:id="@+id/special_attendance_starttime_tv"
                         android:layout_height="wrap_content"
                         android:layout_width="wrap_content"
-                        android:hint="2016-10-11 17:00"
+                        android:hint="选择时间(必填)"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_toLeftOf="@+id/Start_time_img"
                         />
@@ -64,7 +64,7 @@
                     />
 
                 <RelativeLayout
-                    android:id="@+id/ry_set_endTime"
+                    android:id="@+id/special_attendance_endtime_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color2">
 
@@ -76,10 +76,10 @@
                         android:textSize="@dimen/text_main"  />
 
                     <TextView
-                        android:id="@+id/et_extra_time"
+                        android:id="@+id/special_attendance_endtime_tv"
                         android:layout_height="wrap_content"
                         android:layout_width="wrap_content"
-                        android:hint="2016-10-12 17:00"
+                        android:hint="选择时间(必填)"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_toLeftOf="@+id/end_time_img"
                         />
@@ -95,7 +95,7 @@
                     />
 
                 <RelativeLayout
-                    android:id="@+id/ry_leave_category"
+                    android:id="@+id/special_attendance_category_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color1">
 
@@ -103,12 +103,12 @@
                     <TextView
                         android:id="@+id/tv_set_ti"
                         style="@style/form_relative_left_text2"
-                        android:text="事由类"
+                        android:text="事由类"
                         android:textColor="@color/text_main"
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_extra_resaon"
+                        android:id="@+id/special_attendance_category_tv"
                         android:layout_height="wrap_content"
                         android:layout_width="wrap_content"
                         android:hint="请选择(必填)"
@@ -159,7 +159,7 @@
         style="@style/form_linear_customer">
 
         <Button
-            android:id="@+id/bt_extra_leave_submit"
+            android:id="@+id/special_attendance_commit_btn"
             style="@style/from_button_base_bule"
             android:layout_marginTop="10dp"
             android:text="提   交" />

+ 14 - 11
WeiChat/src/main/res/layout/activity_travel_request.xml

@@ -34,7 +34,7 @@
                     android:background="@color/item_line" />
 
                 <RelativeLayout
-                    android:id="@+id/ry_leave_man"
+                    android:id="@+id/travel_request_starttime_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color1">
 
@@ -47,12 +47,12 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_extra_starttime"
+                        android:id="@+id/travel_request_starttime_tv"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_toLeftOf="@+id/Start_time_img"
-                        android:hint="2016-10-11 17:00" />
+                        android:hint="选择时间(必填)"/>
 
                     <ImageView
                         android:id="@+id/Start_time_img"
@@ -65,7 +65,7 @@
                     android:background="@color/item_line" />
 
                 <RelativeLayout
-                    android:id="@+id/ry_set_endTime"
+                    android:id="@+id/travel_request_endtime_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color2">
 
@@ -77,12 +77,12 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_extra_endtime"
+                        android:id="@+id/travel_request_endtime_tv"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_toLeftOf="@+id/end_time_img"
-                        android:hint="2016-10-12 17:00" />
+                        android:hint="选择时间(必填)" />
 
                     <ImageView
                         android:id="@+id/end_time_img"
@@ -117,6 +117,7 @@
                         android:visibility="gone"/>
 
                     <com.andreabaccega.widget.FormEditText
+                        android:id="@+id/travel_request_days_et"
                         android:padding="5dp"
                         android:layout_alignParentRight="true"
                         android:hint="请输入(必填)"
@@ -144,6 +145,7 @@
                         android:textColor="@color/text_main"
                         android:textSize="@dimen/text_main" />
                     <com.andreabaccega.widget.FormEditText
+                        android:id="@+id/travel_request_destination_et"
                         android:padding="5dp"
                         android:layout_alignParentRight="true"
                         android:hint="请输入(必填)"
@@ -171,6 +173,7 @@
                         android:textColor="@color/text_main"
                         android:textSize="@dimen/text_main" />
                     <com.andreabaccega.widget.FormEditText
+                        android:id="@+id/travel_request_target_et"
                         android:padding="5dp"
                         android:layout_alignParentRight="true"
                         android:hint="请输入(必填)"
@@ -199,6 +202,7 @@
                         android:textSize="@dimen/text_main" />
 
                     <com.andreabaccega.widget.FormEditText
+                        android:id="@+id/travel_request_project_et"
                         android:padding="5dp"
                         android:layout_alignParentRight="true"
                         android:hint="请输入(必填)"
@@ -215,11 +219,10 @@
                     android:background="@color/item_line" />
 
                 <RelativeLayout
-                    android:id="@+id/ry_leave_category"
+                    android:id="@+id/travel_request_basis_rl"
                     style="@style/form_relative_customer2"
                     android:background="@color/item_color1">
 
-
                     <TextView
                         android:id="@+id/tv_set_t"
                         style="@style/form_relative_left_text2"
@@ -228,12 +231,12 @@
                         android:textSize="@dimen/text_main" />
 
                     <TextView
-                        android:id="@+id/et_extra_sign"
+                        android:id="@+id/travel_request_basis_tv"
                         style="@style/IMTbleLine_TextValue"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_toLeftOf="@+id/voc_type_img"
-                        android:hint=" 是" />
+                        android:hint="选择依据(必填)"/>
 
                     <ImageView
                         android:id="@+id/voc_type_img"
@@ -282,7 +285,7 @@
         style="@style/form_linear_customer">
 
         <Button
-            android:id="@+id/bt_save"
+            android:id="@+id/travel_request_commit_btn"
             style="@style/from_button_base_bule"
             android:layout_marginTop="10dp"
             android:text="提   交" />