Android 核心笔记

阅读: 评论:0

Android 核心笔记

Android 核心笔记

Android 核心笔记

  • 各个文件功能
    • view常用属性
    • UI组件层次结构
      • 控制UI界面的方法
  • 什么是布局管理器
    • 常用的布局管理器
      • RelativeLayout:相对布局管理器
      • LinarLayout:线性布局管理器
      • FrameLayout:帧布局
      • TableLayout:表格布局管理器
      • GridLayout:网格布局管理器
  • 控件
    • TextView 文本框
    • EditText 文明本编辑器
    • Button
    • ImageButton 图片按钮
    • ImageView 图片框
    • ImageSwitcher 图像切换器
    • GridView 网格视图
      • 给GridVie视图添加图片
    • RadioButton 单选按钮
      • 获取radioButton 文本的方法
        • 方法一:点击单选按钮的时候获得
        • 方法二:点击提交按钮的时候获得单选按钮的文本
    • checkbox复选框
    • DatePicker日期选择器
    • 时间选择器
    • Chronometer计时器
    • ProgressBar 进度条
    • SeekBar 拖动条
    • RatingBar 星星滚动条
    • Spinner 下拉列表框
    • ListView 列表视图
    • ScrollView滚动视图
  • Activity
    • 入口Activity
      • 通过一个activity开启另一个activity
      • 关闭Activity
      • 刷新Activity
    • Activity 交换数据
    • 调用另一个Activity并返回结果
    • Fragment 碎片
      • 静态调用
      • 动态调用
  • Intent
    • ComComponentName 组件名启动另一个Activity
    • Activity调用另一个Activity并获得返回值
    • Action和Data属性
  • 物理按键事件处理
  • 触摸屏事件处理
    • 长按一个图片显示一个菜单
    • 创建菜单栏
  • 触摸事件
    • 跟着手指移动的图片
    • 单击事件与触摸事件的区别
  • 绘图与动画
    • 绘制矩形
    • 绘制几何图形
    • Bitmap与BitmapFactory
    • 创建一格图片并挖取图片上的一小块
    • 逐帧动画
    • 补间动画
  • AlertDialog 对话框讲解
    • 标准对话框
    • 带列表的对话框
    • 带单选按钮的对话框
    • 带复选框的按钮对话框
    • 完整代码
  • 使用Notification在状态栏显示通知
  • 广播
    • 开机自启广播
  • 选中背景变色
  • 自定义Adapter适配器
    • layout布局文件
    • 适配器文件
    • Activity文件

本片笔记主要是为了记录自己在学习中的点点滴滴,日后复习的时候方便自己,方便他人,同时也是为了鼓励自己,毕竟自己写的东西得到他人的认可是多麽大的成就

各个文件功能

文件夹说明
manifest:配置全局变量 ,设置权限
java放置Android所需要的文件以及java源文件

|activity| 是程序的入口|
一个activity就是一个Java类文件

对onCreate类重写:

1.用来初始化activity实例对象
Create是加载一些组件
3.setCentenView  指定现实的布局文件
4.Res文件是程序加载的一些资源文件
5.当Res文件生成失败需要在Build-->Clean Project   就可以解决

view常用属性

属性说明
id唯一标识符
android:id="@+id/user"前面的"@+/"是固定的写法
background可以设置背景图片或颜色
padding用于设置内边距
android:paddig="@dimen/activity_margin"四周设置一样的内边距
android:paddingLeft;左边距
android:paddingTop顶边距
android:paddingRight右边距
android:paddingBottom底边距
Android:Layout_marginLeft设置左外边距
Android:Layout_marginTop设置上外边距
Android:Layout_marginRight设置有外边距
Android:Layout_marginBottom设置下外边距

UI组件层次结构

viewGroup可以包含很多view还可以包含很多viewGrop

控制UI界面的方法

使用XML布局文件控制UI界面(推荐使用)XML布局文件保存到res/layout文件下面,扩展名为.XML在activity中使用Java代码加载布局文件setContentView(R.layout.布局文件名)
使用Java代码控制UI界面
使用XML和Java代码控制UI界面
开发自定义的view

什么是布局管理器

常用的布局管理器

RelativeLayout:相对布局管理器

    gravity:用于控制在相对布局管理器中的位置ignoreGravity:指定某个控件不受gravity的控制
layout_above位于另一个组件上方
layout_below位于另一个组件的下方
layout_toLeftOf位于另一个组件的左侧
layout_toRightOf位于另一个组件的右侧

例如:第二个TextView位于第一个TextView下方

<TextViewandroid:id="@+id/label1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><TextViewandroid:id="@+id/label2"android:layout_below="@id/label1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="你好!冯家振"/>
layout_alignParentBottom与父容器底
layout_alignParentLeft与父容器左对齐
layout_alignParentRight与父容器右对齐
layout_alignParentTop与父容器顶对齐
layout_alignBottom与某个控件底对齐
layout_alignLeft与某个控件左对齐
layout_alignRight与某个控件右对齐
layout_alignTop与某个控件顶对齐
layout_centerHorizontal与父容器水平居中
layout_centerInparent与父容器水平垂直居中
layout_centerVertical与父容器垂直居中

LinarLayout:线性布局管理器

备注
android:layout_weight分配剩余空间若=1则分配剩余空间的一半’=2折分配剩余空间的2份
orientation=“vertical”垂直布局
orientation=“horizontal”水平布局
gravity控制控件位于父容器的那个地方gravity的后面可以跟多个属性用" 竖线 "(|)符号分隔 例如:android:gravity="right|bottom"右下角现实

FrameLayout:帧布局

属性说明
foreground设置帧布局管理器的前景图像或颜色,在所有控件的上方,不会被其他控件遮挡
foregroundGravity前景图像或颜色的位置

TableLayout:表格布局管理器

属性说明
TableRow添加表格行
collapseColumns隐藏第几列,0第一列,1第二列
stretchColumns允许被拉伸
shrinkColumns允许被收缩

GridLayout:网格布局管理器

