期末项目_平院跑腿学习笔记

积一时之跬步 , 臻千里之遥程

千里的路程都是从一步一步开始走的,无边无际的江河都是从一条条小溪汇聚而成的!「凡事不是一蹴而就的」

一分耕耘,一分收获
希望在这里你们能收获到你们想要的。 「共勉」

🍅点击获取项目源码
🍅APP软件 提取码:ffj8
🍅点击查看项目报告

1 系统日历与时间:

时间选择:

Calendar calendar = Calendar.getInstance();
int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY);    //得到小时
int minute  = calendar.get(Calendar.MINUTE);            //得到分钟
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        //  这个方法是得到选择后的 小时、分钟,分别对应着三个参数 —   hourOfDay、minute
        btnTime.setText(""+hourOfDay+":"+minute);
    }
}, hourOfDay, minute, true).show();

在这里插入图片描述

日期选择:

Calendar mcalendar = Calendar.getInstance();     //  获取当前时间    —   年、月、日
int year = mcalendar.get(Calendar.YEAR);         //  得到当前年
int month = mcalendar.get(Calendar.MONTH);       //  得到当前月
final int day = mcalendar.get(Calendar.DAY_OF_MONTH);  //  得到当前日

new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {      //  日期选择对话框
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        //  这个方法是得到选择后的 年,月,日,分别对应着三个参数 — year、month、dayOfMonth
        btnRiqi.setText(year+"年"+(month+1)+"月"+dayOfMonth+"日");
    }
},year,month,day).show();   //  弹出日历对话框时,默认显示 年,月,日

img

2 修改订单信息(EditText点击事件,Spinner显示,RadioGroup显示)

2.1 EditText点击事件,点一次就可触发事件

moneyEt.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            radioGroup.clearCheck();//这里放我写的是清除RadioGroup的选中
        }
        return false;
    }
});

详细了解,菜鸟教程

在这里插入图片描述

2.2 RadioGroup

1…根据数值,找到是哪一个RadioButton,并设置为选中状态

dialogMoneyEt.setText(String.valueOf(goods.getBillMoney()));//从数据库中获取金额,先放到自定义
//得到自定义对话框(根据个人需求,我这里修改数据是放在自定义对话框)
final View DialogView = getLayoutInflater().inflate(R.layout.main_publish_ft,null);
RadioGroup dialogRg = DialogView.findViewById(R.id.money);
//根据值来判断选择的是哪一个RadioButton控件
for(int i = 0 ;i < dialogRg.getChildCount();i++){
    int Rr = 0;
    switch (goods.getBillMoney()){
        case 5:
            Rr = R.id.main_fg_money1;
            break;
        case 10:
            Rr = R.id.main_fg_money2;
            break;
        case 15:
            Rr = R.id.main_fg_money3;
            break;
    }
    //设置按钮为选中状态
    if(dialogRg.getChildAt(i).getId()==Rr){
        RadioButton radioButton = (RadioButton) dialogRg.getChildAt(i);
        radioButton.setChecked(true);
        dialogMoneyEt.setText("");//如果判断成功,按钮设置为选中,自定义编辑区设置为空
        break;
    }
}

2.再设置RadioGroup的点击事件,供其选择

//金额的点击事件
dialogRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId){
            case R.id.main_fg_money1:
                dialogMoneyEt.setText("");
                dialogMoney = 5;
                break;
            case R.id.main_fg_money2:
                dialogMoneyEt.setText("");
                dialogMoney = 10;
                break;
            case R.id.main_fg_money3:
                dialogMoneyEt.setText("");
                dialogMoney = 15;
                break;
        }
    }
});

2.3 Spinner

1.先判断是哪一个值,并将其设置为选中状态

dialogType = getResources().getStringArray(R.array.selectStyle);//获取array中定义的值
for(int i = 0;i<dialogType.length;i++){
    if(goods.getBillType().equals(dialogType[i])){//判断是否相等,相等则将他设置为选中
        dialogSpinner.setSelection(i);//设置spinner为选中状态
    }
}

2.可以重新选择spinner的值

//Spinner下拉点击事件
dialogSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l)                       {
        dialogGoods.setBillType(dialogType[i]);//点击哪一个就将它存储到某个对象中
    }
    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
    }
});

