一个简单的智能停车APP——抽屉式侧边栏

简介: 功能介绍代码详解总结


功能介绍



先展示效果图:

image.png

image.png

侧边栏由MaterialDesign(原质化设计)框架设计而成。

由DrawerLayout+NavigationView组成

需要导入的包如下:

其中circleimageview是将图片放入圆型容器之中

 implementation 'com.google.android.material:material:1.1.0-alpha09'
    implementation 'com.getbase:floatingactionbutton:1.10.1'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'de.hdodenhof:circleimageview:2.1.0'


代码详解



布局文件代码如下:

app:headerLayout:代表头部文件内容

app:menu:代表下面菜单内容

android:layout_gravity=“left” 为侧边栏所在位置以及滑动方向

<com.google.android.material.navigation.NavigationView
        android:id="@+id/InformationManage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:headerLayout="@layout/information_head_item"
        app:menu="@menu/setting_menu"
        android:layout_gravity="left"
        />

其中app:headerLayout代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:circleimageview="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<de.hdodenhof.circleimageview.CircleImageView
    android:id="@+id/HeadImage"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:src="@drawable/user_bule"
    android:layout_gravity="center"
    circleimageview:civ_border_color="@android:color/holo_red_light"
    circleimageview:civ_border_overlay="false"
    circleimageview:civ_border_width="2dp"
    circleimageview:civ_fill_color="@android:color/holo_blue_light"
    />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_gravity="center"
        android:layout_margin="@dimen/Small">
        <TextView
            android:id="@+id/HeadUserID"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="智能停车账号:"
            android:singleLine="true"
            android:textSize="@dimen/text_Medium"
            />
        <TextView
            android:id="@+id/Information_UserName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登陆账号"
            android:singleLine="true"
            android:textSize="@dimen/text_Medium"
            />
    </LinearLayout>
</LinearLayout>

app:menu代码如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
  <item
      android:id="@+id/Personal"
      android:title="个人信息"
      android:icon="@drawable/user"/>
    <item
        android:id="@+id/Pay"
        android:title="支付管理"
        android:icon="@drawable/pay1"/>
    <item
        android:id="@+id/Car"
        android:title="车辆管理"
        android:icon="@drawable/cars"/>
    <item
        android:id="@+id/Collection"
        android:title="共享车位"
        android:icon="@drawable/shared"/>
    <item
        android:id="@+id/File"
        android:title="提前预定"
        android:icon="@drawable/booking"/>
    <item
        android:id="@+id/OrderManagement"
        android:title="订单管理"
        android:icon="@drawable/order"/>
</group>
   <item android:title="Setting">
       <menu >
           <item
               android:id="@+id/Setting"
               android:title="设置"
               android:icon="@drawable/setting1"/>
           <item
                 android:id="@+id/Version"
                 android:icon="@drawable/version"
                 android:title="版本信息"/>
       </menu>
   </item>
</menu>

在侧边栏我写了三个功能:个人信息,提前预定,共享车位,订单管理

一:个人信息

image.png

XML布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E0E0E0"
    android:orientation="vertical"
    >
     <!--标题栏-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal"
        android:paddingLeft="5dp"
        android:paddingBottom="20dp"
        android:paddingTop="10dp"
        android:background="#fff"
       >
        <ImageView
            android:id="@+id/ToSettingInformationGoBack"
            android:layout_width="20dp"
            android:layout_height="30dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="2dp"
            android:scaleType="fitCenter"
            android:src="@drawable/goback1" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="账号管理"
            android:textSize="20sp"
            android:textColor="#000"
           android:layout_marginLeft="110dp"
            android:layout_marginTop="5dp"
            />
    </LinearLayout>