属性说明
columnCount设置最大列数
orientation水平或垂直排列方式
columnCount设置最大列数
layout_column指定子组件在网格的第几列的
layout_columnSpan指定子组件横跨几列
layout_columnWeight指定子组件在水平方向上的权重的
layout_gravity指定子组件在表格中的位置
layout_ row指定子组件在第几行
layout_ rowCount最大行数
layout_ rowSpan指定子组件跨越几行
layout_ rowWeight指定子组件在垂直方向上的权重的

注意在设置跨行或跨列的时候需要与layout_gravity属性一起使用

控件

TextView 文本框

属性说明
minLines最小行数
text文本
textColor设置文本颜色
textSize设置文字大小 单位:sp
singleLine设置成单行文本框

EditText 文明本编辑器

去掉编辑框的边框 background设置成白色或@null

属性说明
hint添加水印文字
drawableLeft在文本编辑器左边放入图片
inputType可以设置编辑框输入密码 数字 等等
drawblepadding设置图片与文字的间距

Button

为按钮添加单击事件的两种方法
第一:
在java文件中通过匿名类进行指定

 Button button=findViewById(R.id.Button1);//获得按钮button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "nihao", Toast.LENGTH_SHORT).show();}});//进行绑定事件
第一:

在java文件中通过匿方法进行指定,然后在layout中通过android:onClick=”“进行获取方法

public void MyClick(View view){Toast.makeText(this,"我是按钮而",Toast.LENGTH_SHORT).show();}

ImageButton 图片按钮

去除背景颜色
background="#000"
其余用法和Button用法一样

ImageView 图片框

基本上图片都是放到drawable中

属性说明
src设置图片
scalcType图片缩放方式,fitXY X轴Y轴独立缩放
adjustViewBounds设置图片最大高度最大宽度,然后在设置witdth="?",heiht=? 图片不会超过设置的maxWidth与maxHeight的值
tint着色直 给图片上色

ImageSwitcher 图像切换器

ImageSwitcher imageSwitcher = findViewById(R.id.imageSwitcher);//设置淡出功能imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.fade_out));//设置淡入功能imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.fade_in));//设置图片切换器默认显示的图片imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {@Overridepublic View makeView() {ImageView imageView = new ImageView(MainActivity.this);imageView.setImageResource(R.mipmap.img01);//设置图片资源return imageView;}});//点击图片进行切换imageSwitcher.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {imageSwitcher.setImageResource(R.mipmap.img02);}});

GridView 网格视图

属性说明
numColumns设置网格视图有几列
verticalSpacing垂直间距
horizontalSpacing水平间距
columnWidth列宽度

给GridVie视图添加图片

首先需要一个模板,也就是布局文件
1.在layout文件夹中创建一个模板如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/image"android:layout_width="100dp"android:layout_height="75dp"/><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
然后在l文件中添加GridView控件如下
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><GridViewandroid:id="@+id/gridview"android:layout_width="match_parent"android:layout_height="match_parent"android:numColumns="3"/></RelativeLayout>
最后添加Java控制代码 如下
;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.GridView;
import android.widget.SimpleAdapter;import flect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;public class MainActivity extends AppCompatActivity {private int [] picture=new int []{R.mipmap.ima_01,R.mipmap.ima_02,R.mipmap.ima_03,R.mipmap.ima_04,R.mipmap.ima_05,R.mipmap.ima_06,R.mipmap.ima_06,R.mipmap.ima_08,R.mipmap.ima_09};private String [] name=new String []{"冯家振","爱","晏传利","其余的","都是","配角","王梦魁","秦睿","张三"};@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);GridView gridView=findViewById(idview);//找到GridViewArrayList<HashMap<String ,Object>> listItem=new ArrayList<HashMap<String, Object>>();//定义一个HaspMap类型的List,HashMap第一个参数是Key,第二个参数是Valuefor(int i=0;i<picture.length;i++){HashMap<String ,Object> map=new HashMap<String,Object>();map.put("image",picture[i]);//把图片添加到Map中map.put("name",name[i]);listItem.add(map);//把map添加到List集合中}//SimpleAdapter五个参数// 第一个上下文this,// 第二个,list集合,// 第三个:布局样式文件,// 第四个相当于Map的Key值,// 第五个布局文件中的Id值相当于Map中的Value,Map中的Value值给布局文件中的id赋值SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItem,ll,new String[]{"image","name"},new int []{R.id.image,R.id.name});
//把simpleAdapter赋值给gridviewgridView.setAdapter(simpleAdapter);}}

RadioButton 单选按钮

需要设置一组单选按钮,需要把RadioButton放到RadioGroup

<RadioGroupandroid:layout_width="wrap_content"android:layout_height="wrap_content"><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="男"/><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="女"/><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="保密"/></RadioGroup>

获取radioButton 文本的方法

方法一:点击单选按钮的时候获得

给RadioGroup绑定OnCheckedChangeListener事件进行获得