3 关于Fragment的生命周期

初次加载,onHiddenChanged() 调用于 onResume()之前。

onHiddenChanged() 针对于一个 Activity 包含多个 Fragment 而言
例:当一个 Activity 中包含多个 Fragment 时,通过选择器切换Fragment 不会调用 onResume(),只会调用 onHiddenChanged()

onResume() 针对于多个 Activity 而言
换言之,只有当包含此 Fragment 的 Activity 从onPause() 到 onResume()时,此 Fragment 才会调用 onResume()

例:

/*同级的fragment之间跳转会调用此方法  hidden=false*/
@Override
public void onHiddenChanged(boolean hidden) {
    // TODO Auto-generated method stub
    super.onHiddenChanged(hidden);
    if (v != null && !hidden) {
        showquery();//刷新数据
    }
}

4 activity向内部的fragment传递数据

4.1 使用get、set方法

在activity中

private Customer customer;//对象
public Customer getCustomer() {
    return customer;
}

public void setCustomer(Customer customer) {
    this.customer = customer;
}

fragment中,使用fragment生命周期中的onAttach方法,获取数据

/*获取传递的数据:登录用户的id*/
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    CustomerId = ((MainActivity) getActivity()).getCustomer().getId();
}

5 ListView中按钮数据回传

例:具体点击的是哪一个list中抢单的按钮

在这里插入图片描述

使用接口处理

第一步 写一个接口,CallBackInterface:

/*ListView每个中list中的某个按钮的数据回调*/
public interface CallBackInterface {
     void callBackClick(View view);
}

第二步 在订单的界面继承此接口,并重写里面的方法

public class Main_Grab_Fragment extends Fragment implements CallBackInterface {
    public void callBackClick(View view) {
       
    }
}

第四步 在适配器中传入this

allAdapter = new Bill_Fragment_AllAdapter(billList, this);

第五步 适配器

class Bill_Fragment_AllAdapter extends BaseAdapter implements View.OnClickListener {

    private CallBackInterface mCallBackInterface; //回调接口
    List<Goods> mDatas;

    public Bill_Fragment_AllAdapter(List<Goods> mDatas, CallBackInterface mCallBackInterface) {
        this.mDatas = mDatas;
        this.mCallBackInterface = mCallBackInterface;
    }
}

setTag(position);//标识位置

/*抢单按钮的点击事件*/
holder.recevice.setOnClickListener(this);
@Override
public void onClick(View v) {
    mCallBackInterface.callBackClick(v);
}
holder.recevice.setTag(position);//标识位置

第六步 在订单的界面继承此接口的重写方法里面 position = (Integer) view.getTag();获取位置

public void callBackClick(View view) {
    int position = 0;
    switch (view.getId()) {
        case R.id.main_recevice:
            position = (Integer) view.getTag();
            int id = billList.get(position).get_id();//单子id
            int billId = billList.get(position).getBillId();//发单人Id
            if(billId!=CustomerId){
                int i = DBManager_Goods.updateState(id, DBUtils_Goods.CONDUCT, CustomerId);
                if(i>0){
                    showquery();//查询操作
                    allAdapter.notifyDataSetChanged();//刷新适配器
                    Toast.makeText(getActivity(),"抢单成功!!!",Toast.LENGTH_SHORT).show();
                }
            }else {
                Toast.makeText(getActivity(),"此订单为自己发布,不能进行抢单",Toast.LENGTH_SHORT).show();
            }
            break;
        case R.id.item_main_content1:
            break;
    }
}

6 activity+fragment+ViewPager数据更新

例:外层fragment(首页,订单,我的)之间切换,内层fragment(已发单,已接单),再内层ViewPager数据更新
在这里插入图片描述

订单的fragment:

//主Fragment之间切换,子类Fragment刷新
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (!hidden) {
        msgRed();
    }
}
public void msgRed() {
    if (billFragment != null && !billFragment.isHidden()) {
        billFragment.onHidden(); // showquery()为列表加载数据的那个方法
    }
}

订单中的已发单fragment:

