积一时之跬步 , 臻千里之遥程
千里的路程都是从一步一步开始走的,无边无际的江河都是从一条条小溪汇聚而成的!「凡事不是一蹴而就的」。
一分耕耘,一分收获
希望在这里你们能收获到你们想要的。 「共勉」!
文章目录
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(); // 弹出日历对话框时,默认显示 年,月,日
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&¤tVisibleState){ //可见到不可见
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"
效果:按钮边框变得有弧度