RadioGroup rg=findViewById(R.id.radiogroup1);//获得RadioGroup 
给RadioGroup 绑定事件rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {RadioButton rb=(RadioButton)findViewById(checkedId);//获得单选按钮Toast.makeText(MainActivity.this, "性别"&#Text(), Toast.LENGTH_SHORT).show();}});
方法二:点击提交按钮的时候获得单选按钮的文本

通过给按钮绑定事件.然后进行遍历进行获得

Button button=(Button)findViewById(R.id.button1);//获得按钮
//给按钮绑定事件button.setOnClickListener(new View.OnClickListener() {//获得RadioGroupRadioGroup rg=(RadioGroup)findViewById(R.id.radiogroup1);@Overridepublic void onClick(View v) {//通过遍历获得一共有多少个单选按钮for(int i=0;i&ChildCount();i++){//获得被选中的按钮RadioButton bu=(RadioButton) rg.getChildAt(i);if(bu.isChecked())//判断当前按钮是否被选中Toast.makeText(MainActivity.this, "性别"&#Text(), Toast.LENGTH_SHORT).show();}}});

checkbox复选框

check=“true” 默认被选中
给复选框添加监听事件使用 CompoundButton.OnCheckedChangeListener()匿名方法

CheckBox cb1=(CheckBox)findViewById(R.id.check1);//获得复选框cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {//判断复选框是否被选中if(isChecked) {Toast.makeText(MainActivity.this, Text(), Toast.LENGTH_SHORT).show();}}});

DatePicker日期选择器

日期选择器进行初始化

 DatePicker dp=(DatePicker)findViewById(R.id.date1);//获得日历控件Calendar calendar&#Instance();//实例化一个日历year&#(Calendar.YEAR);//获得年份month&#(Calendar.MONTH);//获得当前月份day&#(Calendar.DAY_OF_MONTH);//获得当前日//初始化日历,并且匿名一个日历改变监听事件dp.init(year,month,day,new OnDateChangedListener(){@Overridepublic void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {String str=year+"年"+monthOfYear+"月"+dayOfMonth+"日";Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();}});

时间选择器

setIs24HourView(true);设置24小时属性

 TimePicker tp=(TimePicker)findViewById(R.id.time1);//获得时间控件h&#(Calendar.HOUR);//获得小时m&#(Calendar.MINUTE);//获得分钟设置一个时间改变监听事件tp.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {@Overridepublic void onTimeChanged(TimePicker view, int hourOfDay, int minute) {String str=hourOfDay+"点"+minute+"分";Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();}});

Chronometer计时器

方法说明
setBase()设置计时器的起始时间
setFormat()设置显示时间的格式
start()指定开始时间
stop()指定停止计时
setOnCheonometerTickListenner()为计时器绑定事件监听器,当计时器改变是触发该监听器
setContentView(R.layout.activity_main);Chronometer chronometer=findViewById(R.id.time1);chronometer.setBase(SystemClock.elapsedRealtime());//获取当前系统时间
chronometer.setFormat("%s");//设置时间格式chronometer.start();//开始计时chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {@Overridepublic void onChronometerTick(Chronometer chronometer) {if(SystemClock.elapsedRealtime()-Base()>10000){Toast.makeText(MainActivity.this, "游戏已结束", Toast.LENGTH_SHORT).show();chronometer.stop();//停止}}});

ProgressBar 进度条

style前面不需要加android的前缀
?android:attr/progressBarStyleHorizontal细长tiao
?android:attr/progressBarStyleSmall细小圆形进度条
?android:attr/progressBarStyleLarge细大圆形进度条
?android:attr/progressBarStyle.Horizontal粗长长条
?android:attr/progressBarStyle.Small粗小圆形进度条
?android:attr/progressBarStyle.Large粗大圆形进度条
属性说明
max进度条的最大值
progress进度条的当前进度

改变进度条的方法

public class MainActivity extends AppCompatActivity {
private int  mProgress=0;
private Handler mHandler;//声明一个Handler方法进行发送消息@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);ProgressBar pb=findViewById(R.id.progressBar1);mHandler=new Handler(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if(msg.what==0x111)//判断线程发送过来的消息{pb.setProgress(mProgress);}else {Toast.makeText(MainActivity.this, "结束", Toast.LENGTH_SHORT).show();}}};new Thread(new Runnable() {//创建进程@Overridepublic void run() {while(true){mProgress=doWork();Message m=new Message();//声明一个Messageif(mProgress<100){m.what=0x111;mHandler.sendMessage(m);//发送消息}else{m.what=0x110;mHandler.sendMessage(m);break;}}}private int doWork(){mProgress+=Math.random()*10;try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}return mProgress;}}).start();}
}

SeekBar 拖动条

拖动条是滚动条的一个子类
max,progress 用法都一样
thumb:用于改变滚动条小圆点的形状,可以是一个图像

RatingBar 星星滚动条

numStars设置星星个数
rating设置默认星星选中的个数
stepSize选星星的方式 1为一整颗一整颗的选,0.5一次选半颗
isIndicator只能看不能选

Spinner 下拉列表框

属性说明
entries指定列表项

指定列表项通过xml资源文件指定

在value文件夹下建立xml文件的Value Xml File文件
<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="ctype"><item>全部</item><item>电影</item><item>图书</item><item>资源</item></string-array></resources>

通过entries="@array/ctype"

通过适配器为下拉列表指定数据项

 Spinner spinner=findViewById(R.id.Spiner1);String [] Ctype=new String[]{"全部","电影","电视剧","体育"};ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,Ctype);//第一个参数:上一下文对象//第二个参数:布局样式//第三个参数:数据源adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);spinner.setAdapter(adapter);

选择列表项触发事件

Spinner spinner=findViewById(R.id.Spiner1);spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {String string&#ItemAtPosition(position).toString();Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});

ListView 列表视图

用法和网格试图一样

ScrollView滚动视图

HorizontalScrollView 水平滚动视图

滚动视图可以包含多个view组件,但是这些组件必须包裹在布局文件中例如

<LinearLayout xmlns:android=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<HorizontalScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="235sp"android:text="adjsvjasdvioavasdnvkjlvdnksljvlakjsdvlkajsdbvlasdjbvjlaksdvbakljsdbvkljasdvlkajsdvlakjsdbvlkasdjbvljkdsbvlkjasdlvkjalkdvblaksjdvasdjnvwehiweofioewfidkl;asdnnvjfnjfvhfvbal"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="30sp"android:text="adjsvjasdvioavasdnvkjlvdnksljvlakjsdvlkajsdbvlasdjbvjlaksdvbakljsdbvkljasdvlkajsdvlakjsdbvlkasdjbvljkdsbvlkjasdlvkjalkdvblaksjdvasdjnvwehiweofioewfidkl;asdnnvjfnjfvhfvbal"/></LinearLayout></HorizontalScrollView></LinearLayout>

通过Java文件加载滚动视图


//向LinearLayout内添加滚动视图ScrollView scrollView=new ScrollView(this);ll.addView(scrollView);//向滚动视图内添加LinearLayoutLinearLayout ll2=new LinearLayout(this);ll2.setOrientation(LinearLayout.VERTICAL);scrollView.addView(ll2);//向LinearLayout内添加ImageViewImageView imageView=new ImageView(this);imageView.setImageResource(R.mipmap.cidian);ll2.addView(imageView);//向LinearLayout内添加TextViewTextView textView=new TextView(this);textView.setText(R.string.cidian);ll2.addView(textView);

Activity

入口Activity


需要配置被选中的这四行代码,表示他是启动项Activity

通过一个activity开启另一个activity

 button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,MyActivity.class);startActivity(intent);}});