<!--信息栏-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingTop="20dp">
        <!--头像-->
        <LinearLayout
            android:id="@+id/LayoutIcons"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:orientation="horizontal"
            android:paddingLeft="20dp"
            android:background="#fff">
            <TextView
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="头像"
                android:textSize="15sp"
                android:layout_marginTop="10dp"
                android:textColor="#000"/>
            <ImageView
                android:id="@+id/SettingIcons"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:src="@drawable/icons"
                android:scaleType="fitCenter"
                android:layout_marginTop="5dp"
                android:layout_marginRight="10dp"/>
            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/right"
                android:scaleType="fitCenter"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"/>
        </LinearLayout>
        <!--昵称-->
        <LinearLayout
            android:id="@+id/LayoutName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="20dp"
            android:background="#fff">
            <TextView
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="昵称"
                android:textSize="15sp"
                android:layout_marginTop="10dp"
                android:textColor="#000"/>
            <TextView
                android:id="@+id/SettingName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="FranzLiszt"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"
                android:textColor="#000" />
            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/right"
                android:scaleType="fitCenter"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"/>
        </LinearLayout>
        <!--性别-->
        <LinearLayout
            android:id="@+id/LayoutSex"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="20dp"
            android:background="#fff">
            <TextView
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="性别"
                android:textSize="15sp"
                android:layout_marginTop="10dp"
                android:textColor="#000"/>
            <TextView
                android:id="@+id/SettingSex"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"
                android:text="男"
                android:textColor="#000"
                android:background="#fff"/>
            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/right"
                android:scaleType="fitCenter"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"/>
        </LinearLayout>
        <!--等级-->
        <LinearLayout
            android:id="@+id/LayoutLevel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="20dp"
            android:background="#fff">
            <TextView
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="等级"
                android:textSize="15sp"
                android:layout_marginTop="10dp"
                android:textColor="#000"/>
            <TextView
                android:id="@+id/SettingLevel"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
                android:text="铜牌会员"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"
                android:textColor="#000"
                android:background="#fff"/>
            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/right"
                android:scaleType="fitCenter"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"/>
        </LinearLayout>
        <!--手机号码-->
        <LinearLayout
            android:id="@+id/LayoutPhoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="20dp"
            android:background="#fff">
            <TextView
                android:layout_weight="1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="手机号码"
                android:textSize="15sp"
                android:layout_marginTop="10dp"
                android:textColor="#000"/>
            <TextView
                android:id="@+id/SettingPhoneNumber"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
                android:text="去绑定"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"
                android:textColor="#000"
                android:background="#fff"/>
            <ImageView
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:src="@drawable/right"
                android:scaleType="fitCenter"
                android:layout_marginTop="10dp"
                android:layout_marginRight="10dp"/>
        </LinearLayout>
    </LinearLayout>
    <Button
        android:id="@+id/Exit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="退出登陆"
        android:background="#fff"
        android:textColor="#ff0000"
        android:layout_marginTop="20dp"/>
</LinearLayout>

JAVA代码如下:

