这几天被一些功能折磨的要死了,于是放下了这个,看点其它的东西,算是转移一下焦点。床头放了不少书籍,也都被翻阅过,翻阅过,却不曾细细的品味过,俗话说,书可借而不可买也,这话用到自己的身上丝毫不错。
因为是自己的书,所以看的不是那么的仔细,那么的认真,总觉得有的是机会,殊不知,这是一种病,一种正在侵蚀自己的病,不知道我此时醒悟,算不算是为时已晚。

从来没有仔细过,认真过,书中的东西也都草草而过,似懂非懂,而不深入,细节就这样被忽视,书的味道往往就藏在这些细腻而不起眼的文字中。这两天因为烦躁就看了下Android的东西,将自己的一些想法写下来,与大家分享。

关于view

View是什么了,view就像一个画板,让我们用自己的画笔在上面进行涂鸦。 其实说白了,View就是一个矩形区域并且负责界面绘制和事件处理,我们可以在这个区域上定义自己的控件。在Android中,View的生成往

往是通过布局文件来创建的,比如在继承Activity的类的onCreate里面使用setContentView方法来载入一个在xml里定义好的界面.Android的布局文件可以有很多个,很多的时候需要动态的载入,比如对于

PopupWidnow这对象来说,它显示的内容往往是动态载入的,LayoutInflater这个的作用就是如此。在Android可以用LayoutInflater inflater = LayoutInflater.from(context)和getSystemService

(Context.LAYOUT_INFLATER_SERVICE)获取。获取到LayoutInflater之后,然后调用inflate方法把一个没有被载入,或者想要动态载入的界面显示出来。
其实不管是setContentView()还是LayoutInflater.from()从源码中能够看出它们都是调用getSystemService()方法。获取到了View,那么如何将其显示出来了,稍微有点编程概念的人都知道,是需要通过Draw的,

这个是一个很复杂的过程,我也说不清,推荐一篇博客:http://www.incoding.org/admin/archives/179.html

关于Context

如果动态的创建一个控件,可以发现构造函数中有Context这个参数,Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄,Context提供

了关于应用环境全局信息的接口,控制着生命周期,Activity、Service以及BroadcastReceiver都是直接或者间接的继承了这个接口,所以在Activty中 传递的this往往指的是Context,不同的Context,生命周期是

不一样的,如getApplicationContext()取的是这个应用程序的Context,Activity.this取的是这个Activity的Context,这两者的生命周期是不同的,前者的生命周期是整个应用,后者的生命周期只是它所在的

Activity。比如Toast.makeText方法的第一个参数就是Context,一般在Activity中我们直接用this代替,该是属于一个Activity的,在Activity销毁的时候它也就销毁了,不会再存在;但是,如果传入

this.getApplicationContext(),就表示它的生命周期是整个应用程序。关于Context的更多信息请看:http://blog.csdn.net/qinjuning/article/details/7310620

关于BaseAdapter

适配器,对NET开发的熟悉的童鞋对Adatper这个应该是非常了解的,在数据库访问的时候,往往是得到Adapter,然后调用Dataset的Fill方法将数据放到Dataset中,Android中也有很多的Adapter,这个的汉语意思是

适配器,从我自己的角度去理解,我觉得这个应该叫做数据适配器,因为这个Adapter是带了一定的数据,并且负责将该数据按照一定的方式组织起来,也就是规定了数据的显示方式。

这里我想到了一个词语,数据模板,这也是WPF中提到的,数据模板就是定义了数据是如何显示的,BaseAdapter是所有Adatper的基类,通过重写里面的getView方法里面就对获取的数据进行设置,下面是程序中的一

个:

@Override
public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder holder;
if (convertView==null) {
convertView=LayoutInflater.from(context).inflate(R.layout.group_item_view, null);
holder=new ViewHolder();
holder.groupItem=(TextView) convertView.findViewById(R.id.itemText); convertView.setTag(holder); }
else{
holder=(ViewHolder) convertView.getTag();
}
holder.groupItem.setTextColor(Color.BLACK);
holder.groupItem.setText(list.get(position)); return convertView;
} static class ViewHolder {
TextView groupItem;
}

在这里我遇到了一个问题,就是我这个方法只循环了一次,也就是只显示list数组中的第一条数据,找了半天的原因,总算是雨过天晴,有种拨开云雾见太阳的感觉,原因是布局的,我在布局中添加了一个背景图片

