Android攻城狮学习笔记-进阶篇一
点击快速抵达:
第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布局优化