public class SettingInformation extends AppCompatActivity {
    private LinearLayout LayoutImage,LayoutSex;
    private PopupWindow popupWindow;
    private TextView SettingName,SettingSex,SettingPhoneNumber,SettingLevel;
    private View view = null;
    private View viewSex = null;
    private Button ToCamera,ToPhoto,ToExit,Exit;
    private static int REQUEST_CAMERA       = 1;
    private static int REQUEST_CHOOSE_PHOTO = 2;
    private String PhotoAddress;
    private ImageView SettingIcons,SettingGoBack;
    private Bitmap bitmap;
    private static final String[] sPermissonVal = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};
    private static final int PERMISSION_CAMERA_REQUEST_CODE = 3;
    Dao dao = new Dao( SettingInformation.this );
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_setting_information );
        InitView();
        ShowPopupWindows();
        UpdateLayout();
        Listener();
        //GetPhoto();
        //ShowPopupWindows_Sex();
    }
    /****************初始化界面****************/
    private void InitView() {
        LayoutImage = findViewById( R.id.LayoutIcons );
        LayoutSex = findViewById( R.id.LayoutSex );
        Exit = findViewById( R.id.Exit );
        SettingIcons = findViewById( R.id.SettingIcons );
        //CameraActivity.setClipRatio(1, 1);
        SettingName = findViewById( R.id.SettingName );
        SettingPhoneNumber = findViewById( R.id.SettingPhoneNumber );
        SettingSex = findViewById( R.id.SettingSex );
        SettingGoBack = findViewById( R.id.ToSettingInformationGoBack );
        SettingLevel = findViewById( R.id.SettingLevel );
        PhotoAddress = Environment.getExternalStorageDirectory().getPath();
        //指定路径和获取图片的名称
        PhotoAddress = PhotoAddress+"/"+"Image.png";
    }
    /****************根据注册填写的信息改变此布局内容,传过来一个boolean值进行判断****************/
    private void UpdateLayout(){
        if (Login.JudgeLoginStatic == true) {
           Account account = dao.QueryInformation( Login.Login_Account );
            String GetSex = account.getSex();
            String GetPhoneNumber = account.getPhoneNumber();
            SettingName.setText( Login.Login_Account );
            SettingPhoneNumber.setText( GetPhoneNumber );
            SettingSex.setText( GetSex );
        }
    }
    /****************用于点击退出登陆后,清理布局****************/
    private void DeleteLayout(){
        SettingIcons.setImageResource( R.drawable.icons );
        SettingName.setText( "" );
        SettingSex.setText( "" );
        SettingPhoneNumber.setText( "" );
        SettingLevel.setText( "" );
        Exit.setText( "立即登陆" );
       Intent intent = new Intent( SettingInformation.this, Login.class );
       startActivity( intent );
    }
    //申请权限
    /************需要动态申请权限************/
    private void requestPermission() {
        // Android6.0开始, 即当API大于等于 23 时,才动态申请权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            this.requestPermissions(sPermissonVal, PERMISSION_CAMERA_REQUEST_CODE);
        }
    }
    /****************初始化PopupWindows****************/
    private void ShowPopupWindows() {
        //获取布局
        view = LayoutInflater.from( SettingInformation.this).inflate( R.layout.popup_image,null,false );
        ToCamera = view.findViewById( R.id.ToCamera ); //跳转相机
        ToPhoto = view.findViewById( R.id.ToPhoto );//跳转相册
        ToExit = view.findViewById( R.id.ToExit );//退出
        popupWindow = new PopupWindow( view, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT );
        popupWindow.setFocusable( true ); //获取焦点
        popupWindow.setBackgroundDrawable( new BitmapDrawable(  ) );
        popupWindow.setOutsideTouchable( true ); //点击外面地方,取消
        popupWindow.setTouchable( true ); //允许点击
        popupWindow.setAnimationStyle( R.style.MyPopupWindow ); //设置动画
        ToExit.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        } );
        /****************打开相机监听事件****************/
        ToCamera.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //requestPermission();
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                startActivityForResult(intent, 2);
            }
        } );
        /****************打开相册监听事件****************/
        ToPhoto.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openGallery();
            }
        } );
    }
    /****************对返回键进行监听,如果按下popupWindow消失****************/
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){
            if (popupWindow != null && popupWindow.isShowing()){
                popupWindow.dismiss();
                return true;
            }
        }
        return false;
    }
    /****************显示PopupWindows****************/
    private void ShowPopupWindowsFromButtom(){
        popupWindow.showAtLocation( view, Gravity.BOTTOM,0,0 );
    }
    /****************打开相机****************/
    private void OpenCamera(){
//        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//        intent.addCategory(Intent.CATEGORY_DEFAULT);
//
//        // 打开照相机,设置请求码
//        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//        startActivityForResult(intent, 2);
//        try {
//            Intent intent = new Intent();
//            intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
//            File file = FileManager.createFileIfNeed("filepath.png");
//            Uri uri;
//            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
//                uri = Uri.fromFile(file);
//            } else {
//                uri = FileProvider.getUriForFile(this, "link.android.file.provider", file);
//            }
//            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
//            startActivityForResult(intent, 1);
//        }catch (IOException e){
//            e.printStackTrace();
//        }
    }
    /****************打卡相册****************/
    private void openGallery() {
        Intent picture = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(picture, 2);
    }
    @Override
    protected void onResume() {
        super.onResume();
        //获得相册、相机返回的结果,并显示
        if (CameraActivity.LISTENING) {
            Log.e("TAG", "返回的Uri结果:" + CameraActivity.IMG_URI);
            Log.e("TAG", "返回的File结果:" + CameraActivity.IMG_File.getPath());
            CameraActivity.LISTENING = false;   //关闭获取结果
            SettingIcons.setImageURI(CameraActivity.IMG_URI);  //显示图片到控件
        }
    }
    /********************************/
        @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult( requestCode, resultCode, data );
            //判断是否返回数据
            if (resultCode == RESULT_OK) {
                //判断返回的类型是否是我们所需
                if (requestCode == 1) {
                    String state = Environment.getExternalStorageState();
                    if (!state.equals( Environment.MEDIA_MOUNTED ))
                        return;
                    Tiny.FileCompressOptions options = new Tiny.FileCompressOptions();
                    Tiny.getInstance().source( FileManager.readpic() ).asFile().withOptions( options ).compress( new FileWithBitmapCallback() {
                        @Override
                        public void callback(boolean isSuccess, Bitmap bitmap, String outfile, Throwable t) {
                        }
                    } );
                } else if (requestCode == 2 && resultCode == Activity.RESULT_OK && null != data) {
//                    try {
//                        Uri selectedImage = data.getData();
//                        Tiny.FileCompressOptions options = new Tiny.FileCompressOptions();
//                        Tiny.getInstance().source( selectedImage ).asFile().withOptions( options ).compress( new FileWithBitmapCallback() {
//                            @Override
//                            public void callback(boolean isSuccess, Bitmap bitmap, String outfile, Throwable t) {
//                                SettingIcons.setImageBitmap( bitmap );
//                            }
//                        } );
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
                    Bundle bundle = data.getExtras();
                    Bitmap bitmap = (Bitmap) bundle.get("data");
                    SettingIcons.setImageBitmap(bitmap);
                }
            }
        }
    private void getPicture() {
        //获取字符串
        SharedPreferences sPreferences = getSharedPreferences("Picture", Context.MODE_PRIVATE);
        String imageBase64 = sPreferences.getString("cameraImage", "");
        //把字符串解码成Bitmap对象
        byte[] byte64 = Base64.decode(imageBase64, 0);
        ByteArrayInputStream bais = new ByteArrayInputStream(byte64);
        Bitmap bitmap = BitmapFactory.decodeStream(bais);
        //显示图片
        SettingIcons.setImageBitmap(bitmap);
    }
        private void ToBitmap(){
            //把Bitmap转码成字符串
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress( Bitmap.CompressFormat.PNG, 50,baos);
            String imageBase64 = new String ( Base64.encode(baos.toByteArray(), 0));
            //把字符串存到SharedPreferences里面
            SharedPreferences prePicture = getSharedPreferences("Picture", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = prePicture.edit();
            editor.putString("cameraImage", imageBase64);
            editor.commit();
        }
            private void Listener () {
                OnClick onClick = new OnClick();
                LayoutImage.setOnClickListener( onClick );
                LayoutSex.setOnClickListener( onClick );
                Exit.setOnClickListener( onClick );
                SettingGoBack.setOnClickListener( onClick );
    }
    /**************内部类监听事件**************/
            class OnClick implements View.OnClickListener {
                @Override
                public void onClick(View v) {
                    switch (v.getId()) {
                        case R.id.LayoutIcons:
                            ShowPopupWindowsFromButtom();
                            break;
                        case R.id.Exit:
                            DeleteLayout();
                            break;
                        case R.id.ToSettingInformationGoBack:
                           Intent intent = new Intent( SettingInformation.this, Function.class);
                            startActivity( intent );
                            break;
                    }
                }
            }
        }