,图片过大,导致只能显示第一条,此外我用的是线性布局,该布局的大小好像是根据里面所容纳的内容动态调整,当将背景图片去掉后,就没问题了。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/guide01"
android:orientation="vertical"
> <TextView
android:id="@+id/itemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:paddingLeft="12dp"
android:paddingRight="5dp"
android:paddingTop="0dp" /> </LinearLayout> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
> <TextView
android:id="@+id/itemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:paddingLeft="12dp"
android:paddingRight="5dp"
android:paddingTop="0dp" /> </LinearLayout>

跟多信息请看:http://biancheng.dnbcw.info/shouji/372542.html

关于布局和Code-behind

布局,就像入眼的美女,系统能否得到用户的任何,界面一看便知,先将功能放到一边,这是我最近悟出来的,也许跟我的工作有关,因为我一直是写功能的,很少关注界面。对于漂亮的界面,我也只能暗自赞叹,

觉得这是一件很不可思议的事情,温馨的界面,就如婀娜多姿的美女一样,岂能被人弃之眼外。代码是给开发人员看的,而界面是给所有人员看的,而布局文件正是如此。没有代码的界面就如水一样的平静,躺在那

里移动不懂,代码让界面有了活力,似乎能听到画画的流水声。id 就是名字一样和人的身份证一样,通过id和布局文件取得联系,在后台进行操作,每一个id有其特定的寓意,不同的语言可能有所不一样,有的是id

有的是name等,id的获取是通过查询而来,就如findViewById,代码中得到了控件,就可以用代码给这个控件附加动力,让其有活力。

Android的布局是用xml文件来描述的,而逻辑操作则在Java文件中,看到后停留片刻,不禁问自己,这个世界到底发生了什么,好像在编程的世界中,现在都采用这种界面布局和代码分离的这种模式,也就是所谓的

code-behind。Flex,如此,WPF如此,Android亦如此。

其实这是一种合理的模式,一种可以将开发人员解脱出来的模式,界面有界面的人员,编码有编码的人员。其实不仅仅如此,如果不采用这些界面布局文件,用代码也是完全可以的。而有的时候,代码更能清楚一些

操作,以下这两种方式是完全等价的。

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000">
</scale>
mLitteAnimation =  new ScaleAnimation(0.0f, 1.0f, 0.0f,  1.0f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
mLitteAnimation.setDuration(2000);

不知道这样的解释是否合理,我们所看到的界面其实是一种层次结构的显示,用xml这样的描述再好不过了。对于这些所谓的描述文件,也就是xml或者类似xml的,其元素名称往往对应代码中的对象对应,而属性则对

应对象的属性。布局文件是从结构上给我们直观的显示,其内部是如何实现的,这个是由编译器来完成的,对于喜欢追根问底的程序员来说,这种不能清楚的表达其代码之间的逻辑结构,代码可以更清楚的表述其实

现逻辑,在这中code-behind的方式中,代码就完完全全的可以关注逻辑功能了,下面是实现一个登陆界面的小功能。

package com.example.logincodeui;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu; import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener { private static final int BUTTON_ID_OK = 5000000;
private static final int BUTTON_ID_CANCEL = 6000000;
private static final int TEXT_ID_ONE = 111111;
private static final int TEXT_PASSWD = 222222; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
TableLayout tableLayout = new TableLayout(this);
setContentView(tableLayout); TableRow row1 = new TableRow(this);
tableLayout.addView(row1); TextView view1 = new TextView(this);
view1.setText("账号名称:");
view1.setWidth(100);
EditText text1 = new EditText(this);
text1.setWidth(150);
text1.setSingleLine();
text1.setFilters(new InputFilter[] { new InputFilter.LengthFilter(15) });
text1.setId(TEXT_ID_ONE);
row1.addView(view1);
row1.addView(text1); TableRow row2 = new TableRow(this);
tableLayout.addView(row2); TextView view2 = new TextView(this);
view2.setWidth(100);
view2.setText("账号密码:"); EditText text2 = new EditText(this);
text2.setSingleLine();
text2.setWidth(150);
// 设置为密码模式
text2.setTransformationMethod(new PasswordTransformationMethod());
// 设置最大长度,为15
text2.setFilters(new InputFilter[] { new InputFilter.LengthFilter(15) });
text2.setId(TEXT_PASSWD);
row2.addView(view2);
row2.addView(text2); TableRow row3 = new TableRow(this);
tableLayout.addView(row3); Button b1 = new Button(this);
b1.setText("确定");
b1.setId(BUTTON_ID_OK);
b1.setOnClickListener(this); Button b2 = new Button(this);
b2.setText("取消");
b2.setId(BUTTON_ID_CANCEL);
b2.setOnClickListener(this); row3.addView(b1);
row3.addView(b2);
} @Override
public void onClick(View v) {
EditText t1 = (EditText) findViewById(TEXT_ID_ONE);
EditText t2 = (EditText) findViewById(TEXT_PASSWD);
if (v.getId() == BUTTON_ID_OK) {
Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface v, int btn) {
v.cancel();
}
});
alertDialog.setTitle("输入的信息:" + t1.getText() + " 密码:"
+ t2.getText());
alertDialog.show();
} else if (v.getId() == BUTTON_ID_CANCEL) {
t1.setText("");
t2.setText("");
}
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <TableLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp" > <TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" > <TextView
android:text="账号名称"
android:width="100dp" > </TextView> <EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:minWidth="150dp" > </EditText> </TableRow> <TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="账号密码"
android:width="100dp" /> <EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textWebPassword"
android:minWidth="150dp" /> </TableRow> <TableRow
android:id="@+id/tableRow3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" > <Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
android:textAlignment="center" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消" /> </TableRow>
</TableLayout> </RelativeLayout>