关闭Activity

直接使finish()

刷新Activity

onCreate(null);

Activity 交换数据

使用Bundle进行交换数据

传递数据的关键

Bundle bundle=new Bundle();
bundle.putCharSequence("quyu",quyu);
intent.putExtras(bundle);

接收数据的关键

Intent intent=getIntent();
Bundle bundle&#Extras();
String quyu&#String("quyu");

进行传数据

Button button=findViewById(R.id.submit);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取TextView里面的字符String quyu=((EditText)findViewById(R.id.quyu)).getText().toString();String jiedao=((EditText)findViewById(R.id.jiedao)).getText().toString();String xiangqing=((EditText)findViewById(R.id.xiangqing)).getText().toString();String name=((EditText)findViewById(R.id.name)).getText().toString();String phone=((EditText)findViewById(R.id.phone)).getText().toString();String youbian=((EditText)findViewById(ubian)).getText().toString();Intent intent=new Intent(MainActivity.this,ShowAddressActivity.class);//实例化一个BundleBundle bundle=new Bundle();bundle.putCharSequence("quyu",quyu);//将字符加入bundle里面bundle.putCharSequence("jiedao",jiedao);bundle.putCharSequence("xiangqing",xiangqing);bundle.putCharSequence("name",name);bundle.putCharSequence("phone",phone);bundle.putCharSequence("youbian",youbian);intent.putExtras(bundle);//把Bundle放入intent里面startActivity(intent);startActivity(intent);}});

进行接数据

Intent intent=getIntent();//获得传递过来的IntentBundle bundle&#Extras();//获得Intenti携带过来的BundleString quyu&#String("quyu");String jiedao&#String("jiedao");String xiangqing&#String("xiangqing");String name&#String("name");String phone&#String("phone");String youbian&#String("youbian");TextView textView=findViewById(view);String address=quyu+jiedao+xiangqing+name+phone+youbian;textView.setText(address);

调用另一个Activity并返回结果

传递数据的步骤

1.在主页面开启回传的activityIntent intent=new Intent(MainActivity.this,TouActivity.class);startActivityForResult(intent,0x007)
2.在另一个Activity中进行回传数据Intent intent=getIntent();//获得传递过来的IntentBundle bundle=new Bundle();bundle.putInt("tou",tou[position]);//给Bundle复制intent.putExtras(bundle);//把bundle传递给intentsetResult(0x007,intent);//把intent回传过去finish();//结束
3.在主页面处理回传过来的数据@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {ActivityResult(requestCode, resultCode, data);if(requestCode==0x007 && resultCode==0x007)//判断回传代码结果是否正确{ImageView imageView=findViewById(R.id.Image1);Bundle bundle&#Extras();//获得回传的结果int imageid&#Int("tou");//去除Key对应的值imageView.setImageResource(imageid);}
}

主页面代码

public class MainActivity extends AppCompatActivity {//处理回传的结果@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {ActivityResult(requestCode, resultCode, data);if(requestCode==0x007 && resultCode==0x007)//判断回传代码结果是否正确{ImageView imageView=findViewById(R.id.Image1);Bundle bundle&#Extras();//获得回传的结果int imageid&#Int("tou");//去除Key对应的值imageView.setImageResource(imageid);}}@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);Button button=findViewById(R.id.Submit);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,TouActivity.class);startActivityForResult(intent,0x007);}});}
}

从页面代码

public class TouActivity extends AppCompatActivity {
private int []tou=new int []{uxiang1,uxiang2,uxiang3,uxiang4,uxiang5};@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_tou);ArrayList<HashMap<String,Object>>listItem=new ArrayList<HashMap<String,Object>>();for(int i=0;i<tou.length;i++){HashMap<String,Object> map=new HashMap<String, Object>();map.put("touxiang",tou[i]);listItem.add(map);}SimpleAdapter simpleAdapter=new SimpleAdapter(this,listItem,id_view_layout,new String[]{"touxiang"},new int []{R.id.image});GridView gridView=findViewById(idview);gridView.setAdapter(simpleAdapter);gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent=getIntent();//获得传递过来的IntentBundle bundle=new Bundle();bundle.putInt("tou",tou[position]);//给Bundle复制intent.putExtras(bundle);//把bundle传递给intentsetResult(0x007,intent);//把intent回传过去finish();//结束}});}
}

总结

bundle.putCharSequence(String Key,CharSequence value );是传递字符串的接受用getString(Key)
bundle.putInt(String Key,int value);是传递整形的接受用getInt(Key)

Fragment 碎片

静态调用

在创建项目的时候选择使用支持suppor libraries

之后我们再创建 类然后去去继承 Fragment,同时还要创建匹配的layout布局文件

package com.fragmenttest1;import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class LeftFragment extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view=inflater.inflate(R.layout.left_fragment,container,false);//指定布局文件return view;}
}

然后在activity_main布局文件中静态调用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"tools:context=".MainActivity"><fragmentandroid:id="@+id/fragment1"android:layout_width="match_parent"android:layout_height="match_parent"android:name="com.fragmenttest1.LeftFragment"android:layout_weight="1"/><fragmentandroid:id="@+id/fragment2"android:layout_width="match_parent"android:layout_height="match_parent"android:name="com.fragmenttest1.RightFragment"android:layout_weight="1"/></LinearLayout>

动态调用

布局文件还是一样,在MainActicity中写入一下代码

 //获得fragmentFragmentManager fragmentManager=getSupportFragmentManager();FragmentTransaction transaction=fragmentManager.beginTransaction();place(R.id.middleFragment,new SelectWeatherFragment());transactionmit();

在fragment中获得在fragmen布局文件中的控件
需要使用view调用例如

public class SelectWeatherFragment extends Fragment {private View view;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {view=inflater.inflate(R.layout.select_weather_fragment,container,false);Button button=view.findViewByID(R.id.Button);return view;

Intent

ComComponentName 组件名启动另一个Activity

bUtton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent();//componentName启动另一个activity//第一个参数应用的包名//第二个参数完整的类名ComponentName componentName=new ComponentName(&#ample.intent",&#ample.intent.DetailActivity");intent.setComponent(componentName);startActivity(intent);}});

Activity调用另一个Activity并获得返回值

我们需要使用一下代码进行启动activity