二:共享车位

步骤:1.选择共享车位类型2.填写相关信息3.审核

image.png

image.png

image.png


三:提前预定

效果图如下:

从右网左侧滑出现提前预定按钮

image.png

订单信息

image.png

弹出信息确认提示

image.png


四:订单管理

当确认订单时,便开始计时:

界面如下:

image.png

然后点击结束并缴费,弹出popwindows,订单信息

image.png

点击确定之后进入支付界面,依旧是弹出popwindows,界面如下

image.png

填写密码之后,点击支付,弹出通知,回执支付成功信息

介绍几个重要的功能

1.计时器

返回系统启动到现在的毫秒数,包含休眠时间。

SystemClock.elapsedRealtime()
 Handler handler_time = new Handler(  ){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage( msg );
                mHour.setText( msg.obj.toString() );
            }
        };
        new Timer(  ).scheduleAtFixedRate( new TimerTask() {
            @Override
            public void run() {
                int time = (int)((SystemClock.elapsedRealtime() - OrderInterface.this.CurrentTime) / 1000);
                GetTimeHour = new DecimalFormat("00").format(time / 3600);
                GetTimeMinute = new DecimalFormat("00").format(time % 3600 / 60);
                GetTimeSecond = new DecimalFormat("00").format(time % 60);
                String timeFormat = new String(GetTimeHour + ":" + GetTimeMinute + ":" + GetTimeSecond);
                Message msg = new Message();
                msg.obj = timeFormat;
                handler_time.sendMessage(msg);
            }
        },0,1000L );
    }