工作很杂,所涉猎均为皮毛,正如同事所说的专一是一件很奢侈的事情!因为我不专一,博客中问题肯定很多,尽管我是一个追求完美的人,但是美中不足是我的结局,以上只是我的片面之言,欢迎交流。

Android 学习(一)的更多相关文章

  1. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  2. Android 学习资源

    下面这些资源对Android开发来说是很有帮助的! 最常用的: Android开发官方网站:http://developer.android.com/index.html 这个网站应该是Android ...

  3. Android学习资料收集

    1.Android 学习之路 http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/

  4. Android学习——第一个NDK程序

    在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了.可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用, ...

  5. Android学习——windows下搭建Cygwin环境

    在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配置,我们也讲到了在NDk r7以后,我 ...

  6. Android学习——windows下搭建NDK_r9环境

    1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个 ...

  7. Android学习第三天-打包常用命令

    在前面<Android学习第一天-adb常用命令>和 <Android学习第二天-android常用命令>两篇博文中,我们重点讲解了adb和android的常用命令,下面我们讲 ...

  8. 【Android学习】《Android开发视频教程》第一季笔记

    视频地址: http://study.163.com/course/courseMain.htm?courseId=207001 课时5    Activity基础概念 1.Android开发技术结构 ...

  9. Android 学习资料收集

    收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料, ...

  10. 十一、Android学习第十天——项目开始(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 十一.Android学习第十天——项目开始 Android知识点的学习告一 ...

随机推荐

  1. mysqldump 参数说明

    mysqldump参数说明 --all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , ...

  2. 在Visual Studio 2010 中创建类库(dll)

    创建类库 选择"文件"->新建->项目->Visual C# ->类库,输入名称,选择位置,单击确定 浏览解决方案资源管理器,可以看到两个C#类,第一个是A ...

  3. 【UI控件总结】【UIScrollView】深入理解篇UIScrollerView

    [UI控件总结][UIScrollView]基本方法+基本描述 接下来,我整理一下自己的思路,深入理解 UIScrollView 基本点 : 1 . UIScrollView 是一个UIView. 每 ...

  4. SharePoint 101 Code Samples are now available

    The Microsoft Office Developer Center has created 101 code samples for SharePoint 2010. These sample ...

  5. cocos2dx中的内存管理机制及引用计数

    1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...

  6. js之正则表达式(上)

    1.正则表达式的创建方式 两种方式创建:通过new修饰符创建和字面量的方式创建 1>new修饰符方式创建 var b2=new RegExp('Box','ig'); //第二个参数是 模式字符 ...

  7. Java多线程——<二>将任务交给线程,线程声明及启动

    一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...

  8. 导入 github 步骤

    https://github.com/dotnet/corefx       如果出现未能找到解决方案的情况,则找项目文件打开,如:  

  9. phonegap 环境搭建

    经过了一番讨论,最后还是决定用phonegap来开发产品.因为用phonegap的人力成本相比原生开发还是节省了不少,并且可以跨平台.至于软件的运行效率,在ios上还是相当流畅的,在android上就 ...

  10. Unity3D研究院之IOS全自动编辑framework、plist、oc代码

    Unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了..而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生 ...