 Intent intent = new Intent(getActivity(), CityListActivity.class);startActivityForResult(intent, 1);

并需要重写onActivityResult方法

@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {ActivityResult(requestCode, resultCode, data);switch (requestCode) {case 1:if (resultCode == RESULT_OK) {//逻辑代码break;}}

并在另一个Activity中需要关闭此活动的事件中写入一下代码

Intent intent =new Intent();intent.putExtra("cityInfo",(position).get("name"));setResult(RESULT_OK,intent);//第一个参数是返回码,通常使用RESULT_OKfinish();

Action和Data属性

Action用来指定将要执行的动作
active详细介绍

Data用来指定将要执行的数据的

物理按键事件处理

每一个物理按键都有的三种方法

onKeyDown():按下方法
onKeyUp():抬起方法
onKeyLongPress():长按方法
常量物理按键名称
KEYCODE_VOLUME_UP声音增大键
KEYCODE_VOLUME_DOWN声音减小键
KEYCODE_POWER电源键
KEYCODE_HOMEhome键
KEYCODE_BACK返回键

按两次返回键退出程序

 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {//判断按下的键是否等于返回键if(System.currentTimeMillis()-time>2000)//判断两次按下时差是否大于两秒{time=System.currentTimeMillis();Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();return true;}else{finish();it(0);//完全退出应用}}KeyDown(keyCode, event);}

触摸屏事件处理

长按事件setOnLongClickListener()

长按一个图片显示一个菜单

@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView=findViewById(R.id.ImageView1);imageView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {registerForContextMenu(v);//将当前activity里面的菜单栏注册到长按事件中return false;}});}//重写菜单栏@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {CreateContextMenu(menu, v, menuInfo);menu.add("收藏");menu.add("保存");}

创建菜单栏

在res文件中创建一个menu文件res->New->Directory取名menu
然后在menu文件中创建xml文件menu->New->Menu Resource File取名maim
然后在文件写入一下代码

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android=""><itemandroid:id="@+id/add_item"android:title="add" /><itemandroid:id="@+id/remove_item"android:title="remove" />
</menu>

MainActivity代码

public class MainActivity extends AppCompatActivity {@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (ItemId()){case R.id.add_item:Toast.makeText(this, "我是add", Toast.LENGTH_SHORT).show();break;case ve_item:Toast.makeText(this, "我是remove", Toast.LENGTH_SHORT).show();break;}return true;}@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().u.main,menu);return true;}
}

触摸事件

setOnTouchListener()触摸事件监听器

跟着手指移动的图片

自定义view(一张图片)

t.Context;
aphics.Bitmap;
aphics.BitmapFactory;
aphics.Canvas;
aphics.Paint;
import android.view.View;public class HatView extends View {public  float bipmapX;public float bipmapY;public HatView(Context context) {super(context);bipmapX=65;bipmapY=0;}//对图片进行重绘@Overrideprotected void onDraw(Canvas canvas) {Draw(canvas);Paint paint=new Paint();Bitmap bitmap= BitmapFactory.Resources(),R.mipmap.hat);canvas.drawBitmap(bitmap,bipmapX,bipmapY,paint);if(bitmap.isRecycled())//判断bitmap是否被回收{le();}}
}

MainActivity类

public class MainActivity extends AppCompatActivity {
private long time=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);HatView hatView=new HatView(this);//实例化自定义viewhatView.setOnTouchListener(new View.OnTouchListener() {//绑定触摸事件@Overridepublic boolean onTouch(View v, MotionEvent event) {//MotinEvent 保存触摸x,y坐标,时间等细节信息hatView.bipmapY&#Y()-180;hatView.bipmapX&#X()-250;hatView.invalidate();//进行重绘return true;}});RelativeLayout re=findViewById(la);re.addView(hatView);//将自定义view加入布局文件}

单击事件与触摸事件的区别

其实在这两个事件中会先激发触摸事件,当触摸事件返回值为true时,则不会激发单击事件,当触摸事件返回值为false时,不仅会激发发触摸事件,还会激发单击事件


Button but=findViewById(R.id.Button1);but.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("fist","我是单击");}});but.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {Action()==MotionEvent.ACTION_DOWN)//判断是否时按下Log.i("fist","我是触摸");return false;}});

上面有两个事件一个是单击,一个是触摸,当触摸事件的返回值为true时则不会激发单击事件,当返回值为false时不仅会激发触摸事件也会激发单击事件。

绘图与动画

绘制矩形

自定义一个view

t.Context;
aphics.Canvas;
aphics.Paint;
import android.view.View;public class MyView extends View {public MyView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {Draw(canvas);Paint paint = new Paint();//创建一个画笔paint.setColor(0xffff6600);//设置画笔颜色paint.setStyle(Paint.Style.FILL);//设置填充方式,FILL表示填充,STROKE表示描边canvas.drawRect(10,10,280,150,paint);//第一个参数:屏幕左侧距矩形左边的距离//第二个参数:屏幕上侧距矩形上边的距离//第三个参数:屏幕左侧距矩形右边的距离//第四个参数:屏幕上侧距矩形底边的距离}
}

绘制几何图形

drawArc()绘制弧形
drawCircle()
drawLine()
drawRect()
drawRoundRect()

Bitmap与BitmapFactory

BitmapFactory1.通过图片文件创建,2.通过输入流创建
Bitmap1.挖取一块图像创建,2.将源位图缩放生成,3.使用颜色数组创建
decodeFile()通过路径创建
decodeResource()通过资源文件Id创建
decodeStream()通过输入流创建
createBitmap()根据重载形式创建对应的bitmap对象
compress()压缩Bitmap对象并保存到文件输出流
createScaledBitmap()将源位图缩放并创建新的Bitmap对象

创建一格图片并挖取图片上的一小块

public class MyView extends View {public float bitmapX;public float bitmapY;public MyView(Context context) {super(context);bitmapX = 100;bitmapY = 100;}@Overrideprotected void onDraw(Canvas canvas) {Draw(canvas);Paint paint = new Paint();//通过R资源文件获取图片Bitmap bitmap = BitmapFactory.Resources(), R.mipmap.beijing);//绘制图片canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint);if (bitmap.isRecycled()) {le();}
//从bitmap中挖取一块图片Bitmap bitmap1&#ateBitmap(bitmap,23,89,200,300);//第二个参数,左上角的x坐标//第三个参数,左上角的y坐标//第四个参数,右下角的x坐标//第五个参数,右下角的y坐标canvas.drawBitmap(bitmap1,0,0,paint);}
}

逐帧动画

1.在drawable文件下创建Drawable Resource File 文件在文件中写入一下代码

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="">
<!--   drawable设置动画资源,duration设置显示时长--><item android:drawable="@drawable/img001" android:duration="30"/><item android:drawable="@drawable/img002" android:duration="30"/><item android:drawable="@drawable/img003" android:duration="30"/><item android:drawable="@drawable/img004" android:duration="30"/><item android:drawable="@drawable/img005" android:duration="30"/><item android:drawable="@drawable/img006" android:duration="30"/>
</animation-list>

需要把图片资源也放到drawable文件下

2.需要在布局文件中用backgroud属性引用动画资源文件

 android:background="@drawable/fairy"

最后用java代码控制动画的开始

LinearLayout linearLayout=findViewById(R.id.Li);//获取资源文件AnimationDrawable animationDrawable= (AnimationDrawable) Background();//获取动画资源文件linearLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(flage){animationDrawable.start();//设置动画开始flage=false;}else{animationDrawable.stop();//设置动画停止flage=true;}}});

补间动画

名称效果
alpha透明渐变效果
rotate旋转动画
scale缩放动画
translate平移动画
alpha属性
fromAlpha开始透明度
toAlpha结束透明度
duration持续时间多少毫秒
rotate属性
fromDegrees开始角度
toDegrees结束角度
pivotX旋转中心轴; 50%:表示图片的一半
pivotY旋转中心轴; 50%:表示图片的一半
duration持续时间多少毫秒
scale属性
fromeXScaleX轴起始点的缩放比例 1表示原比例
fromeYScaleY轴起始点的缩放比例 1表示原比例
toXScaleX轴起结束的缩放比例 2表示放大两倍
toYScaleY轴起结束的缩放比例 2表示放大两倍
pivotX旋转中心轴; 50%:表示图片的一半
pivotY旋转中心轴; 50%:表示图片的一半
duration持续时间多少毫秒
translate属性
fromXDelta起始点的X坐标
fromYDelta起始点的Y坐标
toXDelta结束点的的X坐标
toYDelta结束点的Y坐标
duration持续时间多少毫秒

需要在res文件下创建一个anim资源文件,然后在在anim资源文件下创建一个动画文件

然后写入一下代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="">
<alpha android:fromAlpha="1" android:toAlpha="0"android:duration="6000"/><scale android:fromXScale="1" android:fromYScale="1"android:toXScale="2" android:toYScale="2"android:pivotX="50%" android:pivotY="50%"android:duration="2000"/><rotate android:fromDegrees="0" android:toDegrees="180"android:pivotX="50%" android:pivotY="50%"android:duration="2000"/>
</set>
public class MainActivity extends AppCompatActivity {
private boolean flage=true;@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView=findViewById(R.id.image);imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//获取动画资源,第二个参数是动画资源文件Animation animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);imageView.startAnimation(animation);//给Imageview添加动画}});}
}

AlertDialog 对话框讲解

标准对话框

//进行创建AlertDialog实例AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();alertDialog.setIcon(R.mipmap.a100);//设置图标alertDialog.setTitle("乔布斯");//设置标题alertDialog.setMessage("活着就是为了改变世界,难道还有其他原因码?");//设置消息框内容//给消息框添加按钮//第一个参数是按钮的类型   BUTTON_NEGATIVE:表示否//                       BUTTON_POSITIVE:表示确定按钮//                       BUTTON_NEUTRAL:表示中立按钮//第二个参数:按钮上的文本//第三个参数:按钮的监听事件alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "否", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "您点击了否按钮", Toast.LENGTH_SHORT).show();}});alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "您点击了确定按钮", Toast.LENGTH_SHORT).show();}});alertDialog.show();

带列表的对话框

//带列表项的对话框final String[] items = new String[]{"当你有市名", "秋季若克", "虚心若愚", "让你更出众", "或者"};AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setIcon(R.mipmap.a100);//设置图标builder.setTitle("请选择你喜欢的名言");//设置标题//为消息框绑定列表项,并且设置列表点击监听事件builder.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "你选择了" + items[which].toString(), Toast.LENGTH_SHORT).show();}});ate().show();//创建消息框并显示

带单选按钮的对话框

//创建带单选想的对话框final String[] items1 = new String[]{"扎克博客", "乔布斯", "拉力", ",马云", "冯家振", "安迪"};android.app.AlertDialog.Builder builder1 = new android.app.AlertDialog.Builder(MainActivity.this);builder1.setIcon(R.mipmap.a100);builder1.setTitle("如果让你选择,你最想做那个?");//设置带单选按钮的对话框//第一个参数:列表项//第二个参数:默认选择那个,从0开始//第三个参数:单选按钮的点击事件监听器builder1.setSingleChoiceItems(items1, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "您选择了" + items1[which], Toast.LENGTH_SHORT).show();}});//设置按钮,//第一个参数是按钮文本框//第二个参数是:按钮单击事件监听器,可以为空也可以不为空builder1.setPositiveButton("确定", null);ate().show();

带复选框的按钮对话框

//设置多选列表项的对话框boolean[] checked = new boolean[]{true, false, false, false, true};final String[] items2 = new String[]{"开心消消乐", "球球大作战", "欢乐对地主", "梦幻西游", "超级玛莉亚"};android.app.AlertDialog.Builder builder2 = new android.app.AlertDialog.Builder(MainActivity.this);builder2.setIcon(R.mipmap.a100);builder2.setTitle("请选择你最喜欢的游戏");builder2.setMultiChoiceItems(items2, checked, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {checked[which] = isChecked;}});builder2.setPositiveButton("确定", new DialogInterface.OnClickListener() {String message="您选择了:n";@Overridepublic void onClick(DialogInterface dialog, int which) {for(int i=0;i<checked.length;i++){if(checked[i]==true){message+=items2[i]+"n";}}Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();}});ate().show();

完整代码

布局文件很简单就是四个按钮,点击不同的按钮弹出不同模式的对话框

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""xmlns:app=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center_horizontal"tools:context=".MainActivity"><Buttonandroid:id="@+id/Button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="显示带取消,确定按钮的对话框"/><Buttonandroid:id="@+id/Button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="显示带列表的对话框"/><Buttonandroid:id="@+id/Button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="显示带单选列表项的对话框"/><Buttonandroid:id="@+id/Button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="显示带多选列表项的对话框"/></LinearLayout>
package com.alertdialog;import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;t.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button button1;private Button button2;private Button button3;private Button button4;@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);button1 = findViewById(R.id.Button1);button2 = findViewById(R.id.Button2);button3 = findViewById(R.id.Button3);button4 = findViewById(R.id.Button4);button1.setOnClickListener(this);button2.setOnClickListener(this);button3.setOnClickListener(this);button4.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.Button1://创建标准的对话框//进行创建AlertDialog实例AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();alertDialog.setIcon(R.mipmap.a100);//设置图标alertDialog.setTitle("乔布斯");//设置标题alertDialog.setMessage("活着就是为了改变世界,难道还有其他原因码?");//设置消息框内容//给消息框添加按钮//第一个参数是按钮的类型   BUTTON_NEGATIVE:表示否//                       BUTTON_POSITIVE:表示确定按钮//                       BUTTON_NEUTRAL:表示中立按钮//第二个参数:按钮上的文本//第三个参数:按钮的监听事件alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "否", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "您点击了否按钮", Toast.LENGTH_SHORT).show();}});alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "您点击了确定按钮", Toast.LENGTH_SHORT).show();}});alertDialog.show();break;case R.id.Button2://带四个列表项的对话框final String[] items = new String[]{"当你有市名", "秋季若克", "虚心若愚", "让你更出众", "或者"};AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setIcon(R.mipmap.a100);//设置图标builder.setTitle("请选择你喜欢的名言");//设置标题//为消息框绑定列表项,并且设置列表点击监听事件builder.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "你选择了" + items[which].toString(), Toast.LENGTH_SHORT).show();}});ate().show();//创建消息框并显示break;case R.id.Button3://创建带单选想的对话框final String[] items1 = new String[]{"扎克博客", "乔布斯", "拉力", ",马云", "冯家振", "安迪"};android.app.AlertDialog.Builder builder1 = new android.app.AlertDialog.Builder(MainActivity.this);builder1.setIcon(R.mipmap.a100);builder1.setTitle("如果让你选择,你最想做那个?");//设置带单选按钮的对话框//第一个参数:列表项//第二个参数:默认选择那个,从0开始//第三个参数:单选按钮的点击事件监听器builder1.setSingleChoiceItems(items1, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this, "您选择了" + items1[which], Toast.LENGTH_SHORT).show();}});//设置按钮,//第一个参数是按钮文本框//第二个参数是:按钮单击事件监听器,可以为空也可以不为空builder1.setPositiveButton("确定", null);ate().show();break;case R.id.Button4://设置多选列表项的对话框boolean[] checked = new boolean[]{true, false, false, false, true};final String[] items2 = new String[]{"开心消消乐", "球球大作战", "欢乐对地主", "梦幻西游", "超级玛莉亚"};android.app.AlertDialog.Builder builder2 = new android.app.AlertDialog.Builder(MainActivity.this);builder2.setIcon(R.mipmap.a100);builder2.setTitle("请选择你最喜欢的游戏");builder2.setMultiChoiceItems(items2, checked, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {checked[which] = isChecked;}});builder2.setPositiveButton("确定", new DialogInterface.OnClickListener() {String message="您选择了:n";@Overridepublic void onClick(DialogInterface dialog, int which) {for(int i=0;i<checked.length;i++){if(checked[i]==true){message+=items2[i]+"n";}}Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();}});ate().show();break;}}
}

使用Notification在状态栏显示通知

步骤

1.获取系统的NotificationManager服务---》个体SystemService()
2. 创建 Notification对象
3. 为Notification对象设置属性
4. 发送Notifacation通知---》NotificationMan
5. ager类的notify()方法

注意:通知图标不能太大太大的话只会显示原生安卓图标,不会显示自定义图标,目前安卓显示图标只支持48*48

/*** 创建并发送通知*///获取一个通知管理器NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//创建一个通知对象Notification.Builder notification = new Notification.Builder(MainActivity.this);//通知打开后自动消失notification.setAutoCancel(true);//给通知设置小图标notification.setSmallIcon(R.mipmap.a100);//给通知设置一个标题notification.setContentTitle("奖励百万红包");//设置通知的内容notification.setContentText("点击查看详情");//设置发送时间notification.setWhen(System.currentTimeMillis());//即时发送//设置默认选项,设置声音和震动notification.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
//创建一个启动页面的IntentIntent intent = new Intent(MainActivity.this, DitailActivity.class);//PendingIntent 的作用是可以由其他的应用程序在稍晚一点在启动Intent//第一个参数:上下文对象//第二个阐述:请求码,可以是任意值//第三个参数:我们需要启动的intent//第四个参数:标志码PendingIntent pendingIntent = Activity(MainActivity.this, 0, intent, 0);//设置通知栏点击跳转notification.setContentIntent(pendingIntent);//发送通知ify(NOTIFICATION, notification.build());

广播

定义广播以及接收广播步骤

1.在需要的地方定义一个广播
2.重新定义一个广播接收器类并且继承BroadcastReceiver重写Onreceive方法
3.在Mainfest文件中注册广播接收器

开机自启广播

定义一个广播

package com.alertdialog;t.BroadcastReceiver;
t.Context;
t.Intent;
import android.widget.Toast;public class MyReciver  extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Action().equals("android.intent.action.BOOT_COMPLETED")){Intent intent1=new Intent(context, MainActivity.class);intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加自启动标志context.startActivity(intent1);//启动Toast.makeText(context, "我已启动", Toast.LENGTH_SHORT).show();}}
}