2.通知

Android8以上使用通知一定要创建渠道

 private void NotificationManagerMethod(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //创建通知渠道ID
            String channelId = "Park";
            //创建通知渠道名称
            String channelName = "路边秒停车";
            //创建通知渠道重要性
            int importance = NotificationManager.IMPORTANCE_HIGH;
            createNotificationChannel(  channelId, channelName, importance );
        }
    }
    private void InitNotificationManager(){
        manager = (NotificationManager)getSystemService( NOTIFICATION_SERVICE );
        Notification builder = new NotificationCompat.Builder(this,"Park")
                 .setSmallIcon( R.drawable.stopicon_notfition )
                .setContentTitle( "支付结果" )
                .setContentText( "支付成功\n"+"停车时间:"+GetTimeHour+"小时"+GetTimeMinute+"分钟"+"\n"+"支付金额:"+PayTotalMoney+"元" )
                // 通知首次出现在通知栏,带上升动画效果的
                .setWhen( System.currentTimeMillis() )
                .setAutoCancel(true)
                .build();
        manager.notify( 0,builder);
    }
    private void createNotificationChannel(String channelId,String channelName,int importance){
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        NotificationManager notificationManager = (NotificationManager) getSystemService(
                NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
    }

该类整体代码如下:

package com.example.Order;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.text.Layout;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
import com.example.Imformation.Function;
import com.example.intelligentparking.R;
import com.mob.tools.utils.ResHelper;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class OrderInterface extends AppCompatActivity {
    private TextView mHour,mMinute,mSecond;
    private ImageView mOrderGoBack;
    private Button mToPay;
    private int CurrentMinute = 0,CurrentHour = 0,CurrentSecond = 0;
    private Handler handler;
    private Toast toastPayInformation;
    private PopupWindow DisplayPayInterface,InputPassWordInterface;
    private long CurrentTime;
    private String DEFAULT_TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
    public static final int ParkPrice = 5;
    private String GetTimeHour;
    private String GetTimeMinute;
    private String GetTimeSecond;
    private int PayTotalMoney = 0;
    /**以下为PopupWindow里面的控件*/
    private TextView Name,PhoneNumber,ParkedTime,EstimatePayMoney,ReallyPayMoney,OrderTime,OrderNumber;
    private Button Cancel,Confirm;
    private  View view,view_passWord;
    private Thread thread;
    private   NotificationManager manager;
    /**PopupWindow支付并且填写密码界面*/
    private ImageView GoBackPayInterface;
    private TextView PayMoney;
    private EditText PassWord_One,PassWord_Two,PassWord_Three,PassWord_Four,PassWord_Five,PassWord_Six;
    private Button ConfirmPay;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
       //requestWindowFeature( Window.FEATURE_CUSTOM_TITLE );
        setContentView( R.layout.activity_order_interface );
        //getWindow().setFeatureInt( Window.FEATURE_CUSTOM_TITLE,R.layout.order_titlebar );
        OrderInterface.this.CurrentTime = SystemClock.elapsedRealtime();
        InitView();
        Listener();
        DisplayPayInformation();
        DisplayInputPassWordAndPay();
        NotificationManagerMethod();
        Handler handler_time = new Handler(  ){
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage( msg );
                mHour.setText( msg.obj.toString() );
            }
        };
        new Timer(  ).scheduleAtFixedRate( new TimerTask() {
            @Override
            public void run() {
                /* 返回系统启动到现在的毫秒数,包含休眠时间。*/
                int time = (int)((SystemClock.elapsedRealtime() - OrderInterface.this.CurrentTime) / 1000);
                GetTimeHour = new DecimalFormat("00").format(time / 3600);
                GetTimeMinute = new DecimalFormat("00").format(time % 3600 / 60);
                GetTimeSecond = new DecimalFormat("00").format(time % 60);
                String timeFormat = new String(GetTimeHour + ":" + GetTimeMinute + ":" + GetTimeSecond);
                Message msg = new Message();
                msg.obj = timeFormat;
                handler_time.sendMessage(msg);
            }
        },0,1000L );
    }
    private void InitView(){
        mHour = findViewById( R.id.Time_Hour );
       /* mMinute = findViewById( R.id.Time_Minute );
        mSecond = findViewById( R.id.Time_Second );*/
        mOrderGoBack = findViewById( R.id. OrderBack);
        mToPay = findViewById( R.id.ToPay );
    }
    private void Listener(){
        OnClick onClick = new OnClick();
        mOrderGoBack.setOnClickListener( onClick );
        mToPay.setOnClickListener( onClick);
    }
    private void NotificationManagerMethod(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //创建通知渠道ID
            String channelId = "Park";
            //创建通知渠道名称
            String channelName = "路边秒停车";
            //创建通知渠道重要性
            int importance = NotificationManager.IMPORTANCE_HIGH;
            createNotificationChannel(  channelId, channelName, importance );
        }
    }
    private void InitNotificationManager(){
        manager = (NotificationManager)getSystemService( NOTIFICATION_SERVICE );
        Notification builder = new NotificationCompat.Builder(this,"Park")
                 .setSmallIcon( R.drawable.stopicon_notfition )
                .setContentTitle( "支付结果" )
                .setContentText( "支付成功\n"+"停车时间:"+GetTimeHour+"小时"+GetTimeMinute+"分钟"+"\n"+"支付金额:"+PayTotalMoney+"元" )
                // 通知首次出现在通知栏,带上升动画效果的
                .setWhen( System.currentTimeMillis() )
                .setAutoCancel(true)
                .build();
        manager.notify( 0,builder);
    }
    private void createNotificationChannel(String channelId,String channelName,int importance){
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        NotificationManager notificationManager = (NotificationManager) getSystemService(
                NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
    }
    private void DisplayInputPassWordAndPay(){
        view_passWord = LayoutInflater.from( OrderInterface.this ).inflate( R.layout.paysystem_interface,null,false );
        GoBackPayInterface = view_passWord.findViewById( R.id.GoBackPayInterface );
        PayMoney = view_passWord.findViewById( R.id.PayMoney );
        PassWord_One = view_passWord.findViewById( R.id.PassWord_one );
        PassWord_Two = view_passWord.findViewById( R.id.PassWord_two );
        PassWord_Three = view_passWord.findViewById( R.id.PassWord_three );
        PassWord_Four = view_passWord.findViewById( R.id.PassWord_four );
        PassWord_Five = view_passWord.findViewById( R.id.PassWord_five );
        PassWord_Six = view_passWord.findViewById( R.id.PassWord_six );
        ConfirmPay = view_passWord.findViewById( R.id.ConfirmPay );
        InputPassWordInterface = new PopupWindow( view_passWord,ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT );
        InputPassWordInterface.setFocusable( true ); //获取焦点
        InputPassWordInterface.setBackgroundDrawable( new BitmapDrawable(  ) );
        InputPassWordInterface.setOutsideTouchable( true ); //点击外面地方,取消
        InputPassWordInterface.setTouchable( true ); //允许点击
        InputPassWordInterface.setAnimationStyle( R.style.MyPopupWindow ); //设置动画
        ConfirmPay.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                InputPassWordInterface.dismiss();
                InitNotificationManager();
            }
        } );
        GoBackPayInterface.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                InputPassWordInterface.dismiss();
            }
        } );
    }
    private void DisplayPayInformation(){
            view = LayoutInflater.from( OrderInterface.this ).inflate( R.layout.display_pay_information,null,false );
            Name = view.findViewById( R.id.DisplayPay_Name );
            PhoneNumber = view.findViewById( R.id.DisplayPay_PhoneNumber );
            ParkedTime = view.findViewById( R.id.DisplayPay_Time );
            EstimatePayMoney = view.findViewById( R.id.DisplayPay_EstimatePayMoney );
            ReallyPayMoney = view.findViewById( R.id.DisplayPay_ReallyPayMoney );
            OrderTime = view.findViewById( R.id.OrderTime );
            OrderNumber = view.findViewById( R.id.OrderNumber );
            Cancel = view.findViewById( R.id.CancelToPay );
            Confirm = view.findViewById( R.id.ConfirmToPay );
            DisplayPayInterface = new PopupWindow( view, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT );
            DisplayPayInterface.setFocusable( true ); //获取焦点
            DisplayPayInterface.setBackgroundDrawable( new BitmapDrawable(  ) );
            DisplayPayInterface.setOutsideTouchable( true ); //点击外面地方,取消
            DisplayPayInterface.setTouchable( true ); //允许点击
            DisplayPayInterface.setAnimationStyle( R.style.MyPopupWindow ); //设置动画
        Cancel.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DisplayPayInterface.dismiss();
            }
        } );
        Confirm.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DisplayPayInterface.dismiss();
                DisplayPayPopWindowsForCenter();
            }
        } );
    }
    private void DisplayPayPopWindowsForCenter(){
        InputPassWordInterface.showAtLocation( view,Gravity.BOTTOM,100,50 );
    }
    private void DisplayPopWindowsForCenter(){
        Name.setText( "孙鹏" );
        PhoneNumber.setText( "17375527572" );
               int Hour = Integer.parseInt( GetTimeHour );
               int Minute = Integer.parseInt( GetTimeMinute );
               int Second = Integer.parseInt( GetTimeSecond );
               ParkedTime.setText( Hour+"小时"+Minute+"分钟"+Second+"秒" );
               /**
                * 停车收费标准如下:
                * 1.一小时单价5元
                * 2.大于半小时,不满一小时,归于一小时计
                * 3.小于半小时,不计收费*/
               if (Hour > 0 && Minute > 30){
                   PayTotalMoney = (Hour+1)*ParkPrice;
               }else if (Hour > 0 && Minute < 30){
                   PayTotalMoney = Hour*ParkPrice;
               }else {
                   PayTotalMoney = 0;
               }
        EstimatePayMoney.setText( PayTotalMoney+"元" );
        ReallyPayMoney.setText( PayTotalMoney+"元" );
        SimpleDateFormat format = new SimpleDateFormat( DEFAULT_TIME_FORMAT );
        String Time = format.format( Calendar.getInstance().getTime() );
        OrderTime.setText( Time );
        Random random = new Random(  );
        Long OrderNumber_Long = 0L;
        do {
          OrderNumber_Long = random.nextLong();
        }while (OrderNumber_Long < 0);
        OrderNumber.setText( OrderNumber_Long+"" );
        DisplayPayInterface.showAtLocation( view,Gravity.CENTER,0,0 );
    }
    class OnClick implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.OrderBack:
                    startActivity( new Intent( OrderInterface.this, Function.class ) );
                    break;
                case R.id.ToPay:
                    DisplayPopWindowsForCenter();
                    break;
            }
        }
    }
}

