Android攻城狮学习笔记-进阶篇一

时间:2023-01-12 14:12:32

点击快速抵达:

第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:实现效果

Android攻城狮学习笔记-进阶篇一

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以表格形式显示多张照片

效果:

Android攻城狮学习笔记-进阶篇一

代码: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实现下拉列表

Android攻城狮学习笔记-进阶篇一

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效果:

Android攻城狮学习笔记-进阶篇一

<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的概念,主要用于大屏幕设备上,他是一个模块化和可重用的组件,定义了自己的布局文件

Android攻城狮学习笔记-进阶篇一

fragment在首次绘制界面时,需要调用onCreateView()方法,该方法返回一个view对象,如果不需要绘制UI,返回null即可

fragment的加载方式分为静态加载和动态加载两种方式

静态加载:

第9章 Fragment与Activity通信

第10章 使用ViewPager实现导航

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

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

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

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

第15章 Android布局优化