然后在Mainfest文件中注册广播,定义开机自启广播需要开启开机自启广播权限

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

在application节点中注册广播

 <!--        注册广播  enable:表示这个广播能否被实例化,exported:表示能否接受其他app发送过来的广播--><receiverandroid:name=".MyReciver"android:enabled="true"android:exported="true"><!--        设置intent过滤器--><intent-filter><action android:name="扎克博客" /><action android:name="mayun" /><action android:name=&#CONNECTIVITY_CHANGE" /><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>

发送我们自定义的广播

 //发送一条广播Intent intent = new Intent();intent.setAction("扎克博客");//为Intent添加一个动作sendBroadcast(intent);//发送广播

然后在自定义广播中判断我们的动作

@Overridepublic void onReceive(Context context, Intent intent) {Action().equals("扎克博客")) {Toast.makeText(context, "收到-----扎克博客", Toast.LENGTH_SHORT).show();}else Action().equals("马云")){Toast.makeText(context, "收到-----马云", Toast.LENGTH_SHORT).show();}}

选中背景变色

仿微信 选中通讯录微信等图标变色
实现的方式

1.点击底部导航栏图片切换页面同时图标页进行填充色
2.切换的页面切换的是fragment
3.图片是矢量图

利用以下方法

public void setImageViewColor(ImageButton view, int colorId){Drawable drawable = Drawable().mutate();Drawable temp = DrawableCompat.wrap(drawable);ColorStateList colorStateList = ColorStateList.Resources().getColor(colorId));DrawableCompat.setTintList(temp, colorStateList);view.setImageDrawable(temp);}

