点击快速抵达:

第1章 AndroidManifest配置文件

第2章 使用ListView显示信息列表

第3章 使用DatePicker及TimePicker显示当前日期和时间

第4章 使用GridView以表格形式显示多张照片

第5章 使用Spinner实现下拉列表

第6章 使用ProgressBar实现进度条

第7章 使用WebView显示网页

第8章 Fragment基础

第9章 Fragment与Activity通信

第10章 使用ViewPager实现导航

第11章 使用ViewFilpper实现屏幕切换动画效果

第12章 使用ScrollView实现滚动效果

第13章 使用Gallery和ImagePicker制作图片浏览器

第14章 使用SeekBar实现可拖动的滚动条

第15章 Android布局优化

第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布局优化

Android攻城狮学习笔记-进阶篇一的更多相关文章

  1. Android攻城狮学习笔记—入门篇三

    第十章 CheckBox 与其他控件类似 有自己的监听方法 实现监听 并定义被选中或取消后的操作 第十一章 RadioGroup和RadioButton RadioGroup是RadioButton的 ...

  2. Android攻城狮学习笔记—入门篇二

    第七章  跑马灯 activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/an ...

  3. Android攻城狮学习笔记—入门篇一

    第一章 搭建Android开发环境 1.1 环境组成 JDK(Java Development Kit) Eclipse Android SDK(Software Development Kit) A ...

  4. 前端攻城狮学习笔记九:让你彻底弄清offset

    很多初学者对于JavaScript中的offset.scroll.client一直弄不明白,虽然网上到处都可以看一张图(图1),但这张图太多太杂,并且由于浏览器差异性,图示也不完全正确. 图一 不知道 ...

  5. PHP学习笔记 - 进阶篇(11)

    PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...

  6. PHP学习笔记 - 进阶篇(10)

    PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...

  7. PHP学习笔记 - 进阶篇(9)

    PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...

  8. PHP学习笔记 - 进阶篇(8)

    PHP学习笔记 - 进阶篇(8) 日期与时间 取得当前的Unix时间戳 UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 0 ...

  9. PHP学习笔记 - 进阶篇(7)

    PHP学习笔记 - 进阶篇(7) 文件操作 读取文件内容 PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中. $conte ...

随机推荐

  1. DOM增删改操作

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. elixir 表单 map

    键-值对 iex(13)> map = %{:a => 1, 2 => :b}%{2 => :b, :a => 1}iex(14)> map[:a]1iex(15) ...

  3. C++ 判断当前系统x64 or x86

    BOOL IsWow64(){ BOOL bIsWow64 = FALSE; //IsWow64Process is not available on all supported versions o ...

  4. hidden field implements session

    隐藏域实现会话管理概述 如果你正在制作一个网络问卷,由于问卷内容很长,因此必须分几个页面,上一页面作答完后,必须请求服务器显示下一个页面. 但是在HTTP协议中,服务器并不会记得上一次请求的状态.既然 ...

  5. 网络 Internet 的发展

    Internet源于美国军方,那时制定了TCP/IP协议. 互联网的典型应用有:www,FTP,E-mail. WWW:World Wide Web,简称Web,又称全球网.万维网等. 网页,c/s架 ...

  6. linux 软件包安装方式选择、安装位置、源码包安装

    对外提供服务,比如apache,应使用源码包安装对内提供服务,比如gcc,只是我自己使用,使用rpm包安装 rpm包不需要指定安装位置,源码包的安装需要手动指定安装位置 rpm包默认安装位置/etc/ ...

  7. UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ordin al not in range(128)——解决方案备注

    在vim中使用ycm插件时,偶尔会出现: “UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-5: ord ...

  8. java基础(八) 深入解析常量池与装拆箱机制

    引言   本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体, ...

  9. python函数 变量 递归

    1 语法 #语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 #函数名要能反映其意义 返回值数=0:返回None放回值数=1:返回object ...

  10. java语言导学(5版)--第12章并发之二

    1不可变对象 概念:(immutable)对象创建后,状态不可更改.不可变对象在并发程序中尤其有用,因状态不可变,不会被线程干扰,也不会出现不一致状态. 书中通过实例是可变的类,并从此类衍生出一个不可 ...