// 刷新数据
public void onHidden(){
    onHiddenChanged(true);
}
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    ///< 由于父Fragemnt没有重新创建View,因此只能通过该方式主动调用子碎片的生命周期
    if (null != getCurrentFragment()){
        fragment.queryAll();
    }
}
/**
 * 获取当前的Fragment
 * @return
 */
Fragment getCurrentFragment() {
    if (null == viewPager){
        return null;
    }
    FragmentManager manager = getChildFragmentManager();
    final int currentItem = viewPager.getCurrentItem();
    fragment = (Order_Bill_Fragment_All) manager.findFragmentByTag("android:switcher:" + R.id.bill_viewpager + ":0");
    return fragment;
}

已发单中的全部(viewPager),setUserVisibleHint方法高于fragment一切生命周期

boolean isViewCreated = false; //根布局是否已经创建
boolean currentVisibleState = false;  //当前view可见状态
/*这个方法是只要在当前Fragment,都会被调用的方法*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isViewCreated){//根布局是否已经创建
        if (isVisibleToUser&&!currentVisibleState) {       //不可见到可见
            dispatchUserVisibleHit(true);
        }else if(!isVisibleToUser&&currentVisibleState){  //可见到不可见
            dispatchUserVisibleHit(false);
        }
    }
}
//分发Fragment可见事件
private void dispatchUserVisibleHit(boolean b) {
    if(currentVisibleState == b){
        return;
    }
    currentVisibleState = b;
    if(b){
        queryAll();//在此界面,查询数据并加载
    }else {

    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if(v==null){
        v = inflater.inflate(R.layout.order_bill_all_ft, container, false);
    }
    listView = v.findViewById(R.id.lv_bill_all);
    isViewCreated = true;
    if(getUserVisibleHint()){
        dispatchUserVisibleHit(true);
    }
    return v;
}

@Override
public void onPause() {
    super.onPause();
    if(currentVisibleState&&getUserVisibleHint()){
        dispatchUserVisibleHit(false);
    }
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    isViewCreated=false;
    currentVisibleState = false;
}

7 CardView的简单使用(类似于卡片的效果)

在这里插入图片描述

<android.support.v7.widget.CardView
    android:id="@+id/item_bill_all_cv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="3dp"
    app:cardCornerRadius="10dp"
    app:cardElevation="5dp"
    app:contentPadding="10dp">
        <!--添加自己的布局-->
</android.support.v7.widget.CardView>

在这里插入图片描述

  • cardBackgroundColor 设置背景色
  • cardCornerRadius 设置圆角大小
  • cardElevation 设置z轴阴影
  • cardMaxElevation 设置z轴最大高度值
  • cardUseCompatPadding 是否使用CompadPadding显示阴影效果,默认为false
  • cardPreventCornerOverlap 是否使用PreventCornerOverlap这个属性为了防止内容和边角的重叠,默认为true
  • contentPadding 内容的padding (Left,Top,Right,Bottom) 内部边距,子View与CardView的距离
  • app:cardMaxElevation //最大阴影大小,该值最小2px

8 Selector的简单使用

常用属性

  • android:state_selected选中
  • android:state_focused获得焦点
  • android:state_pressed点击
  • android:state_enabled设置是否响应事件,指所有事件

1.在drawable中新建资源文件,例(main_menu_text.xml)

在这里插入图片描述

根据不同的目的,使用不同的item属性,这里使用的是颜色

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/text_yellow" android:state_checked="true" />
    <item android:color="@color/text_gray" />
</selector>

2.在布局文件中 使用main_menu_text.xml定义好的样式(点击的时候变化)

android:textColor="@drawable/main_menu_text"

9 shape的简单使用

点击查看详细属性

(类似于上一条)

1.在drawable中新建资源文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 设置透明背景色 -->
    <solid android:color="@null" />

    <!-- 设置一个黑色边框 -->
    <stroke
        android:width="2px"
        android:color="#000000" />
    <!-- 设置四个圆角的半径 -->
    <corners
        android:bottomLeftRadius="150px"
        android:bottomRightRadius="150px"
        android:topLeftRadius="150px"
        android:topRightRadius="150px" />
    <!-- 设置一下边距,让空间大一点 -->
    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />
</shape>

2.在布局文件中 使用

android:background="@drawable/txt_border"

效果:按钮边框变得有弧度
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mylife0506

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值