然后fragment的OncreateView方法中进行填充颜色

public class SelectWeatherFragment extends Fragment
{private View view;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){view = inflater.inflate(R.layout.select_weather_fragment, container, false);mainActivity=(MainActivity)getActivity();//获取MainactivityweatherButton=mainActivity.findViewById(R.id.weatherButton);//获取MainActivity图标icoStyle.setImageViewColor(weatherButton, );//给图标填充颜色return view;}}

最后在onDestroyView方法进还原颜色

@Overridepublic void onDestroyView(){DestroyView();icoStyle.setImageViewColor(weatherButton, R.color.black);weatherTextView.setTextColor(Color.argb(100,0,0,0));}
``## 选中自定义item背景变色在Drawable中创建selector文件命名为selector_l
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<selector xmlns:android=""><item android:state_focused="true" android:drawable="@color/gray"/><item android:state_pressed="true" android:drawable="@color/gray1"/><item android:drawable="@color/white"/>
</selector>

布局文件

<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:background="@drawable/selector_setting_list"android:clickable="true"<--- 最重要 --->android:orientation="horizontal">

自定义Adapter适配器

layout布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/Value"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@color/colorEditText"android:layout_marginLeft="10px"android:textSize="48px"/><Viewandroid:layout_width="40px"android:layout_height="40px"/><TextViewandroid:id="@+id/Key"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone"android:text="nihao"android:textColor="@color/colorEditText"android:textSize="48px"/></LinearLayout>

适配器文件

ample.optocouplercabinet.storage.adapter;t.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;ample.optocouplercabinet.R;import java.util.ArrayList;
import java.util.HashMap;public class CustomSpinnerAdapter extends BaseAdapter
{private Context context=null;private ArrayList<HashMap<String,String>> positionList=null;private ViewHolder viewHolder;public CustomSpinnerAdapter(Context context,ArrayList<HashMap<String,String>> positionList){t=context;this.positionList=positionList;}@Overridepublic int getCount(){return positionList.size();}@Overridepublic Object getItem(int position){(position);}@Overridepublic long getItemId(int position){return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent){if(convertView==null){viewHolder=new ViewHolder();convertView= LayoutInflater.from(context).inflate(R.layout.custom_adapter_spinner,null);viewHolder.Key=convertView.findViewById(R.id.Key);viewHolder.Value=convertView.findViewById(R.id.Value);convertView.setTag(viewHolder);}else{viewHolder=(Tag();}viewHolder.Key.(position).get("Key").toString());viewHolder.Value.(position).get("Value").toString());return convertView;}public class ViewHolder{TextView Key;TextView Value;}
}

