一个Android 应用程序由一个或者多个Activity组成,Activity是UI容器,View是最基本的UI类,几乎所有的UI组件都是继承于View而实现的。
在界面布局中,线性布局LinearLayout是一个视图组(ViewGroup)用线性方向来显示其子视图(View)的方式。
相对布局RelativeLayout是一个视图组用相对位置来显示它的子视图元素的方式。
层布局FrameLayout是一个最简单的布局。所有子元素都会固定在屏幕左上角 可以用来实现叠加
TableLayout 是一个视图组用表格来显示它的子视图元素的方式。
还有绝对布局,标签布局(就像一个窗口显示多个网页一样。)
使用桌面组件widget 如 android.widget.Toast ,android.widget.TextView;EditView,
下拉列表控件Spinner:每次只显示用户选择的选项,当再次点击时会弹出列表供用户选择。
-----326---
画廊控件Gallery会生成一个水平列表。每一个列表项就是一张图片预览。用户可以来拖动来切换每个列表项
1、 使用ImageSwitch的控件
2、 需要实现viewFractory接口(在两个视图间转换时显示动画),复写方法makeView,因为是显示图片,所以需要return new ImageView(context);
3、 ImageSwitch需要使用setFactory(传入viewFractory对象)
/res/value/strings.xml
<resourese> 里面存的就是键值对。
装载界面布局的方法。
TableLayout tableLayout = (TableLayout) getLayoutInflater().inflate(
R.layout.login, null);
一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢? 有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢? android.intent.action.MAIN 决定应用程序最先启动的Activity android.intent.category.LAUNCHER 决定应用程序是否显示在程序列表里
intent
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。在SDK中给出了Intent作用的表现形式为:
- 通过
orContext.startActivity()
启动一个Activity;Activity.startActivityForResult()
- 通过
启动一个服务,或者通过Context.startService()
和后台服务交互;Context.bindService()
- 通过广播方法(比如
,Context.sendBroadcast()
,Context.sendOrderedBroadcast()
) 发给broadcast receivers。Context.sendStickyBroadcast()
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle); // it.putExtra(“test”, "shuju”);
startActivity(it); // startActivityForResult(it,REQUEST_CODE);
Android 事件处理
Android提供了两种处理事件的方式,基于回调的事件处理方式和基于监听器的事件处理方式。
Bitmap planeBitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.icon1);
invalidate函数的作用是使整个窗口客户区无效,窗口客户无效即需要重绘。
planeView.invalidate();
// 去掉窗口标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 获取窗口管理器
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
MainActivity.this
.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//修改屏幕方向
MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//需要加权限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
android:configChanges="orientation"
android:configChanges="orientation" 配置后,该事件被你接收了,如果你没有处理这个事件就被丢弃了,
如果没有配置,系统会接收这个事件,然后会重新启动你的应用程序。表示Activity运行时动态修改的系统设置是屏幕方向。
Android 平台不允许Activity中新启动的线程去访问界面组件。这样新启动线程动态修改界面就需要借助Handler消息传递机制。
Activity service broadcastReceiver ContentProvider是Android应用重要的四个组成单元。Android应用的多个Activity组成Activity栈,当前活动的Activity位于栈顶。
所谓事件监听器,其实就是实现了特定接口的JAVA类实例。
在程序中实现事件监听器有以下几种:
内部类形式,外部类形式,Activity作为事件监听类。匿名内部类形式。外部监听器类需要与GUI界面没有耦合才行,如长时间按键发送短信可以用其实现。Activity方式也不是太好因为其主要是负责界面的。所以现在用的最广泛的就是匿名内部类形式。比如为按钮添加的点击事件。"new 监听器接口”或者 new 事件适配器的形式就是用于匿名内部类监听器的形式。还有一种更简单的就是直接在布局文件中为指定标签绑定事件处理方法。
基于回调机制的事件处理方式需要自定义View时重写对象的事件处理函数就可以了。如重写View 的bool onKeyDown(int keycode,keyEvent event)当用户在某个组件上点击时触发该事件。如重载Button并实现onKeyDown函数。
android 最先触发的是绑定在按键上的事件监听器,接着才触发其回调方法,然后会传递给该组件所在的Activity。如果返回true,那么该事件将不会向外传播。
LinearLayout ll = new LinearLayout(ExpandableActivityTest.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
当按下是一直在触发touch触摸屏事件
设置屏幕方向
MainActivity.this.setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
Android要求所有的组件必须进行显式配置(activity service contentprovider broadcastreceiver),在<Application />添加<Activity />子元素即可实现配置。通常配置三个属性name (Activity的实现类) icon label 可指定多个<intet-filter/>元素,用于指定该Activity可响应的Intent
=========================================================================================================================
//启动一个Acvityty
Intent intent = new Intent(MainActivity.this,otherActivity.this);
startActivity(intent);
finish();//关闭一个Activity
Activity的生命周有四种状态:
活动状态:位于前台,可见可获得焦点。
暂停状态:位于前台,可见不能获得焦点。
停止状态:不可见,失去焦点。
销毁状态:结束,所在的Dalvik(Java 虚拟机)进程被结束。
相关的函数分别为:
onCreate onStart onResume onPause onStop onDestory。
Activity 的配置,通信,生命周期。
Intent
Intent 封装了Android应用程序需要启动某个组件的“意图”,不仅如此,Intent还是应用程序间组件的通信媒介。两个Activity可以把需要交换的数据封装成一个Bundle对象,然后使用Intent来携带Bundle对象,这样就实现了两个Activity之间的数据交换。
属性:
属性:Component Action Data Category Extra 六个属性。
其中Action Category只是普通的字符串,Action 表示这个意图所要完成的动作。一个Activity只能有一个Action属性,但可以有多个Category属性。Action用于指定该Activity能响应的Intetn为指定名字的Intent。Category用与给Activity添加额外的附加信息。
动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。
Data属性用来向action提供操作的数据,Type属性则用来指明Data属性的数据类型。
Data接受一个Uri对象,一个Uri对象通常满足如下格式:scheme://host:port/path 如 content://com.android.contacts/contacts/1 省略了port。Intent的Data属性可以在工程文件中配置。
Android 中可以在资源文件中定义数组。
程序保存的参数会在data/data/应用程序包名/shared_prefs下。文件名为<应用程序包名>_preference.xml
eclipse快捷键
ctrl+.和ctrl +1 下一个错误及快速修改
ctrl+F11运行
ctrl+alt+F 快速对齐
1. eclipse软件中编辑区 中字体大小怎么调
window-> preference-> General-> Appearance-> colors and fonts-> Basic把字体调大点
2. eclipse如何自动提示?
打开 Eclipse -> Window -> Perferences -> Java -> Editor -> Content Assist,在右边最下面一栏找到 auto-Activation ,下面有三个选项,找到第二个“Auto activation triggers for Java:”选项
在其后的文本框中会看到一个“.”存在。这表示:只有输入“.”之后才会有代码提示和自动补全,我们要修改的地方就是这里。把该文本框中的“.”换掉,换成“abcdefghijklmnopqrstuvwxyz.”,这样,你在Eclipse里面写Java代码就可以做到按“abcdefghijklmnopqrstuvwxyz.”中的任意一个字符都会有代码提示。
3. eclipse运行程序时报timeout的解决方法
eclipse-->window-->Preferences-->Android-->DDMS-->ADB connection time out(ms) 改大点就好了
4 .Android [error cannot connect to daemon
任务管理器中结束掉adb进程,重新连接即可。
5. Cannot refer to a non-final variable * inside an inner class defined in a different method"错误
在使用Java局部内部类或者匿名内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,在方法中定义的变量时局部变量,当方法返回时,局部变量(str1,str2)对应的栈就被回收了,当方法内部类去访问局部变量时就会发生错误。当在变量前加上final时,变量就不在是真的变量了,成了常量,这样在编译器进行编译时(即编译阶段)就会用变量的值来代替变量,这样就不会出现变量清除后,再访问变量的错误。
6.0 The final local variable xxx cannot be assigned, since it is defined in an enclosing type“
首先这是一个java编译时的错误,翻译成中文是:不可变的局部变量不能被赋值,因为它已经被定义在一个封闭类型中。
解决的办法:将xxx 作一下封装,用集合或者数组,如果xxx是基本数据类型一般用数组。
如:xxx为 String类型的话,
可以封装成 String[] xxx=null;
然后在接下来用到 xxx 变量的地方, 将xxx 写成 xxx[0];
xxx 如果为对象的话,那么可以用集合 将xxx进行封装.....