点击快速抵达:
第3章 使用DatePicker及TimePicker显示当前日期和时间
第13章 使用Gallery和ImagePicker制作图片浏览器
第1章 AndroidManifest配置文件
四大组件中,只有broadcast组件可以在代码中声明注册,其他必须在AndroidManifest.xml文件中进行注册,否则会报错
<application>标签在其中只有1个
<activity>启动没有在AndroidManifest.xml文件中定义的Activity会报错 有且只有1个入口Activity
<service>
<provider>
<receiver>
另外还需要配置权限
<uses-permission> 说明该应用需要使用那些系统权限
另外,可以给某一个应用自定义一个权限,供其他应用使用
例如,需要实现:在应用B的一个activity中点击按钮后跳转到应用A的一个activity上,则步骤如下:
1)在应用A的AndroidManifest.xml文件中对应的activity下使用<per>子标签定义一个权限
2)在应用A的AndroidManifest.xml文件中声明这个权限,使用<permission>标签,则该activity即被保护起来,需要有对应权限才可以访问
3)在应用B的AndroidManifest.xml文件中使用<uses-permission>标签申请使用这个权限
第2章 使用ListView显示信息列表
ListView需要结合数据适配器将数据源(如数组、链表、数据库、集合)显示出来
ArrayAdapter:可以用于显示格式一致的,如数组、集合
SimpleAdapter:功能强大,可以显示复杂的
public class MainActivity extends ActionBarActivity { private ListView listView;
private ArrayAdapter<String>arrAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listviewtest); listView = (ListView)findViewById(R.id.listView1); //1 新建一个适配器(3个参数为:上下文,当前ListView加载的每一个列表项对应的布局文件,数据源)
//2 适配器加载数据源
String[] data = {"第一条item","第二条item","第三条item"};
arrAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); //3 视图加载适配器
listView.setAdapter(arrAdapter);
} }
SimpleAdapter:实现效果
public class MainActivity extends ActionBarActivity { private ListView listView;
private SimpleAdapter simpAdapter;
private List<Map<String,Object>> dataList; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listviewtest); listView = (ListView)findViewById(R.id.listView1); /*1 新建一个适配器(5个参数为:
*context:上下文
*data:数据源 List<? extends Map<String, ?>> 一个Map所组成的list组合
*每一个Map都会去对应ListView列表中的一行
*每一个Map(键值对)中的键必须包含所有在from中所指定的键
*resource:列表项的布局文件ID
*from:Map中的键名
*to:绑定数据视图中的ID,与from成对应关系
*2 适配器加载数据源
*
* */
dataList = new ArrayList<Map<String, Object>>();
simpAdapter = new SimpleAdapter(this, getData(), R.layout.itemtest, new String[]{"img","text"}, new int[]{R.id.imageView1,R.id.textView1}); //3 视图加载适配器
listView.setAdapter(simpAdapter);
} private List<Map<String,Object>> getData(){ for(int i = 0 ; i<20 ;i++){
Map<String,Object> map = new HashMap<String,Object>();
map.put("img", R.drawable.ic_launcher);
map.put("text", "你好" + i);
dataList.add(map);
}
return dataList;
} }
监听器:是程序和用户交互的桥梁
1)实现接口
2)设置监听
3)重写监听方法
OnItemClickListener:可以处理视图中单个条目的点击事件
public class MainActivity extends ActionBarActivity implements OnItemClickListener
listView.setOnItemClickListener(this);
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
String text = listView.getItemAtPosition(arg2) + ""; //这里有“” 不需要进行类型转换 否则由于listView.getItemAtPosition(arg2)返回的是object类型,需要进行类型转换
Toast.makeText(this, "position = " + arg2 + "text = " + text, Toast.LENGTH_LONG).show();
}
OnScrollListener:监测滚动的变化,可以用于视图在滚动中加载数据
public class MainActivity extends ActionBarActivity implements OnScrollListener
listView.setOnScrollListener(this);
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch(scrollState){
case SCROLL_STATE_FLING:
Log.i("Main", "视图正在滑动,但是手指已经离开了屏幕");
Map<String, Object> map = new HashMap<String,Object>();
map.put("img", R.drawable.ic_launcher);
map.put("text", "新增项");
dataList.add(map); //数据集已经发生变化
simpAdapter.notifyDataSetChanged(); //需要通知界面刷新
break;
case SCROLL_STATE_IDLE:
Log.i("Main", "视图没有滑动");
break;
case SCROLL_STATE_TOUCH_SCROLL:
Log.i("Main", "视图正在滑动,手指尚未离开屏幕");
break;
}
}
第3章 使用DatePicker及TimePicker显示当前日期和时间
public class MainActivity extends ActionBarActivity { private Calendar cal; //自带类,用于获取年月日时分
private int year; //声明年月日时分
private int month;
private int day;
private int hour;
private int minute; private DatePicker datePicker; //声明activity上的两个控件
private TimePicker timePicker; private Context mcontext; //上下文变量 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); cal = Calendar.getInstance(); //获得日历类实例
year = cal.get(Calendar.YEAR); //年月日时分初始值获得
month = cal.get(Calendar.MONTH) + 1;
day = cal.get(Calendar.DAY_OF_MONTH);
hour = cal.get(Calendar.HOUR_OF_DAY);
minute = cal.get(Calendar.MINUTE);
mcontext = this; setTitle(year + "-" + month + "-" + day + " " + hour + ":" + minute); //title栏初始显示 datePicker = (DatePicker)findViewById(R.id.datePicker1); //获取页面按钮
timePicker = (TimePicker)findViewById(R.id.timePicker1); datePicker.init(year, cal.get(Calendar.MONTH), day, new OnDateChangedListener() { //datePicker通过init()方法进行初始化,其中的OnDateChangedListener()用来监听日期修改 @Override
public void onDateChanged(DatePicker arg0, int arg1, int arg2, int arg3) { setTitle(arg1 + "-" + (arg2 + 1) + "-" + arg3); //日期修改后需要做什么 }
}); timePicker.setOnTimeChangedListener(new OnTimeChangedListener() { //timePicker直接通过setOnTimeChangedListener()中的OnTimeChangedListener来监听时间变化 @Override
public void onTimeChanged(TimePicker arg0, int arg1, int arg2) { setTitle(arg1 + ":" + arg2); //时间修改后需要做什么 }
}); new DatePickerDialog(mcontext, new OnDateSetListener() { //DatePickerDialog和TimePickerDialog 以弹出框的方式来修改 @Override
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
setTitle(arg1 + "-" + (arg2 + 1) + "-" + arg3); //回调方法,关闭弹框后需要做什么 }
}, year, cal.get(Calendar.MONTH), day).show(); //通过.show()显示出来 new TimePickerDialog(mcontext, new OnTimeSetListener() { @Override
public void onTimeSet(TimePicker arg0, int arg1, int arg2) {
setTitle(arg1 + ":" + arg2); }
}, hour, minute, true).show(); } }
第4章 使用GridView以表格形式显示多张照片
效果:
代码:activity
public class MainActivity extends ActionBarActivity implements android.widget.AdapterView.OnItemClickListener{ private GridView gridView;
private List<Map<String,Object>> dataList;
private int[] icon = {R.drawable.address_book,R.drawable.calendar,R.drawable.camera,R.drawable.clock,
R.drawable.games_control,R.drawable.messenger,R.drawable.ringtone,R.drawable.settings,
R.drawable.speech_balloon,R.drawable.weather,R.drawable.world,R.drawable.youtube};
private String[] iconName = {"通讯录","日历","照相机","闹钟","游戏中心","信息","铃声","设置","语音","天气","浏览器","视频"}; private SimpleAdapter simpleAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); gridView = (GridView)findViewById(R.id.gridView1);
dataList = new ArrayList<Map<String,Object>>(); //数据源初始化
simpleAdapter = new SimpleAdapter(this, getData(), R.layout.item, new String[]{"image","text"}, new int[]{R.id.image,R.id.text}); //定义适配器 gridView.setAdapter(simpleAdapter);//加载适配器
gridView.setOnItemClickListener(this); //启动监听器 } private List<Map<String,Object>> getData(){ //数据源获取方法
for(int i = 0; i < icon.length;i++){
Map<String,Object> map = new HashMap<>();
map.put("image", icon[i]);
map.put("text", iconName[i]);
dataList.add(map);
}
return dataList;
} @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //监听到动作后 打印文字
Toast.makeText(this, "我是" + iconName[arg2], Toast.LENGTH_SHORT).show(); } }
代码:activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.gridviewtest.MainActivity"
tools:ignore="MergeRootFrame"
android:background="#000000">
<!--android:background设置背景色为黑色
android:numColumns 设置每列有3个item
android:verticalSpacing 设置item之前的垂直间距
android:horizontalSpacing 设置item之间的水平间距--> <GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="3"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp">
</GridView> </FrameLayout>
代码:item.xml
<?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"
android:orientation="vertical"
android:gravity="center"> <ImageView
android:id="@+id/image"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/text"
android:layout_margin="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:text="Hi nihao"
/> </LinearLayout>
第5章 使用Spinner实现下拉列表
public class MainActivity extends ActionBarActivity implements OnItemSelectedListener { private TextView textView;
private Spinner spinner;
private List<String> list;
private ArrayAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textView1);
textView.setText("你选择的是:北京");
spinner = (Spinner)findViewById(R.id.spinner1); list = new ArrayList<String>(); //1 定义数据源
list.add("北京");
list.add("上海");
list.add("广州");
list.add("深圳"); adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list); //2 定义适配器 加载数据源 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //3 为适配器设置下拉时的样式 spinner.setAdapter(adapter); //4 加载适配器
spinner.setOnItemSelectedListener(this); // 5 启动下拉选择监听 } //定义监听
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String cityName = (String) spinner.getItemAtPosition(arg2);
textView.setText("你选择的是:" + cityName); } @Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub }
}
第6章 使用ProgressBar实现进度条
大环形 小环形 水平进度 有的可以显示刻度和百分比 有的不显示进度
关键属性和方法:
第一显示进度 第二显示进度 最大显示进度
demo效果:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.progressbar.MainActivity"
tools:ignore="MergeRootFrame"
android:orientation="vertical" > <ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="30"
android:secondaryProgress="40" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add"/> <Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reduce" /> <Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset" /> <TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" /> </LinearLayout>
public class MainActivity extends ActionBarActivity implements OnClickListener{ private ProgressBar progress;
private Button btn_add;
private Button btn_reduce;
private Button btn_reset;
private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); init(); } private void init() {
progress =(ProgressBar)findViewById(R.id.progressBar1);
btn_add = (Button)findViewById(R.id.button1);
btn_reduce = (Button)findViewById(R.id.button2);
btn_reset = (Button)findViewById(R.id.button3);
textView = (TextView)findViewById(R.id.textView1); int firstPro = progress.getProgress();
int secPro = progress.getSecondaryProgress();
int Max = progress.getMax(); textView.setText("第一进度是:" + (int)(firstPro/(float)Max*100) + "%;" + "第二进度是:" + (int)(secPro/(float)Max*100) + "%;");
btn_add.setOnClickListener(this);
btn_reduce.setOnClickListener(this);
btn_reset.setOnClickListener(this); } @Override
public void onClick(View v) {
switch (v.getId()) {
//增加进度
case R.id.button1:
progress.incrementProgressBy(10);
progress.incrementSecondaryProgressBy(10);
break;
//减少进度
case R.id.button2:
progress.incrementProgressBy(-10);
progress.incrementSecondaryProgressBy(-10);
break;
//重置
case R.id.button3:
progress.setProgress(30);
progress.setSecondaryProgress(40);
break;
} textView.setText("第一进度是:" + (int)(progress.getProgress()/(float)progress.getMax()*100) + "%;" + "第二进度是:" + (int)(progress.getSecondaryProgress()/(float)progress.getMax()*100) + "%;");
}
}
关于progressDialog的内容未详细看,关于自定义progressBar的内容未做笔记
第7章 使用WebView显示网页
使用Intent意图在我们的应用中打开浏览器显示网页
public class MainActivity extends ActionBarActivity { private String url = "http://www.baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
可以自定义webview,加载本地资源或web资源
定义webview:
public class MainActivity extends ActionBarActivity { private WebView webview; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); webview = (WebView)findViewById(R.id.webView1);
//webview加载本地资源
// webview.loadUrl("file:///android_asset/test.html");
//webview加载web资源,一定要记得加上权限<uses-permission android:name="android.permission.INTERNET"/>
webview.loadUrl("http://www.baidu.com"); }
}
自定义webview默认使用系统浏览器或第三方浏览器打开网页,可以通过覆盖这一行为使得直接在webview中打开网页
webview.loadUrl("http://www.baidu.com"); webview.getSettings().setJavaScriptEnabled(true); //有些页面使用js,必须设置允许加载js才能打开 webview.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
//返回true则在webview中直接打开,返回false在系统或第三方浏览器中打开
return true;
}
});
启用支持javascript
webview = (WebView)findViewById(R.id.webView1);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
后退与前进
//改写物理按键——返回的逻辑
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webview.canGoBack()) {
webview.goBack(); //返回上一页面
return true;
} else {
System.exit(0); //退出系统
}
}
return super.onKeyDown(keyCode, event);
}
另外有setChromeClient()等
第8章 Fragment基础
android3.0引入了fragments的概念,主要用于大屏幕设备上,他是一个模块化和可重用的组件,定义了自己的布局文件
fragment在首次绘制界面时,需要调用onCreateView()方法,该方法返回一个view对象,如果不需要绘制UI,返回null即可
fragment的加载方式分为静态加载和动态加载两种方式
静态加载:
第9章 Fragment与Activity通信
第10章 使用ViewPager实现导航
第11章 使用ViewFilpper实现屏幕切换动画效果
第12章 使用ScrollView实现滚动效果
第13章 使用Gallery和ImagePicker制作图片浏览器
第14章 使用SeekBar实现可拖动的滚动条
第15章 Android布局优化