目录html
第31章ListView
ListView是一个能够显示滚动的列表项的一个视图,列表项可能来自于一个列表适配器或一个数组适配器。选取ListView中的一项,将会触发一个事件,咱们能够编写该事件的监听器。
31.1 概览
1.ListView之因此难以使用,是由于你必须获取一个ListAdapter形式的数据源。ListAdapter还为ListView上的每一项提供了布局,所以,ListAdapter实际上在ListView的生命中扮演一个很是重要的角色。
31.2 建立一个ListAdapter
1.ListAdapter的具体实现之一是ArrayAdapter类。ArrayAdapter类是由对象的一个数组来支持的。每个对象的toString方法所返回的字符串,用于填充ListView中的每一项。
2.ArrayAdapter类提供了几个构造方法,全部构造方法都须要传入一个Context以及一个资源标识符,后者指向一个包含TextView的布局。这是由于ListView中的每一项都是一个TextView。
31.3 使用一个ListView
1.代码清单31.1 ListViewDemo1的res/values/strings.xml文件java
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">ListViewDemo1</string> <string name="action_settings">Settings</string> <string-array name="players"> <item>Player 1</item> <item>Player 2</item> <item>Player 3</item> <item>Player 4</item> <item>Player 5</item> </string-array> </resources>
2.代码清单31.2 list_item.xml文件android
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="7dip" android:textSize="16sp" android:textColor="@android:color/holo_green_dark" android:textStyle="bold" > </TextView>
3.代码清单31.3 ListViewDemo1的activity_main.xml文件git
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/listView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
3.代码清单31.4 ListViewDemo1的MainActivity类数组
package com.example.listviewdemo1; import android.app.Activity; import android.app.AlertDialog; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String[] values = getResources().getStringArray( R.array.players); ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, R.layout.list_item, values); ListView listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { String item = (String) parent.getItemAtPosition(position); AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setMessage("Selected item: " + item).setTitle("ListView"); builder.create().show(); Log.d("ListView", "Selected item : " + item); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } }
31.4 扩展ListActivity并编写一个定制的适配器
1.代码清单31.5 pretty_adapter.xml文件android-studio
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/icon" android:layout_width="36dp" android:layout_height="fill_parent"/> <TextView android:id="@+id/label" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical" android:padding="12dp" android:textSize="18sp" android:textColor="@android:color/holo_blue_bright"/> </LinearLayout>
2.代码清单31.6 PrettyAdapter类app
package com.example.listviewdemo2; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class PrettyAdapter extends ArrayAdapter<String> { private LayoutInflater inflater; private String[] items; private Drawable icon; private int viewResourceId; public PrettyAdapter(Context context, int viewResourceId, String[] items, Drawable icon) { super(context, viewResourceId, items); inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.items = items; this.icon = icon; this.viewResourceId = viewResourceId; } @Override public int getCount() { return items.length; } @Override public String getItem(int position) { return items[position]; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = inflater.inflate(viewResourceId, null); ImageView imageView = (ImageView) convertView.findViewById(R.id.icon); imageView.setImageDrawable(icon); TextView textView = (TextView) convertView.findViewById(R.id.label); textView.setText(items[position]); return convertView; } }
3.代码清单31.7 ListViewDemo2的MainActivity框架
package com.example.listviewdemo2; import android.app.ListActivity; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ListView; public class MainActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Since we're extending ListActivity, we do // not need to call setContentView(); Context context = getApplicationContext(); Resources resources = context.getResources(); String[] items = resources.getStringArray( R.array.players); Drawable drawable = resources.getDrawable( R.drawable.pretty); setListAdapter(new PrettyAdapter(context, R.layout.pretty_adapter, items, drawable)); } @Override public void onListItemClick(ListView listView, View view, int position, long id) { Log.d("listView2", "listView:" + listView + ", view:" + view.getClass() + ", position:" + position ); } }
31.5 样式化选取的项
为了让选取的项看上去和剩下的其余的项有所区别,能够将ListView的选择模式设置为CHOICE_MODE_SINGLE。
1.代码清单31.8 主活动的布局文件(activity_main.xml)ide
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ListView android:id="@+id/listView1" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> <ListView android:id="@+id/listView2" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent"/> </LinearLayout>
2.代码清单31.9 MainActivity类布局
package com.example.listviewdemo3; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String[] cities = {"Rome", "Venice", "Basel"}; ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_activated_1, cities); ListView listView1 = (ListView) findViewById(R.id.listView1); listView1.setAdapter(adapter1); listView1.setChoiceMode(ListView.CHOICE_MODE_SINGLE); ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, R.layout.list_item, cities); ListView listView2 = (ListView) findViewById(R.id.listView2); listView2.setAdapter(adapter2); listView2.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); } }
3.代码清单31.10 list_item.xml文件
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="7dip" android:textSize="16sp" android:textStyle="bold" android:background="@drawable/list_selector" />
4.代码清单31.11 drawable/list_selector.xml文件
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@drawable/activated"/> </selector>
5.代码清单31.12 drawable/activated.xml文件
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <corners android:radius="10dp"/> <gradient android:startColor="#FF00FF00" android:endColor="#FFFF00" android:angle="45"/> </shape>
第32章 GridView
GridView是可以在一个表格中显示可滚动的项的一个列表的视图。它和ListView类似,只不过它在多个列中显示项目,而不像ListView那样,只是在单个的列中显示项。和ListView同样,GridView也经过一个ListAdapter获取数据源和布局。
32.2 使用GridView
1.代码清单32.1 AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.gridviewdemo1" android:versionCode="1" android:versionName="1.0" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.gridviewdemo1.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
2.代码清单32.2 GridViewAdapter类
package com.example.gridviewdemo1; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class GridViewAdapter extends BaseAdapter { private Context context; public GridViewAdapter(Context context) { this.context = context; } private int[] icons = { android.R.drawable.btn_star_big_off, android.R.drawable.btn_star_big_on, android.R.drawable.alert_light_frame, android.R.drawable.alert_dark_frame, android.R.drawable.arrow_down_float, android.R.drawable.gallery_thumb, android.R.drawable.ic_dialog_map, android.R.drawable.ic_popup_disk_full, android.R.drawable.star_big_on, android.R.drawable.star_big_off, android.R.drawable.star_big_on }; @Override public int getCount() { return icons.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(context); imageView.setLayoutParams(new GridView.LayoutParams(100, 100)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setPadding(10, 10, 10, 10); } else { imageView = (ImageView) convertView; } imageView.setImageResource(icons[position]); return imageView; } }
3.代码清单32.3 activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:columnWidth="90dp" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:stretchMode="columnWidth" android:gravity="center" />
4.代码清单32.4 MainActivity类
package com.example.gridviewdemo1; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GridView gridview = (GridView) findViewById(R.id.gridview); gridview.setAdapter(new GridViewAdapter(this)); gridview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } }
第33章样式和主题
33.1 概览
1.要对一个视图应用样式,须要使用style属性。建立一个样式的优势在于,可以让样式变得可复用和可共享。样式支持继承,所以,能够扩展一个样式以建立一个新的样式。
2.注意style属性,和其余的属性不一样,它没有使用android前缀。所以,其形式为style而不是android:style。使用系统样式,须要在style属性的值前加上android的前缀。
33.2 使用样式
1.代码清单33.1 styles.xml文件
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devices. --> <style name="AppBaseTheme" parent="android:Theme.Light"> <!-- Theme customizations available in newer API levels can go in res/values-vXX/styles.xml, while customizations related to backward-compatibility can go here. --> </style> <!-- Application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <!-- All customizations that are NOT specific to a particular API-level can go here. --> </style> <style name="WhiteOnRed"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#FFFFFF</item> <item name="android:background"> @android:color/holo_red_light </item> <item name="android:typeface">serif</item> <item name="android:textStyle">bold</item> <item name="android:textSize">25sp</item> <item name="android:padding">30dp</item> </style> <style name="WhiteOnRed.Italic"> <item name="android:textStyle">bold|italic</item> </style> <style name="WhiteOnGreen" parent="WhiteOnRed"> <item name="android:background"> @android:color/holo_green_light </item> </style> </resources>
2.代码清单33.2 activity_main.xml布局文件
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" style="@style/WhiteOnRed" android:text="Style WhiteOnRed" /> <TextView android:id="@+id/textView2" android:layout_below="@id/textView1" android:layout_marginLeft="20sp" android:layout_marginTop="10sp" style="@style/WhiteOnRed.Italic" android:text="Style WhiteOnRed.Italic" /> <TextView android:id="@+id/textView3" android:layout_below="@id/textView2" android:layout_toEndOf="@id/textView2" style="@style/WhiteOnGreen" android:text="Style WhiteOnGreen" /> <TextView android:id="@+id/textView4" android:text="Style TextAppearance.Holo.Medium.Inverse" android:layout_below="@id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@android:style/TextAppearance.Holo.Medium"/> </RelativeLayout>
3.代码清单33.3 MainActivity类
package com.example.styledemo1; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } }
第34章位图处理
34.1 概览
1.位图(bitmap)是一种图像文件格式,它能够独立于显示设备来存储数字图像。位图的简单的含义就是位的地图。现在,这个术语还包括支持有损压缩和无损压缩的其余格式,包括JPEG、GIF和PNG格式。GIF和PNG格式支持透明度和无损压缩,而JPEG格式支持有损压缩,而且不支持透明度。表示数字图像的另外一种方式是使用数学表达式。这样的图像叫做矢量图。
2.使用一个BitmapFactory.Options能够作两件事情。第一件事情是,容许你将最终的位图配置为一个类,从而能够对位图缩小取样(down-sample),将位图设置为可变,而且配置其精度。第二件事情是,可使用BitmapFactory.Options来读取一幅位图的属性而不须要真正加载它。若是认为这个尺寸太大了,那么能够对其缩小取样,以节省内存。
3.若是给BitmapFactory.Options的inSampleSize字段告诉系统如何对一个位图采样。大于1的值表示图像应该缩小采样。
34.2 位图处理
1.代码清单34.1 AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.bitmapdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.bitmapdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
2.代码清单34.2 activity_main.xml文件
<LinearLayout 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" android:orientation="vertical" android:gravity="bottom" tools:context=".MainActivity" > <ImageView android:id="@+id/image_view1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/text_content_desc"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/text_sample_size"/> <TextView android:id="@+id/sample_size" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:onClick="scaleUp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/action_scale_up" /> <Button android:onClick="scaleDown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/action_scale_down" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:onClick="changeImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/action_change_image" /> <TextView android:id="@+id/image_info" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout>
3.代码清单34.3 MainActivity类
package com.example.bitmapdemo; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends Activity { int sampleSize = 2; int imageId = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); refreshImage(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } public void scaleDown(View view) { if (sampleSize < 8) { sampleSize++; refreshImage(); } } public void scaleUp(View view) { if (sampleSize > 2) { sampleSize--; refreshImage(); } } private void refreshImage() { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.drawable.image1, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType; StringBuilder imageInfo = new StringBuilder(); int id = R.drawable.image1; if (imageId == 2) { id = R.drawable.image2; imageInfo.append("Image 2."); } else if (imageId == 3) { id = R.drawable.image3; imageInfo.append("Image 3."); } else if (imageId == 4) { id = R.drawable.image4; imageInfo.append("Image 4."); } else { imageInfo.append("Image 1."); } imageInfo.append(" Original Dimension: " + imageWidth + " x " + imageHeight); imageInfo.append(". MIME type: " + imageType); options.inSampleSize = sampleSize; options.inJustDecodeBounds = false; Bitmap bitmap1 = BitmapFactory.decodeResource( getResources(), id, options); ImageView imageView1 = (ImageView) findViewById(R.id.image_view1); imageView1.setImageBitmap(bitmap1); TextView sampleSizeText = (TextView) findViewById(R.id.sample_size); sampleSizeText.setText("" + sampleSize); TextView infoText = (TextView) findViewById(R.id.image_info); infoText.setText(imageInfo.toString()); } public void changeImage(View view) { if (imageId < 4) { imageId++; } else { imageId = 1; } refreshImage(); } }
1.Android中全部的意图均可以用来启动活动.
A .True
B .False
正确答案:B 个人答案: A
错误缘由:并非全部的意图均可以用来启动活动。要确保一个 Intent 可以启动一个活动,须要在将其传递给startActivity 以前,调用其 resolveActivity 方法:
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
不能解析为一个动做的意图,若是传递给了 startActivity,将会抛出一个异常。
6.调试一个应用程序的最简单的方法,是使用日志消息。Android 框架提供了 android.util.Log 类用于记录日志消息。Log 类带日志级别最高的是()
A .d(debug)
B .i(info)
C .v(verbose)
D .w(warning)
E .e(error)
F .wtf(what a terrible failure)
正确答案: F 个人答案: E
错误缘由:
Verbose,Info,Warn,Error和Assert五类Log的重要程度排序以下。
Assert > Error > Warn > Info > Verbose
Log.v():用来记录Verbose类型日志
Log.d():用来记录Debug类型日志
Log.i():用来记录Info类型日志
Log.w():用来记录Warn类型日志
Log.e():用来记录Error类型日志
Log.wtf():用来记录Assert类型日志
24.A main method can only access static or local variables(main方法只能访问静态变量或局部变量).
A .true
B .false
正确答案: A 个人答案: B
错误缘由:主方法不能访问非静态和非局部变量,由于它是静态方法。特别是,它不能访问在类级别声明的任何变量。
https://gitee.com/EvelynYang/eighth_weeks
在新建的AndroidProjects文件夹中运行脚本,第六周及以前都是在IdeaProjects文件夹里运行。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 38/76 | |
第四周 | 1000/2000 | 1/5 | 20/96 | |
第五周 | 1000/3000 | 1/6 | 25/121 | |
第六周 | 1000/4000 | 1/7 | 25/146 | |
第七周 | 1000/5000 | 1/8 | 25/171 | |
第八周 | 1000/6000 | 1/9 | 15/186 |