Android Inflate()方法的作用是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的,没有找到的同时并显示功能。最近做的一个项目就是这一点让我迷茫了好几天。
Android上还有一个与Inflate()功能类似的方法叫findViewById(),二者有时可以互换使用,但也有区别:
如果你的Activity里用到别的layout,比如对话框layout,你还要设置这个layout上的其他组件的内容,你就必须用inflate()方法先将对话框的layout找出来,然后再用findViewById()找到它上面的其它组件。例如:
- View view1=View.inflate(this,R.layout.dialog_layout,null);
- TextViewdialogTV=(TextView)view1.findViewById(R.id.dialog_tv);
- dialogTV.setText("abcd");
- View viewStub = ((ViewStub) findViewById(R.id.stubView)).inflate();
Android NotesList详解
我们从入口点所在的activity开始,可以看到这个activity最重要的功能就是显示日志记录。这个程序的日志都存放在Sqlite数据库中,因此需要读出所有的日志记录并显示出来。
先来看两个重要的私有数据,第一个PROJECTION字段指明了“日志列表“所关注的数据库中的字段(即只需要ID和Title就可以了)。
- private static final String[] PROJECTION =
- new String[] {
- Notes._ID, // 0
- Notes.TITLE, // 1
- };
- private static final int COLUMN_INDEX_TITLE =1;
- //然后就进入了第一个调用的函数onCreate。
- Intent intent = getIntent();
- if (intent.getData() == null)
- {
- intent.setData(Notes.CONTENT_URI);
- }
- Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null, null, Notes.DEFAULT_SORT_ORDER);
- SimpleCursorAdapter adapter =new SimpleCursorAdapter(this, R.layout.noteslist_item, cursor,
- new String[] { Notes.TITLE }, newint[] { android.R.id.text1 });
- setListAdapter(adapter);
- <TEXTVIEW android:singleLine="true" android:paddingLeft="5dip"
- android:gravity="center_vertical"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:layout_width="fill_parent"
- android:id="@android:id/text1" xmlns:android="http://schemas.android.com/apk/res/android" />
处理“选择日志”事件
既然有了“日志列表”,就自然要考虑如何处理某一条日志的单击事件,这通过重载onListItemClick方法来完成,
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
-
- String action = getIntent().getAction();
- if (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)) {
- setResult(RESULT_OK, new Intent().setData(uri));
- }
- else {
- startActivity(new Intent(Intent.ACTION_EDIT, uri));
- }
- }
很多网友抱怨Android处理底层I/O性能不是很理想,如果不想使用NDK则可以通过 Android MemoryFile 类实现高性能的文件读写操作。 MemoryFile顾名思义就是内存文件的意思,如果你过去从事过Win32开发,那么它的原理就是MapViewOfFile(),开发过Linux的网友可能很快就联想到了mmap(),是的该类就是他们的托管代码层封装,位于android.os.MemoryFile这个位置,从Android 1.0开始就被支持。
MemoryFile适用于哪些地方呢?
对于I/O需要频繁操作的,主要是和外部存储相关的I/O操作,MemoryFile通过将NAND或SD卡上的文件,分段映射到内存中进行修改处理,这样就用高速的RAM代替了ROM或SD卡,性能自然提高不少,对于Android手机而言同时还减少了电量消耗。该类实现的功能不是很多,直接从Object上继承,通过JNI的方式直接在C底层执行。
主要的构造方法MemoryFile(String name, int length),这里第二个参数为文件大小,需要说明的是Android的MemoryFile和传统的mmap还有一点点区别,毕竟是手机,它内部的内存管理方式ashmem会从内核中回收资源。
synchronized boolean allowPurging(boolean allowPurging) //允许ashmem清理内存,线程安全同步的方式。
void close() //关闭,因为在Linux内部mmap占用一个句柄,不用时一定要释放了
InputStream getInputStream() 返回读取的内容用Java层的InputStream保存
OutputStream getOutputStream() 把一个OutputSream写入到MemoryFile中
boolean isPurgingAllowed() //判断是否允许清理
int length() //返回内存映射文件大小
下面就是我们熟悉的读写细节,主要是对字符数组的操作,这里大家要计算好每个文件类型的占用,同时考虑到效率对于自己分配的大小考虑粒度对齐。
- [/size][/font]
- int readBytes(byte[] buffer, int srcOffset, int destOffset, int count)
- void writeBytes(byte[] buffer, int srcOffset, int destOffset, int count)