Activity文件

positionKey=new String[]{"1,1","1,2","1,3","1,4","1,5","1,6","2,1","2,2","2,3","2,4","2,5","2,6","3,1","3,2","3,3","3,4","3,5","3,6","4,1","4,2","4,3","4,4","4,5","4,6","5,1","5,2","5,3","5,4","5,5","5,6","6,1","6,2","6,3","6,4","6,5","6,6","7,1","7,2","7,3","7,4","7,5","7,6","8,1","8,2","8,3","8,4","8,5","8,6","9,1","9,2","9,3","9,4","9,5","9,6","10,1","10,2","10,3","10,4","10,5","10,6","11,1","11,2","11,3","11,4","11,5","11,6","12,1","12,2","12,3","12,4","12,5","12,6"};positionValue=new String[]{"1,A","1,B","1,C","1,D","1,E","1,F","2,A","2,B","2,C","2,D","2,E","2,F","3,A","3,B","3,C","3,D","3,E","3,F","4,A","4,B","4,C","4,D","4,E","4,F","5,A","5,B","5,C","5,D","5,E","5,F","6,A","6,B","6,C","6,D","6,E","6,F","7,A","7,B","7,C","7,D","7,E","7,F","8,A","8,B","8,C","8,D","8,E","8,F","9,A","9,B","9,C","9,D","9,E","9,F","10,A","10,B","10,C","10,D","10,D","10,E","11,A","11,B","11,C","11,D","11,D","11,E","12,A","12,B","12,C","12,D","12,D","12,E"};
ArrayList<HashMap<String,String>> positionList=new ArrayList<HashMap<String, String>>();HashMap<String,String> map;for(int i=0;i<positionKey.length;i++){map=new HashMap<>();map.put("Key",positionKey[i]);map.put("Value",positionValue[i]);positionList.add(map);}CustomSpinnerAdapter customSpinnerAdapter=new CustomSpinnerAdapter(StorageActivity.this,positionList);spnPosition.setAdapter(customSpinnerAdapter);

本文发布于:2024-02-04 17:37:13,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170712758457866.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:核心   笔记   Android
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23