文档章节

Android开发学习经验总结——0基础自学(持续更新)

Freewheel
 Freewheel
发布于 2015/02/22 03:03
字数 3245
阅读 936
收藏 50
点赞 1
评论 0

更新:写代码的好习惯之一就是重构,写博客也是一样~小弟来整理一下之前写的"shit"                            --- 2016年4月9日

************************************************************************

  我零基础自学Android,总结的一点经验,内容有点杂,见谅~~~

 0. 关于Android studio更新SDK的问题

         入门安卓就幸运地遇上Android studio发布,于是IDE也就选了AS。

        安装AS之后很重要的一步就是下载SDK,那么面对一大列的SDK版本问题来了——下载哪个或者哪些?


       答案:下载最新版的SDK,因为它不仅拥有最新的功能和更新也能兼容之前所有旧版本。我之前逗比地下载了所有4.0以上的版本,然后····占了硬盘30个G空间···


1.如何显示与不显示ActionBar ? 


如果Activity class 继承的是 Activity,无法显示ActionBar

已知的必定显示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值设为trueTouch事件就当做被处理了,不会继续传播;如果设为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;
            }
        });



以上的代码里定义了Onclick的行为显示“Click”的Toast,但是OnTouch里却在ActionDown的时候就return true,所以每次点击事件都不会触发,因为在TouchDown的时候就该Touch事件就已经被消耗不会继续传播。(Click的定义是手指按下后收回)。


补充: 

  父子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(buttonTextViewImageView 等)

补充:

这个对于老手来说太基础了,但用多了也感觉很麻烦,每次都得写一行代码来关联,如果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中的控件(如,CheckBoxPreferenceEditTextPreference等)用以下方法:

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;


在我打算commit and push到GitHub时,出现一些warnings,其中一个提示我这几行代码能够简化,我单击简化后得到以下代码:

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


35.安卓Notification的几个常见难点

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,只需要改变第二个参数


详参:http://developer.android.com/reference/android/content/res/Resources.html#getIdentifier(java.lang.String, java.lang.String, java.lang.String)



(``````````` 感谢收藏这篇文章的朋友们,出于方便搜索考虑,我决定将一些内容分成多篇文章写,在这里只留链接········································································································)


© 著作权归作者所有

共有 人打赏支持
Freewheel
粉丝 8
博文 79
码字总数 48265
作品 0
普陀
程序员
张高兴的 Xamarin.Android 学习笔记:(一)环境配置

  最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多。我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了。...

张高兴 ⋅ 2017/01/13 ⋅ 0

0-2岁的app开发人员必读,Android开发APP前的准备事项

随着移动互联网的兴起,各行各业对移动应用的需求越来越大,从事APP开发的人也越来越多,APP开发行业可以说是方兴未艾。APP开发是比较复杂的事情,涉及产品、美工设计、服务器端开发、Andro...

传授知识的天使 ⋅ 06/06 ⋅ 0

React Native在Android当中实践(五)——常见问题

React Native在Android当中实践(一)——背景介绍 React Native在Android当中实践(二)——搭建开发环境 React Native在Android当中实践(三)——集成到Android项目当中 React Native在A...

YangZC ⋅ 05/28 ⋅ 0

转:一套代码iOS、Android两端运行,Google Flutter意味着什么?

原文:https://www.toutiao.com/a6569388465538990600/?ttfrom=weixin&utmcampaign=clientshare×tamp=1529580533&app=newsarticle&utmsource=weixin&iid=35476649324&utmmedium=toutiao......

鸿蒙无上至尊 ⋅ 前天 ⋅ 0

Android音视频点/直播模块开发

欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录 我们微信公众号:杨守乐 推荐文章: 如果你喜欢上了一个程序员小伙,献给所有的程序员女友 学习资料(干货汇集)不断更新【更新于...

xiaole0313 ⋅ 2017/07/04 ⋅ 0

我的Android重构之旅:架构篇

EF A舞蹈服 去年10月底来到了新公司,刚开始接手 Android 项目时,发现该项目真的是一团遭,项目开发上没有任何架构可言,开发人员连简单的 MVC、MVP 都不了解,Activity 及其臃肿,业务边界...

codeGoogle ⋅ 05/31 ⋅ 0

笔记67 | 记录从android stuido传代码到github的学习过程

前言 github是全球最好的一个管理代码的网站,用于迭代更新项目代码,本片记录学习从android stuido传上传代码到github过程; 准备 需要在你的电脑上安装git版本控制系统。如Git GUI; 在git...

项勇 ⋅ 04/11 ⋅ 0

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

一套代码iOS、Android两端运行,Google Flutter意味着什么?

作者 | 屠敏 一套代码可支持 Android 和 iOS 双端运行,你 Get 了吗? 它就是 Flutter。其目标是为了解决移动中的两个重要问题:一是实现原生应用的性能和与平台的集成,二是提供一个多平台,...

终端研发部 ⋅ 前天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 31分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 40分钟前 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 41分钟前 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 46分钟前 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 今天 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部