New year, New home, New start.

部署运行你感兴趣的模型镜像
A new blog, for 优快云. 

Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1494560


您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

用户同意权限后没有dismiss ,加个背景圆角吧 好丑,再加点边距 package com.kmilesaway.golfbat.ui.home; import android.Manifest; import android.app.ActivityManager; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.location.LocationManager; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.amap.api.maps.MapsInitializer; import com.amap.api.services.core.ServiceSettings; import com.azhon.appupdate.config.UpdateConfiguration; import com.azhon.appupdate.listener.OnButtonClickListener; import com.azhon.appupdate.listener.OnDownloadListenerAdapter; import com.azhon.appupdate.manager.DownloadManager; import com.blankj.utilcode.util.LogUtils; import com.bumptech.glide.Glide; import com.chad.library.adapter.base.BaseQuickAdapter; import com.kmilesaway.golfbat.R; import com.kmilesaway.golfbat.adapter.ScheduleFragmentAdapter; import com.kmilesaway.golfbat.base.BaseApplication; import com.kmilesaway.golfbat.base.BaseMvpFragment; import com.kmilesaway.golfbat.bean.BagStorageBean; import com.kmilesaway.golfbat.bean.CutCaddieBean; import com.kmilesaway.golfbat.bean.HotUpdateBean; import com.kmilesaway.golfbat.bean.MsgWs; import com.kmilesaway.golfbat.bean.ScheduleServiceBean; import com.kmilesaway.golfbat.bean.UserBean; import com.kmilesaway.golfbat.bean.WsSetBean; import com.kmilesaway.golfbat.contract.ScheduleContract; import com.kmilesaway.golfbat.net.MainConstant; import com.kmilesaway.golfbat.presenter.SchedulePresenter; import com.kmilesaway.golfbat.service.BackService; import com.kmilesaway.golfbat.service.DaemonService; import com.kmilesaway.golfbat.ui.dialog.ServiceHintDialog; import com.kmilesaway.golfbat.ui.home.ballaffirm.BallAffirmActivity; import com.kmilesaway.golfbat.ui.home.balloffice.RangingScoringActivity; import com.kmilesaway.golfbat.ui.match.MatchSelectListActivity; import com.kmilesaway.golfbat.utils.AppUtils; import com.kmilesaway.golfbat.utils.DateUtils; import com.kmilesaway.golfbat.utils.EventBusUtils; import com.kmilesaway.golfbat.utils.EventCode; import com.kmilesaway.golfbat.utils.EventMessage; import com.kmilesaway.golfbat.utils.RegexUtils; import com.kmilesaway.golfbat.utils.SPUtils; import com.kmilesaway.golfbat.utils.ToastUtils; import com.kmilesaway.golfbat.utils.UiUtils; import com.kmilesaway.golfbat.weight.MyDialog; import com.kmilesaway.golfbat.weight.NavigationDialog; import com.kmilesaway.golfbat.weight.RoundImageView; import com.kmilesaway.golfbat.weight.SpacesItemDecoration; import com.kmilesaway.golfbat.weight.calender.GetDateBean; import com.kmilesaway.golfbat.weight.calender.MNCalendar; import com.kmilesaway.golfbat.weight.listener.OnCalendarChangeListener; import com.lxj.xpopup.XPopup; import com.permissionx.guolindev.PermissionX; import com.permissionx.guolindev.callback.ExplainReasonCallback; import com.permissionx.guolindev.callback.ForwardToSettingsCallback; import com.permissionx.guolindev.callback.RequestCallback; import com.permissionx.guolindev.request.ExplainScope; import com.permissionx.guolindev.request.ForwardScope; import com.scwang.smart.refresh.header.ClassicsHeader; import com.scwang.smart.refresh.layout.SmartRefreshLayout; import com.scwang.smart.refresh.layout.api.RefreshLayout; import com.scwang.smart.refresh.layout.listener.OnRefreshListener; import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import butterknife.BindView; import butterknife.OnClick; /** * @author lisong * @date 2022/2/8. * GitHub: * Email: * Description:日程 */ public class ScheduleFragment extends BaseMvpFragment<SchedulePresenter> implements ScheduleContract.View, OnButtonClickListener { @BindView(R.id.rcy) RecyclerView rcy; @BindView(R.id.refreshLayout) SmartRefreshLayout refreshLayout; /*下线*/ @BindView(R.id.Offline) TextView Offline; /*上线*/ @BindView(R.id.goonline) TextView goonline; /*姓名*/ @BindView(R.id.name) TextView name; @BindView(R.id.roundimagview) RoundImageView roundimagview; /*工号*/ @BindView(R.id.jobnumber) TextView jobnumber; /*任务数量*/ @BindView(R.id.task_number) TextView taskNumber; @BindView(R.id.tvSchedulingPlan) TextView tvSchedulingPlan; private ScheduleFragmentAdapter adapter; private int status;// 1-上线 0-下线 private int userId; private DownloadManager manager; private boolean is_force_update; private int pos; private boolean isOnResume; private NavigationDialog timebottomSheetDialog; private List<GetDateBean.MonthBean> monthList = new ArrayList<>(); private String date, time; private MNCalendar mnCalendar; private List<ScheduleServiceBean> scheduleList = new ArrayList<>(); @Override protected int getLayoutId() { return R.layout.fragment_schedule; } @Override protected void initView(View view) { date = DateUtils.getSystemTimes(); time = DateUtils.dataY_M_D(date); ServiceSettings.updatePrivacyShow(getActivity(), true, true); ServiceSettings.updatePrivacyAgree(getActivity(), true); // EventBusUtils.post(new EventMessage<>(EventCode.EVENT_SOCKET, "refresh")); rcy.setLayoutManager(new LinearLayoutManager(getActivity())); adapter = new ScheduleFragmentAdapter(); View emptyView = LayoutInflater.from(getContext()).inflate(R.layout.no_data, null, false); adapter.setEmptyView(emptyView); rcy.setAdapter(adapter); rcy.addItemDecoration(new SpacesItemDecoration(UiUtils.dip2px(getActivity(), 6))); adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { @Override public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { switch (view.getId()) { case R.id.entergame: permissionMain(position); // if (!isLocServiceEnable()) { // MyDialog dialog = new MyDialog(getActivity(), R.style.mdialog, // new MyDialog.OncloseListener() { // @Override // public void onClick(boolean confirm) { // if (confirm) { // Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); // startActivity(intent); // } // } // }).setTitle("提示").setContent("请开启定位服务").setNegativeButton("取消").setPositiveButton("开启"); // dialog.show(); // } else { // requestPermission(position); // } break; case R.id.bag_check: // ToastUtils.show(getActivity(),"功能暂未开放"); saveBag(position, 0, ScheduleFragment.this.adapter.getData().get(position).getAppointment_id()); break; case R.id.bag_check1: // ToastUtils.show(getActivity(),"功能暂未开放"); saveBag(position, 1, ScheduleFragment.this.adapter.getData().get(position).getAppointment_id()); break; case R.id.bag_check2: // ToastUtils.show(getActivity(),"功能暂未开放"); saveBag(position, 2, ScheduleFragment.this.adapter.getData().get(position).getAppointment_id()); break; case R.id.bag_check3: // ToastUtils.show(getActivity(),"功能暂未开放"); saveBag(position, 3, ScheduleFragment.this.adapter.getData().get(position).getAppointment_id()); break; case R.id.take_away: confirmGan(position, 0); break; case R.id.take_away1: confirmGan(position, 1); break; case R.id.take_away2: confirmGan(position, 2); break; case R.id.take_away3: confirmGan(position, 3); break; } } }); refreshLayout.setRefreshHeader(new ClassicsHeader(getActivity())); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(RefreshLayout refreshlayout) { mPresenter.scheduleService(); mPresenter.user(); refreshLayout.finishRefresh(1000); } }); } private void permissionMain(int position) { PermissionX.init(this) .permissions( Manifest.permission.ACCESS_NETWORK_STATE) .request((allGranted, grantedList, deniedList) -> { Log.e("Tag=======", "allGranted====="+allGranted); if (allGranted) { if (!isLocServiceEnable()) { MyDialog dialog = new MyDialog(getActivity(), R.style.mdialog, new MyDialog.OncloseListener() { @Override public void onClick(boolean confirm) { if (confirm) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } } }).setTitle("提示").setContent("请开启定位服务").setNegativeButton("取消").setPositiveButton("开启"); dialog.show(); } else { requestPermission(position); } // Toast.makeText(this, "所有申请的权限都已通过", Toast.LENGTH_SHORT).show(); } else { // Toast.makeText(this, "您拒绝了如下权限:$deniedList", Toast.LENGTH_SHORT).show(); // permissionMain(position); } }); } // 修改权限请求流程 private void requestPermission(int position) { // 先显示提示弹窗 showLocationPermissionHint(); // 立即请求系统权限 requestSystemLocationPermission(position); } // 修改系统权限请求方法 private void requestSystemLocationPermission(int position) { PermissionX.init(this).permissions(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION) .onExplainRequestReason(new ExplainReasonCallback() { @Override public void onExplainReason(ExplainScope explainScope, List<String> list) { // 系统解释弹窗显示时,关闭我们的提示弹窗 if (locationPermissionPopup != null && locationPermissionPopup.isShowing()) { locationPermissionPopup.dismiss(); } explainScope.showRequestReasonDialog(list, "您已拒绝了定位权限,为了您更好的使用应用,请重新打开", "去开启", "取消"); } }).onForwardToSettings(new ForwardToSettingsCallback() { @Override public void onForwardToSettings(ForwardScope forwardScope, List<String> list) { forwardScope.showForwardToSettingsDialog(list, "您需要去应用程序设置当中手动开启定位权限", "去开启", "取消"); } }).request(new RequestCallback() { @Override public void onResult(boolean allGranted, List<String> list, List<String> list1) { // 权限请求完成,关闭提示弹窗 if (locationPermissionPopup != null && locationPermissionPopup.isShowing()) { locationPermissionPopup.dismiss(); } if (allGranted) { ArrayList<Integer> ids = new ArrayList<>(); for (ScheduleServiceBean.PersonDataBean item : scheduleList.get(position).getPerson_data()) { ids.add(item.getPerson_id()); } mPresenter.existTeeTime(scheduleList.get(position).getAppointment_id(), ids); } } }); } // 在onDestroy中清理资源 @Override public void onDestroy() { super.onDestroy(); if (locationPermissionPopup != null && locationPermissionPopup.isShowing()) { locationPermissionPopup.dismiss(); } locationPermissionPopup = null; } /** * 是否打开定位服务 * * @return */ private boolean isLocServiceEnable() { LocationManager locationManager = (LocationManager) BaseApplication.getApplication() .getSystemService(Context.LOCATION_SERVICE); boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); return gps || network; } private void saveBag(int position, int index, int appId) { ScheduleServiceBean.PersonDataBean personDataBean = adapter.getData().get(position).getPerson_data().get(index); if (personDataBean.getPerson_state() == 0) { ToastUtils.show(getActivity(), "请先确认球杆,再进行存包"); return; } if (personDataBean.getBag() != null) { if (TextUtils.equals(personDataBean.getBag(), "0") || TextUtils.equals(personDataBean.getBag(), "存包")) { showCheckDialog(personDataBean.getName(), personDataBean.getTel(), personDataBean.getPerson_id(), adapter.getData().get(position).getClient_id(), appId); } else { //展示取包提示框 showFetchingBag(personDataBean.getBag_num() + "", personDataBean.getPerson_id(), personDataBean.getName(), personDataBean.getTel(), appId); } } else { showCheckDialog(personDataBean.getName(), personDataBean.getTel(), personDataBean.getPerson_id(), adapter.getData().get(position).getClient_id(), appId); } } private void confirmGan(int position, int index) { try { int bagType = 0; startActivity(new Intent(getActivity(), BallAffirmActivity.class).putExtra("person_id", adapter.getData().get(position).getPerson_data().get(index).getPerson_id()) .putExtra("app_id", adapter.getData().get(position).getAppointment_id()) .putExtra("bagType", bagType) .putExtra("phone", adapter.getData().get(position).getPerson_data().get(index).getTel())); } catch (Exception e) { e.printStackTrace(); } } private void setRefreshDate() { refreshLayout.autoRefresh(); } @Override protected void loadNetData() { //进入到当前Fragment mPresenter = new SchedulePresenter(); mPresenter.attachView(this); mPresenter.user(); mPresenter.scheduleService(); // mPresenter.hotUpdate(); // mPresenter.getWsSetting(); } @Override public void onError(String errMessage, int errCode) { // super.onError(errMessage, errCode); if (errCode == 999) { new MyDialog(requireActivity(),false, R.style.mdialog, new MyDialog.OncloseListener() { @Override public void onClick(boolean confirm) { mPresenter.scheduleService(); } }).setTitle("提示").setContent("服务单信息已变更,请重新进入服务单").setPositiveButton("知道了").show(); } } @Override public void onSwitchStateSuccess(int errno) { if (status == 0) { ToastUtils.show(getActivity(), "下线成功"); EventBusUtils.post(new EventMessage<>(EventCode.EVENT_SERVICE_STOP, "refresh")); } else { ToastUtils.show(getActivity(), "上线成功"); //EventBusUtils.post(new EventMessage<>(EventCode.EVENT_SERVICE_START, "refresh")); } onLine(status); } @Override public void onScheduleServiceSuccess(List<ScheduleServiceBean> bean) { refreshLayout.finishRefresh(); scheduleList.clear(); if (bean != null) { scheduleList.addAll(bean); } adapter.setNewData(scheduleList); taskNumber.setText("今日日程(" + scheduleList.size() + ")"); } @Override public void onHistoryTripSuccess(List<ScheduleServiceBean> list) { } @Override public void onUserSuccess(UserBean bean) { LogUtils.d("ScheduleFragment.onUserSuccess: " + bean.getClient_id()); MainConstant.BESE_CLIENT_ID = bean.getClient_id() + ""; SPUtils.getInstance().put(MainConstant.CLIENT_ID, bean.getClient_id()); SPUtils.getInstance().put(MainConstant.ID, bean.getId()); SPUtils.getInstance().put(MainConstant.JOB_NUM, bean.getJob_num()); SPUtils.getInstance().put(MainConstant.CADDIE_HEAD_IMAGE, bean.getImage()); SPUtils.getInstance().put(MainConstant.CADDIE_NAME, bean.getCaddie_name()); SPUtils.getInstance().put(MainConstant.WHETHER_ONLINE, bean.getWhether_online()); Glide.with(getActivity()) .load(bean.getImage()) .placeholder(R.mipmap.user_logo) .error(R.mipmap.user_logo) .into(roundimagview); name.setText(bean.getCaddie_name()); jobnumber.setText(String.format("球童号: %s", bean.getCaddie_num())); userId = bean.getId(); status = bean.getWhether_online(); if (bean.getCaddie_name().startsWith("[车]") || bean.getCaddie_name().startsWith("[船]")) { SPUtils.getInstance().put(MainConstant.MAP, true); if (!isServiceWork(getActivity(), "com.kmilesaway.golfbat.service.DaemonService")) { getActivity().stopService(new Intent(getActivity(), DaemonService.class)); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { getActivity().startForegroundService(new Intent(getActivity(), DaemonService.class)); } else { getActivity().startService(new Intent(getActivity(), DaemonService.class)); } } } } @Override public void onHotUpdateSuccess(HotUpdateBean bean) { if (AppUtils.getVersionName(getActivity()).compareTo(bean.getVersion_name()) < 0) { startUpdate(bean); } } @Override public void onCutCaddieSuccess(CutCaddieBean bean) { SPUtils.getInstance().put(MainConstant.MAP, true); if (!isServiceWork(getActivity(), "com.kmilesaway.golfbat.service.DaemonService")) { getActivity().stopService(new Intent(getActivity(), DaemonService.class)); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { getActivity().startForegroundService(new Intent(getActivity(), DaemonService.class)); } else { getActivity().startService(new Intent(getActivity(), DaemonService.class)); } } MapsInitializer.updatePrivacyShow(getContext(), true, true); MapsInitializer.updatePrivacyAgree(getContext(), true); ScheduleServiceBean scheduleServiceBean = adapter.getData().get(pos); Intent intent = new Intent(getContext(), RangingScoringActivity.class); intent.putExtra("orderRef", scheduleServiceBean.getOrder_ref()); intent.putExtra("clientId", scheduleServiceBean.getClient_id()); String updatedAt = scheduleServiceBean.getUpdated_at(); String datePart = updatedAt; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// HH:mm:ss try { Date date = formatter.parse(updatedAt); SimpleDateFormat dateOnlyFormatter = new SimpleDateFormat("yyyy-MM-dd"); datePart = dateOnlyFormatter.format(date); datePart = datePart + " " + scheduleServiceBean.getOut_time(); } catch (ParseException ignored) { } intent.putExtra("play_time", datePart); intent.putExtra("group_num", scheduleServiceBean.getGroup_id()); intent.putExtra("app_id", scheduleServiceBean.getAppointment_id()); intent.putExtra("name", scheduleServiceBean.getClient_name()); intent.putExtra("state", bean.getStatus()); intent.putExtra("person_list", (Serializable) scheduleServiceBean.getPerson_data()); startActivity(intent); } @Override public void onBagStorageSuccess(BagStorageBean bean) { if (bean != null) { showNumDialog(bean.getStatus(), bean.getBag_num() + ""); } } @Override public void onWsSettingSuccess(WsSetBean bean) { SPUtils.getInstance().put("IP", bean.getWs_ip()); SPUtils.getInstance().put("Host", bean.getWs_port()); getActivity().stopService(new Intent(getActivity(), BackService.class)); if (!isServiceWork(getActivity(), "com.kmilesaway.golfbat.service.BackService")) { getActivity().startService(new Intent(getActivity(), BackService.class)); } } @Override public void getBallBagAwaySuccess(Object bean) { } @Override public void getLayoutPlanSuccess(List<String> data) { if (mnCalendar != null) { mnCalendar.addEventDates(data); } } @Override public void showSaveBagErrorDialog(String msg) { showNumDialog(2, msg); } @Override public void onFetchingBagSuccess() { setRefreshDate(); } @Override public void onExistTeeTimeSuccess() { SPUtils.getInstance().put(MainConstant.APPOINTMENT_ID, ScheduleFragment.this.adapter.getData().get(pos).getAppointment_id()); mPresenter.cutCaddie(ScheduleFragment.this.adapter.getData().get(pos).getAppointment_id()); } @Override public void onEndPersonBallByCaddySuccess() { } @Override public void onRestoreServiceSuccess() { } @Override public void onMsgWsSuccess(MsgWs bean) { } @OnClick({R.id.Offline, R.id.goonline, R.id.tvSchedulingPlan, R.id.tvMatchScoring}) public void onViewClicked(View view) { switch (view.getId()) { /*下线*/ case R.id.Offline: status = 0; //onLine(status); mPresenter.switchState(status, userId); break; /*上线*/ case R.id.goonline: status = 1; //onLine(status); mPresenter.switchState(status, userId); break; case R.id.tvMatchScoring: Intent intent = new Intent(getContext(), MatchSelectListActivity.class); startActivity(intent); break; case R.id.tvSchedulingPlan: // startActivity(new Intent(getContext(), ClickToPurchaseActivity.class)); if (timebottomSheetDialog != null) { timebottomSheetDialog.dismiss(); } timebottomSheetDialog = new NavigationDialog(getContext(), R.style.BottomDialog); //设置退出速度 timebottomSheetDialog.outDuration(100); timebottomSheetDialog.inDuration(100); //设置铺满 timebottomSheetDialog.heightParam(ViewGroup.LayoutParams.WRAP_CONTENT); //解析视图 View contentView = LayoutInflater.from(getContext()).inflate(R.layout.dialog_mncalendar, null); /*日历*/ mnCalendar = contentView.findViewById(R.id.mnCalendar); mnCalendar.setOnCalendarChangeListener(new OnCalendarChangeListener() { @Override public void onPageChange(int year, int month) { mPresenter.getLayoutPlan(year, month); } }); mnCalendar.setCurrentPager(); monthList.clear(); GetDateBean.MonthBean monthBean = new GetDateBean.MonthBean(); monthBean.setDay(date); monthBean.setStatus(99); monthList.add(monthBean); try { mnCalendar.setEventDatas(monthList); } catch (ParseException e) { e.printStackTrace(); } timebottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { mnCalendar = null; } }); //设置视图 timebottomSheetDialog.setContentView(contentView); //百度 timebottomSheetDialog.show(); break; default: break; } } @Override protected boolean isRegisteredEventBus() { return true; } private void onLine(int status) { switch (status) { case 1: goonline.setBackgroundResource(R.drawable.translucent_6_328e8e); Offline.setBackground(null); goonline.setTextColor(getActivity().getResources().getColor(R.color.white)); Offline.setTextColor(getActivity().getResources().getColor(R.color.translucent_50_white)); break; case 0: Offline.setBackgroundResource(R.drawable.translucent_6_328e8e); goonline.setBackground(null); Offline.setTextColor(getActivity().getResources().getColor(R.color.white)); goonline.setTextColor(getActivity().getResources().getColor(R.color.translucent_50_white)); getActivity().stopService(new Intent(getActivity(), DaemonService.class)); break; } } @Override public void onButtonClick(int id) { } private void startUpdate(HotUpdateBean bean) { if (bean.getIs_force_update() == 0) { is_force_update = false; } else { is_force_update = true; } /* * 整个库允许配置的内容 * 非必选 */ UpdateConfiguration configuration = new UpdateConfiguration() //输出错误日志 .setEnableLog(true) //设置自定义的下载 //.setHttpManager() //下载完成自动跳动安装页面 .setJumpInstallPage(true) //设置对话框背景图片 (图片规范参照demo中的示例图) .setDialogImage(R.drawable.ic_dialog_default) // 设置按钮的颜色 .setDialogButtonColor(Color.parseColor("#1DBCA1")) //// 设置对话框强制更新时进度条和文字的颜色 // .setDialogProgressBarColor(Color.parseColor("#E743DA")) //设置按钮的文字颜色 .setDialogButtonTextColor(Color.WHITE) //设置是否显示通知栏进度 .setShowNotification(true) //设置是否提示后台下载toast .setShowBgdToast(true) //设置是否上报数据 .setUsePlatform(true) //设置强制更新 .setForcedUpgrade(is_force_update) //设置对话框按钮的点击监听 .setButtonClickListener(this) //设置下载过程的监听 .setOnDownloadListener(listenerAdapter); manager = DownloadManager.getInstance(getActivity()); manager.setApkName("golfbat.apk") .setApkUrl(bean.getUrl()) .setSmallIcon(R.mipmap.login_logo) .setShowNewerToast(true) .setConfiguration(configuration) .setApkVersionCode(2) .setApkVersionName(bean.getVersion_name()) .setApkSize(bean.getSize()) .setApkDescription(bean.getMsg()) // .setApkMD5("db18e57e01e5bb2408116c1689f25ca7") .download(); } private OnDownloadListenerAdapter listenerAdapter = new OnDownloadListenerAdapter() { /** * 下载中 * * @param max 总进度 * @param progress 当前进度 */ @Override public void downloading(int max, int progress) { int curr = (int) (progress / (double) max * 100.0); Log.d(">>>>>>>>>>>>>>>", "downloading: " + curr); } }; /** * @param mContext * @param serviceName 是包名+服务的类名(例如:net.loonggg.testbackstage.TestService) * @return true代表正在运行,false代表服务没有正在运行 */ public boolean isServiceWork(Context mContext, String serviceName) { boolean isWork = false; ActivityManager myAM = (ActivityManager) mContext .getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> myList = myAM.getRunningServices(40); if (myList.size() <= 0) { return false; } for (int i = 0; i < myList.size(); i++) { String mName = myList.get(i).service.getClassName().toString(); if (mName.equals(serviceName)) { isWork = true; break; } } return isWork; } //存包对应用户信息 private void showCheckDialog(String name, String phone, int person_id, int client_id, int appId) { View view = LayoutInflater.from(getActivity()).inflate(R.layout.pop_bag_check, null, false); final AlertDialog dialog = new AlertDialog.Builder(getActivity(), R.style.mdialog).setView(view).create(); EditText tvName = view.findViewById(R.id.tv_name); EditText tvPhone = view.findViewById(R.id.tv_phone); tvName.setFocusable(false); tvName.setEnabled(false); if (!TextUtils.isEmpty(name)) { tvName.setText(name); tvName.setSelection(tvName.getText().length()); } if (!TextUtils.isEmpty(phone)) { tvPhone.setText(phone); tvPhone.setSelection(tvPhone.getText().length()); } TextView submit = view.findViewById(R.id.tv_commit); submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { HideKeyboard(v); if (tvPhone.getText().toString() == null || tvPhone.getText().toString().equals("")) { ToastUtils.show(getActivity(), "请输入手机号"); return; } if (!RegexUtils.isMobileExact(tvPhone.getText().toString().trim())) { ToastUtils.showShort("请输入正确的手机号"); return; } mPresenter.bagStorage(person_id, client_id, tvName.getText().toString().trim(), tvPhone.getText().toString().trim(), appId + ""); dialog.dismiss(); } }); dialog.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog不消失 dialog.setOnKeyListener(keylistener);//设置点击返回键Dialog不消失 dialog.show(); //此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4 注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果会 dialog.getWindow().setLayout((UiUtils.getScreenWidth(getActivity()) / 4 * 3), LinearLayout.LayoutParams.WRAP_CONTENT); } private void showFetchingBag(String bag_num, int person_id, String person_name, String person_tel, int app_id) { View view = LayoutInflater.from(getActivity()).inflate(R.layout.pop_bag_fetching, null, false); final AlertDialog dialog = new AlertDialog.Builder(getActivity(), R.style.mdialog).setView(view).create(); view.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); view.findViewById(R.id.submit).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mPresenter.fetchingBag(bag_num, person_id, person_name, person_tel, app_id); dialog.dismiss(); } }); dialog.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog不消失 dialog.setOnKeyListener(keylistener);//设置点击返回键Dialog不消失 dialog.show(); //此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4 注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果会 dialog.getWindow().setLayout((UiUtils.getScreenWidth(getActivity()) / 4 * 3), LinearLayout.LayoutParams.WRAP_CONTENT); } //显示存包位置 private void showNumDialog(int status, String num) { View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_bag_check, null, false); final AlertDialog dialog = new AlertDialog.Builder(getActivity(), R.style.mdialog).setView(view).create(); TextView title = view.findViewById(R.id.tv_title); TextView tvNum = view.findViewById(R.id.tv_num); TextView tvContent = view.findViewById(R.id.tv_content); EventBusUtils.post(new EventMessage<>(EventCode.EVENT_SCHEDULE_REFRESH, "refresh")); if (status == 1) { title.setText("存包成功"); tvNum.setText(num); setRefreshDate(); } else if (status == 0) { title.setText("存包失败"); tvNum.setText(num); tvContent.setText("球包已放至指定位置"); } else if (status == 3) { title.setText("球包位置"); tvNum.setText(num); tvContent.setText("请您到指定位置取包"); } else if (status == 4) { title.setText("存包失败"); tvNum.setText(num); tvContent.setText("该手机号已有球包,请更换手机号进行存包"); } else { title.setText("存包失败"); tvNum.setVisibility(View.GONE); tvContent.setText(num); } TextView submit = view.findViewById(R.id.submit); submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); dialog.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog不消失 dialog.setOnKeyListener(keylistener);//设置点击返回键Dialog不消失 dialog.show(); //此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4 注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果会 dialog.getWindow().setLayout((UiUtils.getScreenWidth(getActivity()) / 4 * 3), LinearLayout.LayoutParams.WRAP_CONTENT); } //取包 private void showTakeAwayDialog() { View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_take_away, null, false); final AlertDialog dialog = new AlertDialog.Builder(getActivity(), R.style.mdialog).setView(view).create(); TextView submit = view.findViewById(R.id.submit); submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); TextView cancel = view.findViewById(R.id.cancel); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); dialog.setCanceledOnTouchOutside(true);// 设置点击屏幕Dialog不消失 dialog.setOnKeyListener(keylistener);//设置点击返回键Dialog不消失 dialog.show(); //此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4 注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果会 dialog.getWindow().setLayout((UiUtils.getScreenWidth(getActivity()) / 4 * 3), LinearLayout.LayoutParams.WRAP_CONTENT); } DialogInterface.OnKeyListener keylistener = new DialogInterface.OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { return true; } else { return false; } } }; //隐藏虚拟键盘 public static void HideKeyboard(View v) { InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm.isActive()) { imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0); } } /** * 接收到分发的事件 * * @param event 事件 */ @Override protected void receiveEvent(EventMessage event) { switch (event.getCode()) { case EventCode.EVENT_SCHEDULE_REFRESH: mPresenter.scheduleService(); break; } } @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); Log.d("yanjin", "hidden = " + hidden); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isOnResume && isVisibleToUser) { refreshLayout.autoRefresh(); Log.d("yanjin", "isVisibleToUser = " + isVisibleToUser); } } @Override public void onResume() { super.onResume(); isOnResume = true; } public void onRestart() { refreshLayout.autoRefresh(); Log.d("yanjin", "onRestart = "); } // 在类顶部添加变量 private PopupWindow locationPermissionPopup; // 添加显示权限提示弹窗的方法 private void showLocationPermissionHint() { if (locationPermissionPopup != null && locationPermissionPopup.isShowing()) { locationPermissionPopup.dismiss(); } View popupView = LayoutInflater.from(getActivity()).inflate(R.layout.popup_location_permission_hint, null); locationPermissionPopup = new PopupWindow( popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT ); // 设置PopupWindow属性 locationPermissionPopup.setFocusable(false); locationPermissionPopup.setOutsideTouchable(false); locationPermissionPopup.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // 显示在顶部 View rootView = getActivity().getWindow().getDecorView(); locationPermissionPopup.showAtLocation(rootView, Gravity.TOP, 0, UiUtils.dip2px(getActivity(), 16)); } }
09-23
package com.wsxxkjbj.daqershoucecb.fragment.home; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import com.hfd.common.base.BaseActivity; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; import com.wsxxkjbj.daqershoucecb.R; import com.wsxxkjbj.daqershoucecb.utils.OnMultiClickListener; import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; import com.wsxxkjbj.daqershoucecb.view.ProvincePickerSheet; import java.util.Arrays; import java.util.Calendar; public class JzAssessActivity extends BaseActivity { private ProvincePickerSheet sheet; private String province; private String aptitude; private String belong; TextView tvBack, etTime, etCharacter, etColor, etBelong, tvProvince; EditText etType, etMileage, etNumber; RelativeLayout tv_province; QMUIRoundButton btnPg; private static final int REQUEST_CODE_COLOR = 1; @Override protected int setLayout() { return R.layout.activity_jz_assess; } @Override protected void setView() { tvBack = fvbi(R.id.tv_back); etType = fvbi(R.id.et_type); etTime = fvbi(R.id.et_time); etColor = fvbi(R.id.et_color); etNumber = fvbi(R.id.et_number); etBelong = fvbi(R.id.et_belong); etCharacter = fvbi(R.id.et_character); etMileage = fvbi(R.id.et_mileage); btnPg = fvbi(R.id.btn_pg); tv_province = fvbi(R.id.province); tvProvince = fvbi(R.id.tv_province); } @Override protected void setData() { sheet = new ProvincePickerSheet(Arrays.asList(getResources().getStringArray(R.array.aptitude_list)), aptitude -> { // 回调 this.aptitude = aptitude; etCharacter.setText(aptitude); }); sheet = new ProvincePickerSheet(Arrays.asList(getResources().getStringArray(R.array.belong_list)), belong -> { // 回调 this.belong = belong; etBelong.setText(belong); }); sheet = new ProvincePickerSheet(Arrays.asList(getResources().getStringArray(R.array.province_list)), province -> { // 回调 this.province = province; tvProvince.setText(province); }); } @Override protected void setClick() { tvBack.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { finish(); } }); btnPg.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { if (TextUtils.isEmpty(etType.getText().toString())) { } else { Bundle bundle = new Bundle(); bundle.putInt("imageResId", R.mipmap.img_jz_bg); bundle.putString("province", province); toClass(OutcomeActivity.class, bundle); } } }); etTime.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { // 获取当前日期 Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( (view, year, monthOfYear, dayOfMonth) -> { // 由于 Calendar 月份从 0 开始,这里将其转换为从 1 开始的月份 int actualMonth = monthOfYear + 1; // 处理选择的年份 etTime.setText(year + "-" + actualMonth + "-" + dayOfMonth); }, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); // 显示日期选择对话框 dpd.show(getSupportFragmentManager(), "Datepickerdialog"); } }); etCharacter.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { sheet.show(getSupportFragmentManager(), "ProvincePickerSheet"); } }); etColor.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { Intent intent = new Intent(JzAssessActivity.this, ColorActivity.class); startActivityForResult(intent, REQUEST_CODE_COLOR); } }); etBelong.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { sheet.show(getSupportFragmentManager(), "ProvincePickerSheet"); } }); tv_province.setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { sheet.show(getSupportFragmentManager(), "ProvincePickerSheet"); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_COLOR && resultCode == RESULT_OK) { String selectedColor = data.getStringExtra("selectedColor"); etColor.setText(selectedColor); } } @Override protected void onDestroy() { super.onDestroy(); } }这个页面判断etTime,etCharacter,etColor,etBelong,tv_province。etType,etNumber,etMileage控件不为空的情况下在跳转
11-01
webView 播放视频 有声音和进度条 没有画面 package com.doshare.screen.ui; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; import androidx.core.content.ContextCompat; import com.doshare.commons.enums.ErrorEnum; import com.doshare.commons.io.HttpUtils; import com.doshare.commons.io.Log; import com.doshare.commons.io.NetworkUtils; import com.doshare.commons.lang.DateUtils; import com.doshare.commons.lang.GsonUtils; import com.doshare.commons.lang.IdUtils; import com.doshare.commons.lang.StringUtils; import com.doshare.screen.AppHelper; import com.doshare.screen.Constants; import com.doshare.screen.InitApp; import com.doshare.screen.R; import com.doshare.screen.ResultBean; import com.doshare.screen.ResultEnum; import com.doshare.screen.StringCallback; import com.doshare.screen.storage.CacheHandler; import com.doshare.screen.storage.FileHandler; import com.elvishew.xlog.XLog; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 主界面内容区-浏览器 */ public class BrowserFragment extends BaseFragment { private final String REQUEST_REMOTE_DATA = "getRemoteData";//请求类型 private String currentFuncId = "";//功能Id private CommonDialogFragment commonDialog = null;//通用对话框 private Map<String, WebViewGetDataTask> webViewGetDataTaskMap = null;//浏览器获取数据异步任务 private WebView webView;//浏览器 private boolean redirectFlag = false;//重定向标识 private boolean homeShotFlag = false;//首页截屏幕标识 private boolean loadedFlag = false;//页面加载标识 private static final int MSG_LOADUI = 1; private static final int MSG_SHOWMSG = 2; private static final int MSG_SETPULLWEBVIEWCOMPLETE = 3; private static final int MSG_SCREEN_SHOT = 10;//屏幕截屏 private static final String HOME_FUNC_ID = "ClassHome"; //是否门户页面 private boolean portalFlag = false; public BrowserFragment(boolean portalFlag, String funcId){ super(); this.portalFlag = portalFlag; this.currentFuncId = funcId; webViewGetDataTaskMap = new HashMap<String, WebViewGetDataTask>(); } public String getFuncId(){ return currentFuncId; } //region 消息处理 private final Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch(msg.what){ case MSG_LOADUI: break; case MSG_SHOWMSG: break; case MSG_SETPULLWEBVIEWCOMPLETE: break; case MSG_SCREEN_SHOT: if (currentFuncId.contentEquals(HOME_FUNC_ID)) mainActivity.takeScreenShot(); break; } } }; //endregion //region 覆写Fragment方法 @Override public void onCreate(Bundle savedInstanceState) { XLog.d("BrowserFragment onCreate()..."); super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { XLog.d("BrowserFragment onCreateView()..."); mainActivity = (IMainActivity)getActivity(); View rootView = inflater.inflate(R.layout.fragment_browser, container, false); webView = (WebView) rootView.findViewById(R.id.webView); registerWebViewEvent(); handler.sendEmptyMessageDelayed(MSG_SCREEN_SHOT, 100); return rootView; } @Override public void onResume() { XLog.d("BrowserFragment onResume()..."); super.onResume(); } /** * 重新加载数据 * @param forceFlag 是否强制加载 */ public void reload(boolean forceFlag){ XLog.d("BrowserFragment reload()... " + forceFlag); Bundle args = getArguments(); if (args != null){ String funcId = args.getString("funcId"); if (!StringUtils.isNullOrEmpty(funcId)){ String url = funcId; if(!url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("file:///")){ if (url.startsWith("html://")){ url = StringUtils.trimStart(url, "html://"); String param = ""; if(url.contains("?")){ int i = url.indexOf("?"); String temp = url; url = url.substring(0,i); param = temp.substring(i); } String anchor = ""; if (url.indexOf("#") != -1){ int pos = url.indexOf("#"); anchor = url.substring(pos); if(InitApp.profile.getOrientation().equals("vertical") && !anchor.contains("_v")){ anchor = anchor + "_v"; } url = url.substring(0, pos); } if(!StringUtils.isNullOrEmpty(param)){ anchor = anchor + param; } url = "file://" + FileHandler.buildFilePath(getContext(), Environment.DIRECTORY_DOCUMENTS, Constants.RESOURCE_FILE_FOLDER + "/" + url + ".html" + anchor); XLog.d("BrowserFragment reload() url: " + url); }else{ url = "file:///android_asset/" + url; XLog.d("BrowserFragment reload() url: " + url); } } funcId = funcId +"?classId="+InitApp.profile.getClassId(); if (!StringUtils.equals(currentFuncId, funcId) || !loadedFlag) { redirectFlag = false; loadedFlag = true; reloadFlag = false; webView.clearView(); webView.loadUrl(url+"?classId="+InitApp.profile.getClassId()); } else if (loadedFlag && (reloadFlag || forceFlag)) { redirectFlag = false; reloadFlag = false; webView.reload(); } //巡堂页面打开60s后返回首页 if(funcId.equals("html://main#ccpatrol")){ backToPortalTimer.start(); } } }else if (loadedFlag && reloadFlag){ redirectFlag = false; reloadFlag = false; webView.reload(); } } /** * 改变当前网址的hash地址 * @param hash hash地址 */ public void changeHash(String hash){ XLog.d("BrowserFragment changeHash() hash: " + hash); try{ webView.loadUrl("javascript:window.changeHash('"+hash+"')"); }catch (Exception e){ e.printStackTrace(); } } /** * 注册浏览器事件 */ private void registerWebViewEvent(){ XLog.d("BrowserFragment registerWebViewEvent()... "); //webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setAllowFileAccess(true); webView.getSettings().setSupportZoom(true); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDefaultTextEncodingName("utf-8"); webView.getSettings().setLoadsImagesAutomatically(true); webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webView.getSettings().setMediaPlaybackRequiresUserGesture(true); webView.setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent)); //webView.setBackgroundResource(R.color.transparent); //webView.getBackground().setAlpha(0); //webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null); webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { Message msg = new Message(); msg.what = MSG_SHOWMSG; msg.obj = message; handler.sendMessage(msg); return true; } }); webView.addJavascriptInterface(new JavaScriptInterface(), "webView"); webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { redirectFlag = true; view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { redirectFlag = false; super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (redirectFlag) { } } }); } @Override public void onStart() { XLog.d("BrowserFragment onStart()... "); super.onStart(); reload(false); } @Override public void onDestroy() { XLog.d("BrowserFragment onDestroy()... "); if (webViewGetDataTaskMap.size() > 0){ String[] keys = new String[webViewGetDataTaskMap.size()]; webViewGetDataTaskMap.keySet().toArray(keys); for (int i=0;i<keys.length;i++){ webViewGetDataTaskMap.get(keys[i]).cancel(true); } } handler.removeCallbacksAndMessages(null); super.onDestroy(); } private final CountDownTimer backToPortalTimer = new CountDownTimer(60 * 1000, 60 * 1000) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { mainActivity.sendMessage(Constants.MSG_GO_PORTAL); } }; @Override public void onHiddenChanged(boolean hidden) { XLog.d("BrowserFragment onHiddenChanged()... hidden:"+ hidden); super.onHiddenChanged(hidden); if (!hidden) reload(false); } /** * 回调 * @param callBackCode 回调代码 */ @Override public void callBack(String callBackCode){ XLog.d("BrowserFragment StringCallBack()... "); } /** * 回调 * @param messageCode 消息代码 */ @Override public void callBack(int messageCode){ XLog.d("BrowserFragment StringCallBack()... messageCode:"+messageCode); if (messageCode == MSG_SCREEN_SHOT) homeShotFlag = true; } //endregion //region 对话框 //显示等待对话框 public void showWaitingDialog(){ XLog.d("BrowserFragment showWaitingDialog()..."); commonDialog = new CommonDialogFragment(CommonDialogFragment.DialogTypes.WaitingDialog); commonDialog.show(getFragmentManager(), "CommonDialogFragment"); } //显示等待对话框 public void showWaitingMsgDialog(String msg){ XLog.d("BrowserFragment showWaitingDialog()... msg:"+msg); commonDialog = new CommonDialogFragment(CommonDialogFragment.DialogTypes.WaitingMsgDialog); commonDialog.setMessage(msg); commonDialog.show(getFragmentManager(), "CommonDialogFragment"); } //显示消息对话框 public void showPromptDialog(String title, String msg){ XLog.d("BrowserFragment showWaitingDialog()... title:"+title+" msg:" + msg); commonDialog = new CommonDialogFragment(CommonDialogFragment.DialogTypes.PromptDialog); commonDialog.setTitle(title); commonDialog.setMessage(msg); commonDialog.setPositiveButton(getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); closeDialog(); } }); commonDialog.show(getFragmentManager(), "CommonDialogFragment"); } //显示确认对话框 public void showConfirmDialog(final String funcType, String title, String msg, final String callBackMethod){ XLog.d("BrowserFragment showWaitingDialog()... title:"+title+" msg:" + msg + " funcType" + funcType); commonDialog = new CommonDialogFragment(CommonDialogFragment.DialogTypes.ConfirmDialog); commonDialog.setTitle(title); commonDialog.setMessage(msg); commonDialog.setPositiveButton(getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); closeDialog(); if (webView != null && !TextUtils.isEmpty(callBackMethod)){ webView.loadUrl("javascript:" + callBackMethod + "('" + funcType + "')"); } callBack4Confirm(funcType); } }); commonDialog.setNegativeButton(getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); closeDialog(); } }); commonDialog.show(getFragmentManager(), "CommonDialogFragment"); } //关闭对话框 public void closeDialog(){ XLog.d("BrowserFragment closeDialog()... "); androidx.fragment.app.Fragment pre = getFragmentManager().findFragmentByTag("CommonDialogFragment"); if (pre != null){ androidx.fragment.app.FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.remove(pre).commit(); } commonDialog = null; } //显示提示信息(短时间) public void showToastInShortTime(String msg){ XLog.d("BrowserFragment showToastInShortTime() ... msg:"+ msg); CommonToast.makeText(getActivity(), msg, CommonToast.LENGTH_SHORT).show(); } //显示提示信息(长时间) public void showToastInLongTime(String msg){ XLog.d("BrowserFragment showToastInLongTime() ... msg:"+ msg); CommonToast.makeText(getActivity(), msg, CommonToast.LENGTH_LONG).show(); } //确认框回调 private void callBack4Confirm(String funcType){ XLog.d("BrowserFragment callBack4Confirm() ... funcType:"+ funcType); } //endregion //region 浏览器脚本接口 final class JavaScriptInterface { //跳转至视频播放页面 @JavascriptInterface public void viewVideo(String message, String srcPath, String videoName){ XLog.d("BrowserFragment viewVideo() ... msg:"+ message + " srcPath:" + srcPath + " videoName:" + videoName); //String url = Intent intent=new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClass(InitApp.getContext(),ScreenVideoActivity.class); intent.putExtra("videoUrl",message); intent.putExtra("srcPath",srcPath); intent.putExtra("videoName",videoName); InitApp.getContext().startActivity(intent); } //显示消息对话框 @JavascriptInterface public void showMessage(String message){ XLog.d("BrowserFragment showMessage() ... msg:"+ message); showPromptDialog(getResources().getString(R.string.dialog_title), message); } //显示确认对话框 @JavascriptInterface public void showConfirm(String funcType, String title, String message, String callBackMethod){ XLog.d("BrowserFragment showConfirm() ... msg:"+ message + " funcType:" + funcType + " title:" + title); showConfirmDialog(funcType, TextUtils.isEmpty(title) ? getResources().getString(R.string.dialog_title) : title, message, callBackMethod); } //异步调用获取数据 @JavascriptInterface public void onscreenrequest(String interfaceCode, String interface_parameters, String onComplete, boolean showLoading){ XLog.d("BrowserFragment onscreenrequest() ... interfaceCode:"+ interfaceCode + " interface_parameters:" + interface_parameters); if (NetworkUtils.checkNetwork(getContext())){//在线异步请求 Map<String, String> params = new HashMap<>(); params.put("interface_code", interfaceCode); params.put("interface_parameters", interface_parameters); params.put("onComplete", onComplete); String taskId = IdUtils.generateUUID(); WebViewGetDataTask task = new WebViewGetDataTask(taskId, showLoading); webViewGetDataTaskMap.put(taskId, task); task.execute(params); }else{//本地缓存同步请求 try{ String result = CacheHandler.requestJson4Cache(interfaceCode, interface_parameters); webView.loadUrl("javascript:window.invokeCallback('" + onComplete + "',eval('("+result+")'))"); }catch(Exception e){ e.printStackTrace(); Log.d("CacheHandler.request4Cache", String.format("%s:%s invoke error", interfaceCode, interface_parameters)); } } } //获取访问令牌 @JavascriptInterface public String getAccessToken(){ XLog.d("BrowserFragment getAccessToken() ..."); return InitApp.profile.getToken(); } //获取后台服务地址 @JavascriptInterface public String getRemoteUrl(){ XLog.d("BrowserFragment getRemoteUrl() ..."); return AppHelper.getUrl() + "/oauth2/resources"; } @JavascriptInterface public String getDeviceCode(){ XLog.d("BrowserFragment getDeviceCode() ..."); return InitApp.profile.getDeviceCode(); } //教室 @JavascriptInterface public String getClassRoom(){ XLog.d("BrowserFragment getClassRoom() ..."); return InitApp.profile.getClassroomName(); } @JavascriptInterface public String getClassRoomId(){ XLog.d("BrowserFragment getClassRoomId() ..."); return InitApp.profile.getClassroomId(); } @JavascriptInterface public int getYearWeek(){ XLog.d("BrowserFragment getYearWeek() ..."); Calendar c = Calendar.getInstance(); return c.get(Calendar.WEEK_OF_YEAR); } //当前课程和教师 @JavascriptInterface public String getCourseAndTeacher(){ XLog.d("BrowserFragment getCourseAndTeacher() ..."); String course = ""; String teacher = ""; String nowTime = DateUtils.dateTimeToString(new Date()).split(" ")[1]; String nowTimeStr = nowTime.split(":")[0]+":"+nowTime.split(":")[1]; ListView timetableList = getActivity().findViewById(R.id.timetable_list); if(timetableList == null){ TextView tvCourse = getActivity().findViewById(R.id.tv_course_name); TextView tvTeacher = getActivity().findViewById(R.id.tv_teacher_name); if(tvCourse != null && tvTeacher != null){ return tvCourse.getText() + ":" + tvTeacher.getText(); }else{ return ""; } } ListAdapter adapter = timetableList.getAdapter(); if(adapter != null){ for(int i = 0; i < adapter.getCount(); i++){ String s = GsonUtils.object2Json(adapter.getItem(i)); Map<String, Object> map = GsonUtils.json2Map(s); String time = map.get("time").toString(); if(!StringUtils.isNullOrEmpty(time)){ String time1 = time.split("-")[0]; String time2 = time.split("-")[1]; if(nowTimeStr.compareTo(time1) >= 0 && nowTimeStr.compareTo(time2) <=0){ course = map.get("courseName").toString(); teacher = map.get("teacherName").toString(); } } } } return course + ":" + teacher; } @JavascriptInterface public String getClassId() { XLog.d("BrowserFragment getClassId() ..."); return InitApp.profile.getClassId(); } //异步调用获取文本资源 @JavascriptInterface public String onscreenloader(String name, String dataType){ XLog.d("BrowserFragment onscreenloader() ... name:" + name + " dataType:" + dataType); String filePathName = "/" + Constants.RESOURCE_FILE_FOLDER + "/" + name; return FileHandler.readText(getContext(), Environment.DIRECTORY_DOCUMENTS, filePathName); } //是否门户页所在浏览器 @JavascriptInterface public boolean isPortalBrowser(){ XLog.d("BrowserFragment isPortalBrowser() ..."); return portalFlag; } @JavascriptInterface public String getBrowserName(){ XLog.d("BrowserFragment isPortalBrowser() ..."); return portalFlag ? "portal" : "browser2"; } //页面跳转(门户页跳转到内容页,或内容页内部跳转) @JavascriptInterface public void redirect(String hash){ XLog.d("BrowserFragment redirect() ... hash:"+hash); Message msg = new Message(); msg.what = Constants.MSG_REDIRECT; Bundle args = new Bundle(); args.putString("hash", hash); msg.setData(args); mainActivity.sendMessage(msg); } //返回门户页面(内容页面返回门户页面) @JavascriptInterface public void backPortal() { XLog.d("BrowserFragment backPortal() ... "); mainActivity.sendMessage(Constants.MSG_GO_PORTAL); } //改变页面地址(仅用于改变内容页浏览器地址) @JavascriptInterface public void changeUrl(String url){ XLog.d("BrowserFragment changeUrl() ... url:"+url); if (!portalFlag) currentFuncId = url; } @JavascriptInterface public void returnAttend(){ XLog.d("BrowserFragment returnAttend() ... "); mainActivity.changePage("app://Attend", "考勤"); } } //浏览器获取数据任务内部类 //参数一:启动任务执行的输入参数类型 //参数二:后台任务执行的进度参数类型 //参数三:后台计算结果的类型 class WebViewGetDataTask extends AsyncTask<Map<String, String>, Void, ResultBean> { private final String id; private final boolean showWaiting; private String callBackMehtod; public WebViewGetDataTask(){ this(IdUtils.generateUUID(), true); } public WebViewGetDataTask(String id, boolean showWaiting){ this.id = id; this.showWaiting = showWaiting; } //任务开始后立即执行,可在此处对UI进行标记处理 @Override protected void onPreExecute() { if (showWaiting){ showWaitingDialog(); } } //在onPreExecute()完成后立即执行,用于执行较为费时的操作 @Override protected ResultBean doInBackground(Map<String, String>... params) { if (!NetworkUtils.checkNetwork(getContext())){ return ResultBean.getInstance(REQUEST_REMOTE_DATA, params[0], ResultEnum.String, ErrorEnum.NETWORK_OFFLINE); } try { String interface_code = params[0].get("interface_code"); String interface_parameters = params[0].get("interface_parameters"); callBackMehtod = params[0].get("onComplete"); Map<String, String> postParams = getPostParams(interface_code, interface_parameters); StringCallback callback = new StringCallback(); String url = AppHelper.getUrl() + "/oauth2/resources"; XLog.d("BrowserFragment WebViewGetDataTask url:" + url + " params:" + postParams); HttpUtils.post(url, postParams, callback); return ResultBean.getInstance(REQUEST_REMOTE_DATA, params[0], callback); } catch (Exception e) { XLog.e("BrowserFragment WebViewGetDataTask 异常:"); XLog.e(e); return ResultBean.getInstance(REQUEST_REMOTE_DATA, params[0], ResultEnum.String, ErrorEnum.ERROR); } } //任务结束时执行,计算结果被传递到此方法中,在此处恢复UI标记 @Override protected void onPostExecute(final ResultBean result) { webViewGetDataTaskMap.remove(id); if (showWaiting) closeDialog(); if (result.isSuccess()){ XLog.d("BrowserFragment WebViewGetDataTask success:"); if (!TextUtils.isEmpty(callBackMehtod)){ String resultJson = StringUtils.replace(result.getStringResult(),"\"", "\\\""); webView.loadUrl("javascript:window.invokeCallback('" + callBackMehtod + "',eval('("+resultJson+")'))"); } }else{ XLog.e("BrowserFragment WebViewGetDataTask error:"+ result.getErrorCode() + ":" + result.getErrorDesc()); Map<String,Object> map = (Map<String, Object>) result.getRequestParameters(); String interface_code = map.get("interface_code").toString(); if(interface_code.equals("getClassPersonalCard")){ if(result.getErrorCode().equals("010004")){ CommonToast.makeText(getActivity(), "用户表资料缺失", CommonToast.LENGTH_SHORT).show(); } } } } //取消任务时执行 @Override protected void onCancelled() { XLog.d("BrowserFragment onCancelled()"); webViewGetDataTaskMap.remove(id); if (showWaiting) closeDialog(); } /** * 获取post请求参数 * @param interface_code 接口代码 * @param interface_parameters 接口参数 * @return post请求参数 */ private Map<String, String> getPostParams(String interface_code, String interface_parameters){ XLog.d("BrowserFragment getPostParams()... interface_code:" + interface_code + " interface_parameters:" + interface_parameters); Map<String, String> params = new HashMap<>(); params.put("access_token", InitApp.profile.getToken()); params.put("classId", InitApp.profile.getClassId()); params.put("interface_code", interface_code); params.put("interface_parameters", interface_parameters); return params; } } //endregion }
06-20
<template> <div class="calendar"> <div class="calendar-header"> <!-- <button style="background-color: transparent; border:0" @click="prevMonth"><</button> --> <div class="shou" @click="prevMonth"> <LeftOutlined /> </div> <span>{{ currentYear }}年{{ currentMonth + 1 }}月</span> <!-- <button @click="nextMonth">></button> --> <div class="shou" @click="nextMonth"> <RightOutlined /> </div> </div> <div class="weekdays"> <div v-for="(day, index) in weekdays" :key="index" class="weekday"> {{ day }} </div> </div> <div class="calendar-grid"> <div class="calendar-row" v-for="(week, index) in weeks" :key="index"> <div v-for="day in week" :key="day.date" class="calendar-day" :class="{ 'not-current-month': !day.isCurrentMonth, activeDay: (day.isToday && !homeData.home.selectedDay) || (homeData.home.selectedDay && day.date.toDateString() === homeData.home.selectedDay), }" @click="handleDayClick(day)" > {{ day.day }} <div class="dian"></div> </div> </div> </div> </div> </template> <script setup> import { ref, computed } from "vue"; import { LeftOutlined, RightOutlined } from "@ant-design/icons-vue"; import homeStore from "@/store/home/index"; const homeData = homeStore(); const weekdays = ["日", "一", "二", "三", "四", "五", "六"]; const currentDate = ref(new Date()); // 生成日历数据 const generateCalendar = (date) => { const year = date.getFullYear(); const month = date.getMonth(); const today = new Date(); // 当月第一天 const firstDay = new Date(year, month, 1); // 上个月最后一天 const lastDayOfPrevMonth = new Date(year, month, 0); // 当月最后一天 const lastDay = new Date(year, month + 1, 0); // 计算起始偏移(周几) const startOffset = firstDay.getDay() === 0 ? 6 : firstDay.getDay() - 1; // 确保始终生成5行(35天) const totalDays = 35; const days = []; // 添加上月日期 for (let i = startOffset - 1; i >= 0; i--) { const day = lastDayOfPrevMonth.getDate() - i; days.push({ day, date: new Date(year, month - 1, day), isCurrentMonth: false, isToday: false, }); } // 添加当月日期 for (let i = 1; i <= lastDay.getDate(); i++) { const date = new Date(year, month, i); days.push({ day: i, date, isCurrentMonth: true, isToday: date.toDateString() === today.toDateString(), }); } // 补充下月日期 let nextMonthDay = 1; while (days.length < totalDays) { days.push({ day: nextMonthDay, date: new Date(year, month + 1, nextMonthDay), isCurrentMonth: false, isToday: false, }); nextMonthDay++; } // 分组为5行(每周7天) const weeks = []; for (let i = 0; i < 5; i++) { weeks.push(days.slice(i * 7, (i + 1) * 7)); } return weeks; }; // 计算属性 const weeks = computed(() => generateCalendar(currentDate.value)); const currentYear = computed(() => currentDate.value.getFullYear()); const currentMonth = computed(() => currentDate.value.getMonth()); // 月份切换 const prevMonth = () => { currentDate.value = new Date( currentDate.value.getFullYear(), currentDate.value.getMonth() - 1 ); }; const nextMonth = () => { currentDate.value = new Date( currentDate.value.getFullYear(), currentDate.value.getMonth() + 1 ); }; // 日期点击处理 const handleDayClick = (day) => { if (day.isCurrentMonth) { homeData.home.selectedDay = day.date.toDateString(); // 存储为标准日期字符串 homeData.home.forecastShow = true; console.log("选中日期:", day.date); } }; </script> <style scoped> .calendar { width: 100%; } .calendar-header { display: flex; justify-content: space-between; align-items: center; padding: 10px; font-size: 18px; } .calendar-grid { display: grid; grid-template-rows: repeat(5, 1fr); gap: 4px; } .weekdays { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; margin: 10px 0; font-weight: bold; text-align: center; } .calendar-row { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; } .calendar-day { padding: 5px; min-height: 64px; text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: center; cursor: pointer; border-radius: 4px; position: relative; /* transition: background 0.2s; */ } .dian{ position: absolute; background-color: transparent; padding: 4px; border-radius: 50%; top: 68%; } .calendar-day:hover { border-radius: 50%; background: #f0f0f0; } .not-current-month { color: #9a9a9a; pointer-events: none; } .activeDay { background: #eb7162 !important; color: white; border-radius: 50%; font-size: 18px; } </style> 在这个代码里面写好
05-31
实验四的界面是图书查询界面Ss.java类代码: import static com.example.myapplication.R.id.tt_hg; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; public class Ss extends AppCompatActivity { private EditText editId; private EditText editName; private EditText editAuthor; private static final int item1 = Menu.FIRST; private static final int item2 = Menu.FIRST + 1; public void onResume(){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String size = sp.getString("font_size","25"); EditText syqt = findViewById(R.id.edit_id); syqt.setTextSize(Integer.valueOf(size)); EditText cxqt = findViewById(R.id.edit_name); cxqt.setTextSize(Integer.valueOf(size)); EditText szqt = findViewById(R.id.edit_author); szqt.setTextSize(Integer.valueOf(size)); RadioButton dfqt = findViewById(tt_hg); dfqt.setTextSize(Integer.valueOf(size)); RadioButton dft = findViewById(R.id.tt_hu); dft.setTextSize(Integer.valueOf(size)); Button dfttd = findViewById(R.id.btn_ff); dfttd.setTextSize(Integer.valueOf(size)); Button dftqq = findViewById(R.id.btn_clar); dftqq.setTextSize(Integer.valueOf(size)); Button dftww = findViewById(R.id.btn_back); dftww.setTextSize(Integer.valueOf(size)); Button dftwwl = findViewById(R.id.ff_id1); dftwwl.setTextSize(Integer.valueOf(size)); Button dftwws = findViewById(R.id.ff_id2); dftwws.setTextSize(Integer.valueOf(size)); Button dftwwt = findViewById(R.id.ff_id3); dftwwt.setTextSize(Integer.valueOf(size)); updateUI(); super.onResume(); } private void updateUI() { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String fontSize = sp.getString("font_size", "15"); int size = Integer.parseInt(fontSize); String textColor = sp.getString("text_color", "#FF000000"); int color = Color.parseColor(textColor); applyStyleToEditText(editId, size, color); applyStyleToEditText(editName, size, color); applyStyleToEditText(editAuthor, size, color); } private void applyStyleToEditText(EditText btn, int size, int color) { btn.setTextSize(size); btn.setTextColor(color); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ss); // 初始化 EditText editId = findViewById(R.id.edit_id); editName = findViewById(R.id.edit_name); editAuthor = findViewById(R.id.edit_author);//通过ID绑定视图对象 RadioButton ttHg = findViewById(R.id.tt_hg); RadioButton ttHu = findViewById(R.id.tt_hu); Button btnFf = findViewById(R.id.btn_ff); LinearLayout ll = findViewById(R.id.table_layout); registerForContextMenu(ll); btnFf.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在此处编写查询逻辑(示例:Toast提示) // Toast.makeText(Ss.this, "查询按钮被点击,执行查询操作", Toast.LENGTH_SHORT).show(); } }); // 1清空 - 属性事件响应(XML 按钮需添加 android:onClick="clearByAttribute") // 2清空 - 内部匿名类事件响应 findViewById(R.id.ff_id1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clearFields(); } }); // 3清空 - 监听器接口实现类事件响应 findViewById(R.id.ff_id2).setOnClickListener(new MyClickListener()); // 4清空 - 外部监听器接口实现类事件响应 findViewById(R.id.ff_id3).setOnClickListener(new ExternalClickListener(this)); Button btnBack = findViewById(R.id.btn_back); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Ss.this, Sy.class); startActivity(intent); finish(); } }); } // 1清空对应的属性事件响应方法 public void clearByAttribute(View view) { clearFields(); }//当用户点击按钮就会被执行 // 清空文本框的公共方法 public void clearFields() { if (editId != null) editId.setText(""); if (editName != null) editName.setText(""); if (editAuthor != null) editAuthor.setText(""); } // 内部监听器接口实现类(3清空) private class MyClickListener implements View.OnClickListener { @Override public void onClick(View v) { clearFields(); } } // 外部监听器接口实现类(4清空) @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) { menu.add(0, 1, 0, "删除"); menu.add(0, 2, 0, "修改"); super.onCreateContextMenu(menu, view, info); } @Override public boolean onContextItemSelected(MenuItem item) { if (item.getItemId() == 1) { Toast.makeText(this, "您点击了删除", Toast.LENGTH_LONG).show(); } else if (item.getItemId() == 2) { Toast.makeText(this, "您点击了修改", Toast.LENGTH_LONG).show(); } return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, item1, 0, "关于"); menu.add(0, item2, 0, "退出"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case item1: Toast.makeText(Ss.this, "姓名:骆树涛。学号:2404224132", Toast.LENGTH_SHORT).show(); break; case item2: this.finish(); break; } return true; } } 图书查询界面的ss.XML布局文件代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图书编号" android:textSize="20dp"/> <EditText android:id="@+id/edit_id" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图书名称" android:textSize="20dp"/> <EditText android:id="@+id/edit_name" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图书作者" android:textSize="20dp"/> <EditText android:id="@+id/edit_author" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="中文" android:textSize="20dp"/> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="外文" android:textSize="20dp"/> </RadioGroup> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" android:textSize="20dp"/> <Button android:id="@+id/btn_clar" android:layout_width="wrap_content" android:layout_height="match_parent" android:text="清空" android:textSize="20dp" android:onClick="clearByAttribute"/> <Button android:id="@+id/btn_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回" android:textSize="20dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <Button android:id="@+id/ff_id1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="清空" android:textSize="20dp"/> <Button android:id="@+id/ff_id2" android:layout_width="wrap_content" android:layout_height="match_parent" android:text="清空" android:textSize="20dp" /> <Button android:id="@+id/ff_id3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="清空" android:textSize="20dp"/> </LinearLayout> <TableLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:stretchColumns="*"> <TableRow> <TextView android:text="图书编号" android:textSize="15dp"/> <TextView android:text="图书名称" android:textSize="15dp"/> <TextView android:text="图书作者" android:textSize="15dp"/> <TextView android:text="馆藏地点" android:textSize="15dp"/> </TableRow> <TableRow android:id="@+id/table_layout"> <TextView android:text="1001" android:textSize="15dp"/> <TextView android:text="Android" android:textSize="15dp"/> <TextView android:text="张三" android:textSize="15dp"/> <TextView android:text="5-423" android:textSize="15dp"/> </TableRow> <TableRow> <TextView android:text="查询结果1条" android:textSize="15dp" android:layout_span="4" android:layout_gravity="center"/> </TableRow> </TableLayout> </LinearLayout> 实验六的代码如下 新增Xz.JAVA类代码 import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; public class Xz extends AppCompatActivity { private EditText editBookId; private EditText editBookName; private EditText editBookAuthor; private EditText editBookLocation; public void onResume(){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String size = sp.getString("font_size","25"); EditText syq = findViewById(R.id.edit_book_id); syq.setTextSize(Integer.valueOf(size)); EditText cxq = findViewById(R.id.edit_book_name); cxq.setTextSize(Integer.valueOf(size)); EditText szq = findViewById(R.id.edit_book_author); szq.setTextSize(Integer.valueOf(size)); EditText dfq = findViewById(R.id.edit_book_location); dfq.setTextSize(Integer.valueOf(size)); updateUI(); super.onResume(); } private void updateUI() { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String fontSize = sp.getString("font_size", "15"); int size = Integer.parseInt(fontSize); String textColor = sp.getString("text_color", "#FF000000"); int color = Color.parseColor(textColor); applyStyleToEditText(editBookId, size, color); applyStyleToEditText(editBookName, size, color); applyStyleToEditText(editBookAuthor, size, color); applyStyleToEditText(editBookLocation, size, color); } private void applyStyleToEditText(EditText btn, int size, int color) { btn.setTextSize(size); btn.setTextColor(color); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.xz); editBookId = findViewById(R.id.edit_book_id); editBookName = findViewById(R.id.edit_book_name); editBookAuthor = findViewById(R.id.edit_book_author); editBookLocation = findViewById(R.id.edit_book_location); Button btnAddBook = findViewById(R.id.btn_add_book); btnAddBook.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String bookId = editBookId.getText().toString(); String bookName = editBookName.getText().toString(); String bookAuthor = editBookAuthor.getText().toString(); String bookLocation = editBookLocation.getText().toString(); Intent intent = new Intent(Xz.this, Xq.class); intent.putExtra("bookId", bookId); intent.putExtra("bookName", bookName); intent.putExtra("bookAuthor", bookAuthor); intent.putExtra("bookLocation", bookLocation); startActivity(intent); } }); } } 新增的xz.XML布局文件代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图书编号" android:textSize="20dp"/> <EditText android:id="@+id/edit_book_id" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图书名称" android:textSize="20dp"/> <EditText android:id="@+id/edit_book_name" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="图书作者" android:textSize="20dp"/> <EditText android:id="@+id/edit_book_author" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="馆藏地点" android:textSize="20dp"/> <EditText android:id="@+id/edit_book_location" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <Button android:id="@+id/btn_add_book" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="新增" android:textSize="20dp" android:layout_gravity="center"/> </LinearLayout> 详情Xq.JAVA类代码 import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; public class Xq extends AppCompatActivity { private static final int ITEM_HOME = Menu.FIRST; public void onResume(){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String size = sp.getString("font_size","25"); TextView syqw = findViewById(R.id.tv_book_id); syqw.setTextSize(Integer.valueOf(size)); TextView cxqw = findViewById(R.id.tv_book_name); cxqw.setTextSize(Integer.valueOf(size)); TextView szqw = findViewById(R.id.tv_book_author); szqw.setTextSize(Integer.valueOf(size)); TextView dfqw = findViewById(R.id.tv_book_location); dfqw.setTextSize(Integer.valueOf(size)); super.onResume(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.xq); TextView tvBookId = findViewById(R.id.tv_book_id); TextView tvBookName = findViewById(R.id.tv_book_name); TextView tvBookAuthor = findViewById(R.id.tv_book_author); TextView tvBookLocation = findViewById(R.id.tv_book_location); Intent intent = getIntent(); String bookId = intent.getStringExtra("bookId"); String bookName = intent.getStringExtra("bookName"); String bookAuthor = intent.getStringExtra("bookAuthor"); String bookLocation = intent.getStringExtra("bookLocation"); tvBookId.setText("图书编号:" + bookId); tvBookName.setText("图书名称:" + bookName); tvBookAuthor.setText("图书作者:" + bookAuthor); tvBookLocation.setText("馆藏地点:" + bookLocation); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, ITEM_HOME, 0, "首页"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case ITEM_HOME: Intent intent = new Intent(Xq.this, Sy.class); startActivity(intent); finish(); return true; default: return super.onOptionsItemSelected(item); } } } 详情的xq.XML布局文件代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tv_book_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> <TextView android:id="@+id/tv_book_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> <TextView android:id="@+id/tv_book_author" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> <TextView android:id="@+id/tv_book_location" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> </LinearLayout> 首页Sy.JAVA类代码 import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; public class Sy extends AppCompatActivity { private Button btnAdd; private Button btnSearch; private Button btnSetting; private static final int item1 = Menu.FIRST; private static final int item2 = Menu.FIRST + 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sy); btnAdd = findViewById(R.id.btn_add); btnSearch = findViewById(R.id.btn_search); btnSetting = findViewById(R.id.btn_setting); btnSetting.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Sy.this, SettingsActivity.class); startActivity(intent); } }); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Sy.this, Xz.class); startActivity(intent); } }); btnSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Sy.this, Ss.class); startActivity(intent); } }); } public void onResume(){ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String size = sp.getString("font_size","25"); Button sy = findViewById(R.id.btn_add); sy.setTextSize(Integer.valueOf(size)); Button cx = findViewById(R.id.btn_search); cx.setTextSize(Integer.valueOf(size)); Button sz = findViewById(R.id.btn_setting); sz.setTextSize(Integer.valueOf(size)); String bg = sp.getString("bg","c"); int pic_id = this.getResources().getIdentifier(bg,"drawable","com.example.myapplication"); LinearLayout bg_b = findViewById(R.id.bg_d); bg_b.setBackgroundResource(pic_id); updateUI(); super.onResume(); } private void updateUI() { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); String fontSize = sp.getString("font_size", "15"); int size = Integer.parseInt(fontSize); String textColor = sp.getString("text_color", "#FF000000"); int color = Color.parseColor(textColor); applyStyleToButton(btnAdd, size, color); applyStyleToButton(btnSearch, size, color); applyStyleToButton(btnSetting, size, color); } private void applyStyleToButton(Button btn, int size, int color) { btn.setTextSize(size); btn.setTextColor(color); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, item1, 0, "关于"); menu.add(0, item2, 0, "退出"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case item1: Toast.makeText(Sy.this, "姓名:骆树涛。学号:2404224132", Toast.LENGTH_SHORT).show(); break; case item2: finishAffinity(); break; } return true; } } 首页的sy.XML布局文件代码 <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/bg_d" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="新增" android:textSize="15dp"/> <Button android:id="@+id/btn_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" android:textSize="15dp"/> <Button android:id="@+id/btn_setting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置" android:textSize="15dp"/> </LinearLayout> SettingsActivity.Java设置类代码: import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceFragmentCompat; public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.se); // 加载容器布局 // 加载PreferenceFragment到Activity中 getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); } // 静态内部类:管理设置项的Fragment public static class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { // 从XML文件加载设置项(需创建res/xml/settings.xml) setPreferencesFromResource(R.xml.settings, rootKey); } } } Se.XML布局文件代码: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/content" android:layout_width="match_parent" android:layout_height="match_parent"/> arry.XML的valuse代码: <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 颜色选项 --> <string-array name="color_entries"> <item>黑色</item> <item>红色</item> <item>黄色</item> <item>蓝色</item> </string-array> <string-array name="color_values"> <item>#FF000000</item> <!-- 黑色 --> <item>#FFFF0000</item> <!-- 红色 --> <item>#FFFFFF00</item> <!-- 黄色 --> <item>#FF0000FF</item> <!-- 蓝色 --> </string-array> <!-- 背景图片选项(需在drawable目录准备对应图片) --> <string-array name="bg"> <item>科技</item> <item>书籍</item> </string-array> <string-array name="bg_hhg"> <item>a</item> <item>b</item> <item>c</item> </string-array> </resources> sring.XML的xml代码: <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 字号设置 --> <EditTextPreference android:key="font_size" android:title="字号设置" android:summary="输入文字大小" android:defaultValue="15" android:inputType="number"/> <!-- 颜色选择 --> <ListPreference android:key="text_color" android:title="文字颜色" android:summary="选择文字显示颜色" android:defaultValue="black" android:entries="@array/color_entries" android:entryValues="@array/color_values"/> <!-- 背景图片选择 --> <ListPreference android:key="bg" android:title="首页背景" android:summary="选择首页背景图片" android:entries="@array/bg" android:entryValues="@array/bg_hhg"/> </PreferenceScreen> AndroidManifest.xml代码 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> <meta-data android:name="com.google.android.actions" android:resource="@layout/sy" /> <activity android:name=".Sy" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Xz" /> <activity android:name=".Xq" /> <activity android:name=".Ss" /> <activity android:name=".Cada" /> <!-- 新增:注册设置活动 --> <activity android:name=".SettingsActivity" android:label="设置" android:theme="@style/Theme.AppCompat.Light.DarkActionBar" /> <!-- <activity--> <!-- android:name=".SettingsActivity"--> <!-- android:exported="true"--> <!-- android:label="@string/app_name"--> <!-- android:theme="@style/Theme.MyApplication"/>--> <!-- <intent-filter>--> <!-- <action android:name="android.intent.action.MAIN" />--> <!-- <category android:name="android.intent.category.LAUNCHER" />--> <!-- </intent-filter>--> <!-- </activity>--> </application> </manifest> 内部存储(Internal Storage)的Context中提供了相应的函数对文件进行操作, 实验7:基于文件存储的数据读写 在实验6的基础上,实现基于Android系统文件存储的数据存储功能,具体要求如下: (1)增加一个励志标题添加功能。在首页增加“设置标题”按钮,点击后进入励志标题编辑界面,励志标题文字保存在内部存储的文件中,文件名以开发者自己的姓名拼音命名,例如“zhangsan.txt”。用户打开软件后,标题栏的标题文字从内部文件中读取并显示。 (2)修改图书新增功能。点击“新增”按钮后,用户输入的图书数据存储在外部文件中,文件名以开发者自己的姓名拼音命名,例如“zhangsan.txt”。数据新增完毕后,自动跳到图书查询页面。 (3) 修改图书查询页面。打开图书查询界面后,界面中的那条图书信息从外部文件中读取,并显示在相应的位置。 以上内容的全部代码
06-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值