标签:
2015-05-02
----曾经看过的现在忘记的也差不多了,于是才终于发现,只有认真做笔记才能更好的掌握。
如果不是因为迫于生计,没有人会去用java。——许多程序员
(吐槽结束)
站在应用层进行开发,且在没有时间,大作业deadline就要到了的情况下,熟悉API,有一个好的API查阅习惯是最需要的。而且熟悉API是学习语言最为根本,不会因语言过时而丢失的好处。
所用IDE为Android studio。
Android studio下载各版本API稍有难度,我现在电脑上仅有version21,该问题我必须尽快解决。
1. 项目目录结构
新建一个空项目,自己建一遍项目目录,个人感觉是一种不错的学习方法。
需要重视的有
Android studio隐藏了不少无关内容,但我们需要知道,任何一个资源都赋给了一个唯一的资源ID放在一个文件中。生成的apk调试程序也在一个被项目表隐藏的文件夹中存放。第三方Jar包在Android studio中需要自行创建目录文件。
2. LogCat
相当于cout,system.out.println,print,printf等输出语句,用于调试。
Log.e()是Android程序开发专用的一种简单且最有用的调试手段。且勿利用system.out调试。
以Log.e()为例,其接受两个参数,第一个为tag,用于filter过滤,第二个是打印的信息,用于判断错误原因。
3. 基本流程
1.) 在java目录下新建一个(java).class文件,继承Activity,重写onCreate()方法。
重写时首先super调用父类方法用默认实现进行初始化。
2.) 在layout目录下新建(layout).xml文件,初期学习选择LinearLayout。布局的基本参数有
orientation,layout_width,layout_height,默认的scheme。
总体布局结束后添加其他组件,不建议利用图形的界面进行编辑,不利于理解,也不利于在java类文件中对布局进行操作。
值得注意的有两点
尽量将xml布局文件中的字符串保存在res->string中去。有利于后期修改。
注意将每一个控件添加名字,便于在java类文件中引用。
3.) 在AndroidManifest注册。在application下添加activity,利用intent-filter将其设置为主activity。activity的参数有name和label。name是java类文件名称,label是显示的app名称。安装包名称才是建项目时确定的名称。
4. 更进一步
可以延伸的部分
1. Toast提示
Toast.makeText(FirstActivity.this, "first", Toast.LENGTH_LONG).show();
其中的FirstActivity.this即为context,即toast发生的环境。
2. 隐藏标题栏
1 protected void onCreate(Bundle saveInstanceState) { 2 super.onCreate(saveInstanceState); 3 requestWindowFeature(Window.FEATURE_NO_TITLE); 4 setContentView(R.layout.first); 5 }
第三行即为隐藏标题栏代码。
3. 添加Menu
1.) res下新建menu文件夹,在menu下新建XML文件。对其进行配置。
1 <?xml version="1.0" encoding="utf-8"?> 2 <menu xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item 4 android:id="@+id/item1" 5 android:title="@string/menu1"/> 6 <item 7 android:id="@+id/item2" 8 android:title="@string/menu2"/> 9 </menu>
menu利用的是默认主题,有两个item,title和id分别定义显示名字和操作的名字。对应的每一个ID都会生成一个唯一的资源操作符。在java类文件中可以用findViewById()方法找到。并向下转型进行操作。
2.) 在需要加入菜单的activity的java类文件中重写onCreateOptionsMenu()方法
1 public boolean onCreateOptionsMenu(Menu menu) { 2 getMenuInflater().inflate(R.menu.main, menu); 3 return true; 4 }
通过getMenuInflater()方法能够得到MenuInflater对象。用inflate()方法可以给当前活动创建菜单。
inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单。第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中。然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。
3.) 对选定菜单项进行操作,重写onOptionsItemSelected()方法。
1 @Override 2 public boolean onMenuItemSelected(int featureId, MenuItem item) { 3 switch (item.getItemId()){ 4 case R.id.add_item: 5 6 case R.id.remove_item: 7 8 default: 9 10 } 11 return true; 12 }
传入的item即为菜单项的view,利用switch将view的id与R.java中资源的ID进行对比来判断对谁进行操作。
4. 销毁活动
利用finish();即可销毁一个活动。
5. 建设多个activity
仅需写多个java类文件,每个类文件对应一个单独的layout文件,注意其中的变量名称,不能有重复。分别写完后在AndroidManifest.xml中进行配置,只需要
1 <activity android:name=".SecondActivity"> 2 </activity>
即可完成一个非主activity的基本配置。
5. Intent实现的activity切换与通信。
Intent一般可被用于启动活动、启动服务、以及发送广播等场景。同时,其也可以进行一些数据的传递。
显式intent:
intent的构造函数有多个。先说一个与activity切换关系很大的:
Intent(Context packageContext, Class<?> cls);
第一个与前面toast的首个参数含义相同,指目前的环境。即当前的java.this。第二个是启动的类文件名。
1 button1.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 5 startActivity(intent); 6 } 7 });
用startActivity判断打开新的activity。
用起来十分简单。
隐式intent:
隐式的intent是利用匹配intent传入的信息与AndroidManifest内的信息来确定显示的activity的。
1 button1.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 Intent intent = new Intent("MY_OWN"); 5 startActivity(intent); 6 } 7 });
当一个activity的intent-filter内的action与category,和java文件中intent传入的信息相同时,activity就会打开。
上面的代码中传入的是“MYOWN”,对应的配置情况为
1 <activity android:name=".SecondActivity"> 2 <intent-filter> 3 <action android:name="MY_OWN"/> 4 <category android:name="android.intent.category.DEFAULT"/> 5 </intent-filter> 6 </activity>
default对应的是默认情况。
也可以通过addCategory()方法来改变添加分类。例如:
1 Intent intent = new Intent("MY_OWN"); 2 intent.addCategory("MY_CATEGORY");
此时若直接调试,会报错。因为没有任何一个完全符合要求的activity。除非更改配置的category信息:
1 <activity android:name=".SecondActivity"> 2 <intent-filter> 3 <action android:name="MY_OWN"/> 4 <category android:name="MY_CATEGORY"/> 5 </intent-filter> 6 </activity
还有很多隐式的用法。
1 public void onClick(View v) { 2 Intent intent = new Intent(Intent.ACTION_VIEW); 3 intent.setData(Uri.parse("http://www.cnblogs.com/xtlu/")); 4 startActivity(intent); 5 }
其中Intent.ACTION_VIEW是一个常信息,匹配后利用setData中的内容请求其他应用的操作。
setData的用法就是另外的故事了。Data属性可以在接受该隐式intent的activity的intent内进行配置。常见的参数有scheme,host,port,path,mimeType。用IDE打出首字母即可查找并查阅文档。
类似的还有很多,上面的可以打开网页,利用Intent.ACTION_DIAL还可以打开拨打电话页面。不再赘述。
数据传递intent:
我只是随便起的名字。)
数据可以传递过去,也可以传递回来。
从当前activity传递数据,利用
1 intent.putExtra("data", data);
其中"data"是key,data才是数据。若data为string类型,则接受data的activity内可以这样写:
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.second_layout); 4 Intent intent = getIntent(); 5 String data = intent.getStringExtra("data"); 6 }
写在onCreate()方法内,直接调用。用getIntent()方法取出上次传入的intent,getStringExtra()用于取string类型的data。所需参数为key。
传回数据所用的start方法不同。利用startActivityForResult()启动新的activity。
1 public void onClick(View v) { 2 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 3 startActivityForResult(intent, 1); 4 }
第二个参数为请求码,先不要着急它的意思。
在第二个activity中发送数据的过程:
1 button2.setOnClickListener(new OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 Intent intent = new Intent(); 5 intent.putExtra("data_return", "Hello FirstActivity"); 6 setResult(RESULT_OK, intent); 7 finish(); 8 } 9 });
创建空的intent仅用来发送数据。setResult第一个参数返回处理结果,第二个即为intent事件。
不要着急第一个返回的处理结果的意思。
请求码和处理结果都在接受信息的时候有用。
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3 switch (requestCode) { 4 case 1: 5 if (resultCode == RESULT_OK) { 6 String returnedData = data.getStringExtra("data_return"); 7 } 8 break; 9 default: 10 } 11 }
即对应的requestcode(请求码)和resultcode(处理结果)都有一一对应的在接受信息方的处理方式。
返回值得过程也可以放在onBackPressed()中,这样不需要手动finish(),按back键也可返回。
标签:
原文地址:http://www.cnblogs.com/xtlu/p/4472276.html