总结


实践出真知



相关文章
|
4月前
|
测试技术
一款功能完善的智能匹配1V1视频聊天App应该通过的测试CASE
文章列举了一系列针对1V1视频聊天App的测试用例,包括UI样式、权限请求、登录流程、匹配逻辑、消息处理、充值功能等多个方面的测试点,并标注了每个测试用例的执行状态,如通过(PASS)、失败(FAIL)或需要进一步处理(延期修改、待定、方案再定等)。
70 0
|
5月前
|
小程序 定位技术
预约停车位app小程序模板
简单的手机预约停车位,在线停车位,预约停车管理小程序页面模板。包含:主页、预约停车、预约管理、地图导航等。
125 0
|
7月前
|
人工智能 UED iOS开发
最佳平替APP:智能消费新选择
【2月更文挑战第29天】最佳平替是一款AI应用,响应消费降级趋势,通过智能匹配帮用户找到价低质优的商品替代品,节省开支。用户输入商品名,AI推荐相似平替选项,提高购物效率。涵盖商品、旅游景点、学校等多个领域,提供跨界平替建议。尽管AI推荐有时不准确,开发团队正持续优化,旨在帮助用户理性消费,避免不必要的开支,已获得用户支持。
174 1
最佳平替APP:智能消费新选择
|
7月前
|
传感器 内存技术
毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计
毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计
193 0
|
7月前
|
机器学习/深度学习 数据采集 小程序
互联网智能3D导诊系统源码支持微信小程序、APP
互联网智能3D导诊系统源码支持微信小程序、APP
150 0
|
人工智能 监控 数据可视化
Java大型智慧工地APP云平台源码带AI智能识别功能
智慧工地”立足于互联网+,采用云计算,大数据和物联网等技术手段,针对当前建筑行业的特点,结合建筑企业信息化工作的需求,以建设工程为核心,以建筑行业企业、人员,项目信息库为基础,搭建智慧工地云平台,实现参建各方协同工作,实现施工现场全要素管理,构建可伸缩、可扩展的行业信息化解决方案。
125 0
|
人工智能 自然语言处理 小程序
AI智能导诊系统源码,支持以公众号、小程序、App 等形式接入
智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件,它能够通过对患者的症状、病史等信息进行计算分析,快速推荐科室和医生。通过简单的描述自身症状,系统即可找到最适合的科室
206 1
|
存储 文字识别 JavaScript
毕业设计So Easy:Java MySQL智能报纸阅读器APP应用
很多计算机专业大学生经常和我交流:毕业设计没思路、不会做、论文不会写、太难了...... 针对这些问题,决定分享一些软、硬件项目的设计思路和实施方法,希望可以帮助大家,也祝愿各位学子,顺利毕业!
|
2月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
660 7
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
732 1

热门文章

最新文章