更新:写代码的好习惯之一就是重构,写博客也是同样~小弟来整理一下以前写的"shit" --- 2016年4月9日 html
************************************************************************ java
我零基础自学Android,总结的一点经验,内容有点杂,见谅~~~ android
0. 关于Android studio更新SDK的问题
git
入门安卓就幸运地赶上Android studio发布,因而IDE也就选了AS。 github
安装AS以后很重要的一步就是下载SDK,那么面对一大列的SDK版本问题来了——下载哪一个或者哪些?
web
答案:下载最新版的SDK,由于它不只拥有最新的功能和更新也能兼容以前全部旧版本。我以前逗比地下载了全部4.0以上的版本,而后····占了硬盘30个G空间···
算法
1.如何显示与不显示ActionBar ? 数据库
若是Activity class 继承的是 Activity,没法显示ActionBar 。 canvas
已知的一定显示ActionBar的就是 ActionBarActivity。 浏览器
另外在style.xml里定义theme对ActionBar的样式也有影响,好比
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
隐藏ActionBar的Java代码
if(getActionBar()!=null){ getActionBar.hide(); } //getActionBar()可能返回的是null,因此须要检查后再hide
1.1. 全屏加无状态栏:
requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
2.OnTouch 方法中的返回值
"True if the listener has consumed the event, false otherwise."
即若是return值设为true,Touch事件就当作被处理了,不会继续传播;若是设为false,就会继续传播当前的Touch事件。
举个栗子:
myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(WeatherHomeActivity.this,"Click",Toast.LENGTH_SHORT).show(); } }); myView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction()==MotionEvent.ACTION_DOWN){ Toast.makeText(WeatherHomeActivity.this,"Touch Down",Toast.LENGTH_SHORT).show(); return true; } return false; } });
补充:
父子View的得到OnTouch事件的问题——如何只让子View获取OnTouch事件,而父View不会获取?(举个栗子:父View是个ViewPager,而子View也有左右滑动的效果)。
答案:
使用requestDisallowInterceptTouchEvent()方法。返回值的效果“True if the child does not want the parent to intercept touch events.”
通常用于自定义的View。
再次补充:
Android 的 View Touch event机制还算有点复杂的,能够参考这个博客
http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html
3. 灰色的小提示框 Toast(超好用,超经常使用)
Toast toast = Toast.makeText(this,"Hello world!",Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER,0,0);//设置显示的位置 toast.show();
补充:
Toast的显示时间只有SHORT和LONG两种选择,可是即便是SHORT的显示时间也感受挺长的,那么如何自定义显示时间?
答案:
用handler计时后主动取消显示
final Toast toast = Toast.makeText(getApplicationContext(), "This message will disappear in half second", Toast.LENGTH_SHORT); toast.show(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { toast.cancel(); } }, 500);
再补充:
在实际应用中,须要看状况使用Toast。由于Toast显示时间较短并且不明显,不适合做为错误反馈,此时使用Alertdialog更合适。
4. findViewById() 用于查找和关联View(button,TextView,ImageView 等)
补充:
这个对于老手来讲太基础了,但用多了也感受很麻烦,每次都得写一行代码来关联,若是View比较多,致使代码显得比较冗杂。用于解决这个问题,有个库很受欢迎——ButterKnife: (谁用谁知道~)
典型的使用方法:
@Bind(R.id.button1) Button button1; @Bind(R.id.button2) Button button2;
不只在Activity中可使用,在fragment甚至是RecyclerView的ViewHolder中也能够,至关便利。
http://jakewharton.github.io/butterknife/
5. Preference的使用
(补充:这是当时看一本书中介绍后写的笔记,但在实际敲代码中彷佛不多使用到这些API)
若是要查找Preference中的控件(如,CheckBoxPreference,EditTextPreference等)用如下方法:
PreferenceManager manager = getPreferenceManager(); CheckBoxPreference password = (EditTextPreference) manager.findPreference("password");
获取Preference中的值使用:
PreferenceManager.getDefaultSharedPreferences(context).getString("user",""); //或者分两步,方便查询同一个Preference中的多个值 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); boolean willMusic = sharedPreferences.getBoolean("music",true); String username = sharedPreferences. getString("user","");
7.Intent
Intent 类一般是做为四大组件间的通讯工具,能够简单地理解成 “信封”。好比从一个Activity进入到另外一个Activity,能够在信封中装入一些信息通知另外一个Activity。
给Intent带上附加值Ertra示例代码:
发送方
Intent i = new Intent(MainActivity.this,OtherActivity.class); i.putExtra("icon",data.icon); startActivity(i);
接收方:
int icon = getIntent().getIntExtra("icon",0);
7.1 发Intent启动Activity并获取返回值
须要使用startActivityForResult方法,而且重载onActivityResult方法 如:
Intent intent = new Intent(MyActivity.this, newActivity.class); int requestCode = 110;//本身定义,在返回结果时用来判断是否本身发出的请求的结果 startActivityForResult(intent,requestCode);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK && resultCode ==110){ int weatherCode = data.getIntExtra("weather_code",-1); ... } }
9. 播放音乐
初始化与播放
MediaPlayer mp= MediaPlayer.create(this,R.drawable.fengyanghuagu);//第二个参数是音乐资源id mp.setLooping(true);//循环播放 mp.setVolume(0.3f,0.3f);//设置音量 mp.start();
mp.stop(); mp.release();
10. 警示对话提示框AlertDialog
10.1 带列表的提示框,点击列表项目启动对应的事件
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Your title") .setItems(new CharSequence[]{"add", "update", "delete"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //which is the index of the items // ... } }) .show();
10.2 带文本提示和按钮的AlertDialog提示框,点击按钮选择发生的事件
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Your title") .setMessage("想继续游戏吗?") .setPositiveButton("肯定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //... } }) .setNegativeButton("回主菜单", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show();
10.3 收起Dialog
dialog.dismiss();
11. 防止手机进入休眠状态
PowerManager.WakeLock wl; wl = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK,"whatever"); wl.acquire();//启动休眠锁 wl.release();//释放休眠锁
更多模式参照 http://blog.csdn.net/airk000/article/details/9121003
13. 关于StringBuilder
StringBuilder buf = new StringBuilder(); //使用StringBuilder制做string(因为要不停地在结尾添加字符,用这个更方便效率更高)
for(int element: puz){ buf.append(element); } return buf.toString();
补充:
后来有一次刷算法题的时候,起初用String 的 + 方法进行加长字符串,结果显示运行时间过长,换成了StringBuilder后,大幅缩减了时间。
14. 短时音效的使用(如枪声,按键音)
SoundPool soundPool; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { SoundPool.Builder builder = new SoundPool.Builder(); builder.setMaxStreams(5); soundPool = builder.build(); }else { soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC,0); } int soundId = soundPool.load(this, R.raw.mie, 1); soundPool.setVolume(soundId,1,1); soundPool.play(soundId,1,1,0,0,1);
中止播放释放资源
soundPool.stop(soundId); soundPool.release();
15. 定义Paint的字体
Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG);//反锯齿画笔 foreground.setStyle(Style.FILL); //充满 foreground.setTextSize(height * 0.75f); //字体大小 foreground.setTextScaleX(width / height); //字体高宽比 foreground.setTextAlign(Paint.Align.CENTER);// 字体居格子中间 FontMetrics fm = foreground.getFontMetrics();// Centering in X: use alignment (and X at midpoint) float x = width / 2;// Centering in Y: measure ascent/descent first float y = height / 2 - (fm.ascent + fm.descent) / 2;
16. 清除以前的Activity 的stack 记录,使返回键没法返回(用于游戏结束收尾)
Intent i = new Intent(sudu_success.this,happyNewYear.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish();
17. 画图
canvas.drawBitmap(happyNY,changeX,changeY,null);
18. 延时
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }
补充:
以上的方法不是很好,由于会致使线程彻底睡眠,没法进行其余的动做。若是只是打算将某个动做延时进行的话,可使用handler的postDelay()方法
19. 多线程
Thread sleeper = new Thread(){ public void run(){ try { sleep(1200); } catch (InterruptedException e) { e.printStackTrace(); } } }; sleeper.start(); try { sleeper.join(); } catch (InterruptedException e) { e.printStackTrace(); }
20. 作混合应用的时候webview 添加JavascriptInterface 后 js掉用方法 出现undefined 调试了一下午终于找到缘由:
在绑定的方法前必定要加
@JavascriptInterface
不然在某些手机(好比红米)的webview中会出现调用方法时undefined的状况
21. Android Studio 的经常使用快捷键 (Mac 和 Windows上略有不一样,坑!)
Alt+回车 导入包,自动修正
Ctrl+P 方法参数提示
Ctrl+X 删除行
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者 )
Ctrl+J 自动代码
Alt+1 快速打开或隐藏工程面板
Alt+ Up/Down 在方法间快速移动定位
F2 或Shift+F2 高亮错误或警告快速定位
ctrl + alt + L 代码自动排版
22. 自定义的View,文字和代码有点多,详见我另外一篇文章——
http://my.oschina.net/Bruce370/blog/385146
23. 使用handler进行计时和操做,文字和代码有点多,详见我另外一篇文章
http://my.oschina.net/Bruce370/blog/385155
24. 改变drawline的线条粗细
setStrokeWidth(float width) 函数
Paint darkPaint = new Paint();//声明画笔 darkPaint.setColor(getResources().getColor(R.color.midnightblue));//设置颜色 darkPaint.setStrokeWidth(5);//设置画笔粗细
25.关于简化代码。
无心中发现Android studio竟然有智能简化代码的功能——
我本来的代码是(请观众原谅个人渣代码):
if (puz[i] != 0) nochange[i % 9][i / 9] = true; else nochange[i % 9][i / 9] = false;
nochange[i % 9][i / 9] = puz[i] != 0;
人生第一次被开发工具鄙视和调戏了···
26. 关于LongClick的调用
收到LongClick的调用后还会调用click吗?
这个要根据LongClick listener的返回值来决定。
lv.setOnItemLongClickListener(new OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { System.out.println("Item LONG clicked. Position:" + position); return false; } });
若是返回false那么click仍然会被调用。并且是先调用Long click,而后调用click。
若是返回true那么click就会被吃掉(consumed),click就不会再被调用了。
27. 关于查看Android的API文件
写一些函数常常得查阅API文档,了解参数和用途什么的,可是发现即便是下载到本地的API文档,用浏览器打开浏览也很卡。刚刚找到的解决办法——禁止浏览器使用Javascript。在全部API的html文档里,都有JavaScript链接到google服务器的一些资源,但在我大天朝访问google是件不容易的事情,所以浏览器会屡次尝试链接并等待回应,因此体验以为很卡。
建议使用FireFox浏览器,禁用和从新开启JavaScript很方便,以下图:
关了以后,浏览起API简直飞快!
后续: 若是一开始就禁用JavaScript,会致使左侧的导航栏没法滚动,没法查看后面的内容
所以,建议先保持开启JavaScript,打开了API的某一页(好比packages.html这页),此时左侧导航栏可以正常滚动。而后禁用JavaScript,而全部后续查看的页面都在新的页面打开。
28. 数据持久化——首选项+内部存储+外部存储+数据库
http://my.oschina.net/Bruce370/blog/419907
29. assets文件夹在android studio中的位置
assets文件夹在android studio中的位置和在Eclipse不同,位于src\main目录下
30. 使用系统的content provider
http://my.oschina.net/Bruce370/blog/420894
自定义的content provider
http://my.oschina.net/Bruce370/blog/420919
31.关于如何使用 Broadcast Receiver
Android发送和接收短信(Broadcast receiver的一个使用例子)
http://my.oschina.net/Bruce370/blog/421769
32.如何侦测EditText的内容变化
--使用addTextChangedListener方法:
input_edittext.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // Log.d("edit_text_change","-------------------- beforeTextChanged-----------------"); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Log.d("edit_text_change","-------------------- onTextChanged-----------------"); } @Override public void afterTextChanged(Editable s) { // Log.d("edit_text_change","-------------------- afterTextChanged-----------------"); if(input_edittext.getText().toString().isEmpty()){ record_button.setBackgroundResource(R.drawable.record_imagebtn); }else { record_button.setBackgroundResource(R.drawable.text_imagebtn); } } });以上代码例子意在实现一个功能——在EditText对象的内容被更改了以后,检测内容是否为空,根据结果对应地设置另外一个按钮的背景图片。(好比QQ聊天输入框为空的时候,右侧按钮为一个麦克风图样,有内容的时候为一个“发送”字样)
33.关于背景选择器selector的易错点
http://my.oschina.net/Bruce370/blog/425936
34.适用于拉伸的特殊图片 nine-patch
http://my.oschina.net/Bruce370/blog/424614
http://my.oschina.net/Bruce370/blog/472117
36. 安卓开发中,动画也是很经常使用的。
http://my.oschina.net/Bruce370/blog/493268
37.安卓开发中枚举的使用。
官方文档说明,安卓开发应避免使用Enum(枚举类),由于相比于静态常量Enum会花费两倍以上的内存...
http://my.oschina.net/Bruce370/blog/499279
38.根据资源名字获取资源ID
好比,有10个String资源分别叫作“关卡1”,“关卡2”...“关卡10”,分别存放了10个关卡的名字。如今须要用遍历的方式将这十个名字找出来(好比在listview里显示),怎么办呢?
for(int i = 1;i < 11; i++){ //获取对应的String资源的ID int strId = context.getResources().getIdentifier("关卡"+i, "string", context.getPackageName()); //取得ID后,天然就方便获取String的内容了 String name = context.getString(strId); ... }getIdentifier()这个方法能够拿全部资源类型的ID,只须要改变第二个参数
(``````````` 感谢收藏这篇文章的朋友们,出于方便搜索考虑,我决定将一些内容分红多篇文章写,在这里只留连接········································································································)