BNJ项目学到的知识点
Contents
6. 2015-09-23 13:14:20 7. 2015-09-23 13:14:20 8. 2015-09-25 10:47:40 9. 2015-09-30 17:57:46 10. 2015-10-01 09:01:47 11. 2015-10-02 15:37:41 12. 2015-10-03 10:33:48 13. 2015-10-13 10:22:08 14. 2015/11/5 16:49:38 15. 2015/11/16 23:03:01 15.1. getParentFragment()不是获取当前Fragment,获取当前Fragment直接用 Fragment.this 16. 2015/11/25 22:39:31 17. 2015/12/2 11:10:21 18. 2015/12/2 9:30:29 19. 2015/12/2 15:25:27 20. 2015/12/3 17:10:53 21. 2015/12/8 9:35:56 22. 2015/12/8 11:24:29 23. 2015/12/18 9:21:45
2015-09-14
如何解决多个按钮同时点击的bug
- 定义一个全局变量isClick。
- 在switch的每个case里判断isClick,执行完 设置isClick为false。
重写Activity的onResume方法,设置isClick为true。
将程序设置成无标题栏,自己定义Actionbar
- 创建一个布局文件,里面只有一个RelativeLayout 设置高度为45-50.设置背景。
- 每个布局文件都加入上面那个布局文件,代码如下。
<include
android:id="@+id/action_bar"
layout="@layout/common_view_actionbar_right_text" />
- 跳转页面时来通过putExtra设置相应的的标题即可
2015-09-10
设置EditText默认不弹出小键盘
Activity里配置下列代码
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
–
配置文件中配置下列代码
android:windowSoftInputMode="adjustUnspecified|stateHidden"
2015-09-15
复制布局文件时,有自定义view,要注意改其包名。
2015-09-16
如何将Activity的数据传到Fragment(解决Activity传值到Viewpager的Fragment里面)
- 在Fragment里创建一个静态方法,用于创建Fragment,参数为Activity所要传的参数。
- 在上述方法中,fragment对象调用setArguments方法设置值。
在onCreate方法中 通过get方法获取该值。
代码如下:
private int schoolId; public static TeacherFragment newInstance(int schoolId) { Bundle args = new Bundle(); args.putInt("schoolid", schoolId); TeacherFragment fragment = new TeacherFragment(); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = getArguments(); schoolId = args.getInt("schoolid"); }
2015-09-17
一般修改完信息之后,需要回调设置数据(在onActivityResult中设置显示)
2015-09-23 13:14:20
时间戳
- 时间戳转date
long = 1442985320;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Long time = new Long(long);
Date date = new Date(time);
tvMybirth.setText(sdf.format(date));
//合起来写
String date = sdf.format(new Date(long));
- date转时间戳
String strDate = dpBirth.getYear() + "-" + (dpBirth.getMonth() + 1) + "-" + dpBirth.getDayOfMonth() + "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = sdf.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
//获取时间戳
birthday = date.getTime();
年月日转时间戳
public static long getTimestampByDate(int year, int month, int day) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String strDate = year + "-" + month + "-" + day; Date date = null; try { date = sdf.parse(strDate); } catch (ParseException e) { e.printStackTrace(); } return date.getTime(); }
实际开发:
- 服务器下发一串String的日期 例如 20151106 ,要显示成2015年11月06日
思路:将String转成Date,再用date转成其他
将String转Date
Date date = new SimpleDateFormate("yyyyMMdd").parse("20151106");
再用Date转成自己想要的格式
String msg = new SimpleDateFormate("yyyy年MM月dd日").format(date.getTime());
2015-09-23 13:14:20
DatePicker 初始化日期
dp.init(2015,09,11,null);
2015-09-25 10:47:40
TextView显示字数限制必须小于服务端的字数限制
2015-09-30 17:57:46
获取屏幕分辨率的宽高
int height = getResources().getDisplayMetrics().heightPixels;
int width = getResources().getDisplayMetrics().widthPixels;
2015-10-01 09:01:47
震动和声音
震动:
Vibrator vib = (Vibrator) context.getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(500);
声音:
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer player = new MediaPlayer();
player.setDataSource(context, alert);
final AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) != 0) {
player.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
player.setLooping(false);
player.prepare();
player.start();
}
2015-10-02 15:37:41
版本更新实际开发
2015-10-03 10:33:48
setEnable、setClickable的区别
setEnable 可以实现取按钮不能点击
setClickable 由于setOnClickListener会改变其属性,所以设置无效。不建议使用。
2015-10-13 10:22:08
Application的理解
Application 用于保存整个应用程序的全局变量。可以初始化一些配置。例如网络配置、工具配置等。
BNJ中的用处:
初始化用户的信息、机构的信息、网络配置 以及创建Global
2015/11/5 16:49:38
请求不同类别的同一数据,数据下拉加载后,必须要将请求页置1
BNJ项目中复现步骤:
我的机构->切换机构A(数据超过10条)->下拉刷新->切换机构B(数据只有5条)->报数据为空的错误。
原因:机构B只有5条数据,而你请求了第二页的数据。
解决办法:切换页面时,请求页置1
2015/11/16 23:03:01
二维码扫描功能开发
下载库
compile 'com.journeyapps:zxing-android-embedded:3.0.3@aar'
compile 'com.google.zxing:core:3.2.0'
github地址
- 创建一个Activity继承CaptureActivity(示例ScanActivity)。
MainFest注册该Activity
<activity android:name=".find.ScanActivity" android:screenOrientation="fullSensor" //控制显示竖屏还是横屏,默认取决手机放置方式 android:stateNotNeeded="true" android:theme="@style/zxing_CaptureTheme" android:windowSoftInputMode="stateAlwaysHidden"></activity>
确定点击跳转的Button所处的页面是Activity还是Fragment
Activity
IntentIntegrator integrator = new IntentIntegrator(this);
Fragment
IntentIntegrator integrator = IntentIntegrator.forFragment(CurrentFragment.this); IntentIntegrator integrator = IntentIntegrator.forSupportFragment(CurrentFragment.this);
配置参数并且跳转Activity
integrator.setCaptureActivity(ScanActivity.class);//不调用此方法,无法改变扫描为竖屏,设置创建的Activity integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES); 设置识别码的类型(见最下方) integrator.setOrientationLocked(false);//设置扫描框是否跟随手机放置而变化 false 为横竖屏,true竖屏 integrator.setCameraId(0); // Use a specific camera of the device integrator.setPrompt("what the fuck"); //设置扫描识别码时,显示的文字提示。 integrator.setBeepEnabled(false); //设置无声音 integrator.setBarcodeImageEnabled(true); //讲扫描的识别码传入到intent中 integrator.initiateScan(); //启动跳转
- 重写onActivityResult方法
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);//获取识别内容
if (result != null) {
if (result.getContents() == null) {
//扫描取消的处理
} else {
//对扫描结果的处理
Functions.toast(getActivity(), "扫描结果:" + result.getContents());
}
} else {
Log.d("MainActivity", "Weird");
// This is important, otherwise the result will not be passed to the fragment
super.onActivityResult(requestCode,resultCode,data);
}
}
- 识别码类型
* ONE_D_CODE_TYPES 条形码
* QR_CODE_TYPES 二维码
* ALL_CODE_TYPES 扫描各种码
* PRODUCT_CODE_TYPES 产品码
####图一
####图二
getParentFragment()不是获取当前Fragment,获取当前Fragment直接用 Fragment.this
例子:
btn_test_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentIntegrator integrator = IntentIntegrator.forSupportFragment(MineFragment.this);
}
});
2015/11/25 22:39:31
EditText 只读内容滚动
setKeyListener(null);
2015/12/2 11:10:21
底部tags check效果设置
选中的设置 checked、selected属性
默认的 不用设置属性,一定要放到最后面!
<item android:state_selected="true" android:drawable="@drawable/teach_kq_selected_large" />
<item android:state_checked="true" android:drawable="@drawable/teach_kq_selected_large" />
<item android:drawable="@drawable/teach_kq_button_disable_bg_shape" />
还需要设置默认第一个tag为红色。
在Activity中通过setSelected()方法设置为红色。
在点击事件里,设置其他button为灰色
代码如下:
@Override
public void onClick(View v) {
if(index == 0){
btn1.setSelected(true);
btn2.setSelected(false);
.
.
btn10.setSelected(false);
}
}
2015/12/2 9:30:29
Checkbox实际开发
ListView里面有Checkbox,item点击事件会失效
解决办法 —— Checkbox加入下面属性
android:clickable="false" android:focusable="false" android:focusableInTouchMode="false"
- 准备两张图,分别是选中和未选中的图。
- 通过上述两张图制作一个selector。(看上面)
创建一个HashSet
集合checkSet,用于保存已选中的item。 private HashSet<CouponInfo> checkedSet = new HashSet<>();//记录选中的图片信息
在AdapterItem点击事件里通过判断该集合checkSet是否含有某个info来设置选中/取消选中。
if (checkedSet.contains(info)) { checkedSet.remove(info); holder.cbCoupon.setChecked(false); Functions.toast(CouponActivity.this,"取消选择"+i); } else { checkedSet.add(info); holder.cbCoupon.setChecked(true); Functions.toast(CouponActivity.this,"选中"+i); }
处理Adapter里的Checkbox,将checkSet集合里的item设置为true,用于初始化一开始的数据
if (checkedSet.contains(info)) { holder.cbCoupon.setChecked(true); } else { holder.cbCoupon.setChecked(false); }
2015/12/2 15:25:27
去除字符串最后一个字符
str.substring(0,str.length()-1));
2015/12/3 17:10:53
Gson实体不能有重复的字段出现
示例
父类有status,子类又声明了status
2015/12/8 9:35:56
多次请求导致后面请求无效的bug
为请求设定请求flag,请求后修改flag,请求成功后修改flag
示例 - 修改密码
if (REQ_FLAG == CommonString.REQ_STATUS_YES) { reqModifyPSW = ApiBizProtocol.onUpdatePassword(ModifyPSWActivity.this, oldPSW, newPSW_confirm, ModifyPSWActivity.this); REQ_FLAG = CommonString.REQ_STATUS_NO;//请求后修改flag }
@Override
public void onGeneralSuccess(String result, long flag) {
REQ_FLAG = CommonString.REQ_STATUS_YES; //请求成功后修改flag
}
2015/12/8 11:24:29
写完点击事件还不能点击的bug
原因
View没被初始化
2015/12/18 9:21:45
进入页面处理完后回调的方法
重新请求(大量数据)
* 适用于大量数据变化 * ListView有时间顺序(例如个人经历、成果分享)
onActivityResult(个别数据)
回调删除某一项,