CreateNewProject
- 下载Android SDK
- 创建项目,选择
Android,选择Empty Activity,其他默认
Component
Components
EditText,文本编辑框组件android:hint="QQ号/微信号"—— 显示的默认文字
<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="10dp"android:hint="QQ号/微信号" />
+ `android:drawableLeft="@mipmap/building"` ---- 在输入框的左边显示小图片+ `android:drawablePadding="5dp"` ---- 设置图片和输入框的间距+ `android:lines="5"` --- 设置一边编辑框的最大行数
TextView—— 文本框组件android:maxWidth="210dp"—— 设置最大宽度drawableLeft—— 同上
ImageButton图片按钮,没有Text属性src属性添加背景图片,background属性更改背景颜色…
RadioButton单选按钮RadioGroup单选按钮组 ,,将一组RadioButton括起来- 获取已点击按钮的值
RadioGroup rg = findViewById(R.id.radiogroup1);rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int i) {// i 为被选中的按钮的id号RadioButton t = findViewById(i);Toast.makeText(RelativeActivity.this,"You feel "+t.getText()+"!", Toast.LENGTH_SHORT).show();}});
CheckBox复选框,多个的话,直接写多个就可以了,不需要括起来DatePicker日期选择器TimePicker时间选择器
tp.setIs24HourView(true); // 设置为24制
Chronometer计时器ProgressBar进度条设置
style属性可更改进度条的样式?android:attr/progressBarStyleHorizontal—— 水平细进度条?android:attr/progressBarStyleSmall—— 旋转小进度条?android:attr/progressBarStyleLarge—— 旋转大进度条@android:style/Widget.ProgressBar—— 另一种样式 灰色圆形进度条@android:style/Widget.ProgressBar.Horizontal——- 灰色水平@android:style/Widget.ProgressBar.Small—— 圆形小灰色
SeekBar拖动条android:thumb="@mipmap/hua"—— 设置拖动点为一张图片
RatingBar—— 星星评分条android:isIndicator="true"—— 设置为不可改变android:numStars="6"—— 设置星星的数量
// 获取已选的星星的数量float rating = rb.getRating();
ImageView图像视图- 默认XY等比例缩放,,设置
android:scaleType="fitXY"XY分别缩放 android:adjustViewBounds="true"—— 设置了这个之后,可以设置图片的最大宽度、最大高度android:maxWidth="60dp" android:maxHeight="60dp"
android:tint="#cccc"—— 图片着色
- 默认XY等比例缩放,,设置
ImageSwitcher图像切换器GridView—— 网格组件- 使用适配器来控制显示内容
android:numColumns="3"—— 设置列数android:verticalSpacing="5dp" android:horizontalSpacing="5dp"—— 设置行列间隔
Spinner下拉列表android:entries="@array/ctype"—— 配置子元素,需要在values下创建一个xml文件,ctype为名字
ListView列表视图android:entries="@array/ctype"—- 配置子元素,同上Spinner和ListView都可以利用适配器来配置子元素。
滚动条组件:
ScrollView垂直滚动条,超出的内容可以由上下滚动来显示HorizontalScrollView水平滚动条- 滚动条组件内部只能含有一个直接儿子组件,当有多个内容的时候需要用
Layout组件括起来
ViewFlipper—— 页面/图片滚动- 不过不知怎的不能通过他的id来获取它
Common_attribute
- id:
android:id="@+id/gridlayout" 宽度:
android:layout_width="match_parent"match_parent与父容器相同wrap_content包裹自身的内容
- 高度:
android:layout_height="match_parent" 文本:
android:text="@string/app_name"@string/xx需要在res/values/string.xml里面设置值
- 文本文字大小:
android:textSize="24sp" 背景:
android:background="@mipmap/psb"@mipmap/xx是res/mipmap下面的图片资源- 背景颜色:
android:background="#ccc"
- 内边距:
android:paddingBottom="20dp" android:paddingStart="20dp" android:paddingLeft="20dp" android:paddingRight="20dp"or
android:padding="20dp" - 外边距:
android:layout_margin="@android:dimen/app_icon_size"or
android:layout_marginLeft="100dp" android:layout_marginStart="100dp" android:layout_marginBottom="100dp" android:layout_marginEnd="100dp"等等 参照定位位置:
app:layout_constraintLeft_toLeftOf="parent"——参照是父组件app:layout_constraintTop_toBottomOf="@+id/hanata"+android:layout_marginTop="12dp",,参照点的id为hanata的组件的底部,且向上间隔12dp- 当外围使用的是
RelativeLayout和ConstraintLayout时,内部的子组件才有这个属性 android:layout_below="@+id/textView1"—— 在这个组件的下面
- 布局管理器设置子组件的位置:
android:gravity="right|bottom"(部分试用)
View
view是界面的组成部分- UI组件的层次结构
ViewGroup ---View|--View|--ViewGroup --- View|-- View
控制UI界面的方式
- 使用Xml文件
- 使用Java文件
- 混合使用Xml与Java文件来控制
- 开发自定义的View
子类TextView
ViewGroup
- 用于容纳其他组件
ViewGroup.LayoutParams类
设置布局的高度和宽度等属性
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(60,40);
ViewGroup.MarginLayoutParams类
设置外边距大小
ConstraintLayout
- 约束布局管理器, 网友讲解
FrameLayout
- 帧布局管理器,可用于显示层叠的内容,并且可以拖动
android:foreground="@mipmap/man"—— 设置前景图像,始终位于最上层android:foregroundGravity="bottom"—— 设置前景图像的上下左右位置
GridLayout
- 网格布局管理器
排列方向:
- 水平方向:
android:orientation="horizontal"
- 水平方向:
- 行数、列数:
android:rowCount="2"
android:columnCount="4" 子组件:
android:layout_row="0" android:layout_column="2"—— 在第几列第几行android:layout_colunmSpan="2"—— 跨几列android:layout_rowSpan="2"—— 跨几行android:layout_gravity="center"—— 在表格的位置
RelativeLayout
- 相对布局管理器
android:gravity="center"—— 可以设置子组件为居中显示android:ignoreGravity="@android:id/button1"—— 使id为这个的子组件不受gravity影响
android:layout_centerInParent="true"—— 子组件在父组件的正中间
LinearLayout
线性布局管理器,将其中的组件按照水平或垂直的方式排列
- 水平方向:
android:orientation="horizontal" - 垂直方向:
android:orientation="vertical"
- 水平方向:
- 设置子组件:
android:gravity="right|bottom" 子组件属性:
android:layout_weight—— 子组件占父组件剩余空间的比例- 剩余空间是 除了已有组件所占的空间之外的地方
TableLayout
- 表格布局管理器
android:collapseColumns="1"—— 使第几列被隐藏android:stretchColumns="0"—— 允许第几列自动填充剩余的空间android:shrinkColumns="3"—— 当内容超出屏幕范围时,使某一列自动缩小,以便让其他内容显示出来- 使用
TableRow来控制表格的行
TabHost
- 标签页,选项卡,可以左右切换的控制器
- 设置固定id
android:id="@android:id/tabhost" - 包含:id似乎都是固定这样的
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TabWidgetandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@android:id/tabs"></TabWidget><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@android:id/tabcontent"></FrameLayout></LinearLayout>
- 需自定义两个供使用的xml文件,表示每个选项卡里面的内容
- 在Java文件里面配置选项卡
Fragment
- 不论是在xml文件里面添加还是使用Java文件添加Fragment,都出错,但是项目和老师的不一样,所以以后再改 ——
id !! 至少三个文件
- 使用
fragment的主文件
- 使用
<fragmentandroid:id="@+id/frag"android:layout_width="match_parent" android:layout_height="wrap_content"android:name="com.example.andriodapp.FragmentTest"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"tools:layout="@layout/activity_hana"android:layout_marginTop="200dp"/>
+ `fragment`的布局文件,一般布局+ `java`文件
public class FragmentTest extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = View.inflate(getContext(), R.layout.activity_hana, null);return view;}}
intent
intent种类:
- 显式:
Intent intent = new Intent(Activity1.this, Activity2.class); - 隐式,,不需要用到目标组件的名称
- 显式:
属性
- Component
- Action
- Data
- Category
- intent-filter,过滤器
Event
物理按键
物理按键事件
onKeyDown()onKeyUp()onKeyLongPress()setOnLongClickListener—— 长按事件的事件监听器setOnTouchListener—— 触摸事件的事件监听器
各个物理按键所表示的常量
- 音量键 ——
KEYCODE_VOLUME_UP..KEYCODE_VOLUME_DOWN - 电源键 ——
KEYCODE_POWER - 返回键 ——
KEYCODE_BACK - 主屏键 ——
KEYCODE_HOME - 菜单键 ——
KEYCODE_MENU
- 音量键 ——
Java_Event
GridLayout layout = findViewById(R.id.gridlayout);—— 从界面中找出ID为这个的组件frameLayout.setBackgroundResource(R.mipmap.psb);—— 设置背景图片TextView textView = new TextView(this);—— 定义TextView组件frameLayout.addView(textView);—— 加入组件到Layout中使用 Log 类来输出日志信息
- Log.i() - 普通信息
- Log.d() - 调试日志
- Log.v() - 冗余日志
- Log.e() - 错误日志
- Log.w() - 警告日志
static String TAG = "MainActivity";Log.e(TAG, "错误信息");Log.i(TAG, "普通信息");Log.d(TAG, "调试信息");Log.v(TAG, "荣誉信息");
text.setText(getResources().getString(R.string.name))—— 在Java文件里面为Text指定strings.xml的资源text2.setTextColor(ContextCompat.getColor(MainActivity.this,R.color.colorAccent))—— 在Java文件里面更改text的文字颜色text.setTextSize(getResources().getDimension(R.dimen.text))—— 在Java文件里面更改text的文字尺寸String [] arr = getResources().getStringArray(R.array.listitem)—— 获取字符串资源- 在
drawable文件夹里新建一个drawable文件,名为edittext_focused,指定元素得到焦点、失去焦点的样式
<item android:state_focused="true" android:color="#111"/><item android:state_focused="false" android:color="#aaa"/>// TextView引用android:textColor="@drawable/edittext_focused"
- 在一个继承自
View的类中, 绘制一个矩形
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 定义画笔Paint paint = new Paint();paint.setColor(0xaaff6622); // 设置画笔的颜色paint.setStyle(Paint.Style.FILL); // 填充样式// 绘制矩形canvas.drawRect(10,10,280,150,paint);}
new DrawView(this); //定义这个矩形 添加在页面中
绘制动画
- 逐帧动画,使用一串连续的图片,播放 产生动画效果。。在
drawable下新建一个xml文件,例如取名为fariy.xml
- 逐帧动画,使用一串连续的图片,播放 产生动画效果。。在
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/run1" android:duration="60"/><item android:drawable="@drawable/run2" android:duration="60"/><item android:drawable="@drawable/run3" android:duration="60"/><item android:drawable="@drawable/run4" android:duration="60"/></animation-list>
// 使用
android:background="@drawable/fariy"
// 播放 暂停
Button btn = findViewById(R.id.btn);final AnimationDrawable anim = (AnimationDrawable)btn.getBackground();anim.start();anim.stop();
+ 补间动画, 设置起始和终止的值,由系统自动完成中间值的计算和显示* 透明度的变化* 旋转动画* 位置的变化* ...
音频播放
MediaPlayer加载音频文件的方法
create()setDataSoucre()
MediaPlayer mediaPlayer = MediaPlayer.create(this,R.raw.safeandsound);mediaPlayer.play(); // 播放.pause(); // 暂停try { // 停止mediaPlayer.stop();mediaPlayer.prepare();mediaPlayer.seekTo(0);} catch(IOException e) {e.printStackTrace();}// 销毁protected void onDestroy() {super.onDestroy();if(mediaPlayer.isPlaying()){mediaPlayer.stop();}mediaPlayer.release(); // 释放资源}
- 播放短小的音频
SoundPool 播放视频
VideoVieworMediaPlayer+SerfaceView- 都在SD卡上面的视频…
进程与线程
- 子线程不能更改主线程的组件
- 线程 - Looper - MessageQueue
- handler 通过 message 向 MessageQueue 发送消息
final int FLAG_MSG = 0x001;private Message message; // 声明消息对象
// 定义Message message = Message.obtain();message.what = FLAG_MSG; // 设置消息说包含的内容 为自定义的一个int型值handler.sendMessage(message); // 发送消息
Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what == FLAG_MSG){/*** 处理事务 ***/message = handler.obtainMessage(FLAG_MSG); // 获取messagehandler.sendMessageDelayed(message, 3000); // 延迟3秒发送消息}}};
- xx
final Handler handler = new Handler(){@Overridepublic void handleMessage( Message msg) {super.handleMessage(msg);// 判断接收的消息是否是自己定义的那个if(msg.what == 0x001){/** 处理事务 **/}}};Thread thread = new Thread(new Runnable() {@Overridepublic void run() {handler.sendEmptyMessage(0x001); // 发送空消息}});thread.start(); // 开启线程
Service
按照启动方式 分类:
- Started Service
- Bound Service
- 搞不懂…
location
有3中locationProvider
- passive
- gps
- network
other
- 在一个布局文件中,最多只能有一个根布局管理器,如果有多个 需要使用一个根布局管理器将他们括起来。
- 根布局管理器必须包含xmlns属性
- 自定义圆角矩形,在
drawable文件夹下面新建一个xml文件,比如这个shapeRadius.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><solid android:color="#1ffa03"/><corners android:radius="30dp"/><padding android:bottom="10dp"android:left="15dp"android:right="15dp"android:top="10dp"/></shape>
使用该形状,添加在按钮的属性里面
android:background="@drawable/shapeRadius"
在
values/styles里面定义主题样式、样式- 在
AndroidManifest里面设置主题样式,可以是全局的,也可以是单个Activity - 在java文件里面,
onCreate()方法里,用setTheme(R.style.myTheme)来设置样式 style="@style/title"—— 组件使用样式- 样式可以继承,使用
parent指定
- 在
<style name="title" parent="继承哪个样式"><item name="android:textSize">30sp</item><item name="android:textColor">#06f</item></style>
- 选项菜单 —— 在
res下创建menu文件夹,新建Menu Resources file,添加元素
<item android:id="fankui" android:title="反馈"></item>
- 在Java文件里面显示/隐藏Action Bar
final ActionBar ab = getSupportActionBar();ab.show();ab.hide();
弹出对话框
- 简单的确定/取消对话框
AlertDialog alertDialog = new AlertDialog.Builder(RelativeActivity.this).create();alertDialog.setIcon(R.mipmap.building);alertDialog.setTitle("GAME:");alertDialog.setMessage("it's time to have a game");alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "NO", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(RelativeActivity.this, "ok.", Toast.LENGTH_SHORT).show();}});alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "YES", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(RelativeActivity.this, "ok!!!", Toast.LENGTH_SHORT).show();}});alertDialog.show();
+ 有简单列表的对话框
final String[] items = new String[] {"have an apple a day, keep doctor away.", "have a nice day","^O^","O.O"};AlertDialog.Builder alertDialog = new AlertDialog.Builder(RelativeActivity.this);alertDialog.setIcon(R.mipmap.building);alertDialog.setTitle("pick one");alertDialog.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(RelativeActivity.this, "OK!!You picked "+items[i], Toast.LENGTH_SHORT).show();}});alertDialog.create().show();
+ 单项选择的对话框
final String[] items = new String[] {"have an apple a day, keep doctor away.", "have a nice day","^0^","O.O"};AlertDialog.Builder alertDialog = new AlertDialog.Builder(RelativeActivity.this);alertDialog.setIcon(R.mipmap.building);alertDialog.setTitle("pick one");alertDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(RelativeActivity.this, "you picked "+items[i], Toast.LENGTH_SHORT).show();}});alertDialog.setNegativeButton("cancel", null);alertDialog.setPositiveButton("OK", null);alertDialog.create().show();
+ 多项选择对话框
// 表示每个元素被选择的状态final boolean [] checked = new boolean[] {true, false, false, true};final String[] items = new String[] {"have an apple a day, keep doctor away.", "have a nice day","^0^","O.O"};AlertDialog.Builder alertDialog = new AlertDialog.Builder(RelativeActivity.this);alertDialog.setIcon(R.mipmap.building);alertDialog.setTitle("pick one");alertDialog.setMultiChoiceItems(items, checked, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i, boolean b) {checked[i] = b; //改变被操作列表项的状态}});alertDialog.setNegativeButton("cancel", null);alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {String result = "";for(int j = 0; j < checked.length;j++){if(checked[j]){result+= items[j]+"/";}}if(!"".equals(result)){Toast.makeText(RelativeActivity.this, "you picked "+ result, Toast.LENGTH_SHORT).show();}}});alertDialog.create().show();
- 通知 ——
NotificationManager&NotificationCompat.Builder有误,后改 - 广播 ——
BroadcastReceiver暂时补血
SetEvent
android:onClick="myClick"—— 按钮的点击事件
- 注册点击事件,弹出提示框
public void myClick(View view) {Toast.makeText(RelativeActivity.this, "wola", Toast.LENGTH_SHORT).show();}
- 页面跳转
(当前Activity名, 下一个Activity名)Intent intent = new Intent();intent.setClass(LogoutActivity.this, DataActivity.class);startActivity(intent);
- 为图片切换器设置图片切换效果
ImageSwitcher is = findViewById(R.id.iswi);// 设置淡出动画效果is.setOutAnimation(AnimationUtils.loadAnimation(HanaActivity.this, android.R.anim.fade_out));is.setInAnimation(AnimationUtils.loadAnimation(HanaActivity.this, android.R.anim.fade_in));is.setFactory(new ViewSwitcher.ViewFactory() {@Overridepublic View makeView() {ImageView iv = new ImageView(HanaActivity.this);iv.setImageResource(R.mipmap.abc0);return iv;}});/* 设置 点击图片,实现向下一张图片切换 *//* 下一张图片的名字是 abc1 */is.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {((ImageSwitcher)view).setImageResource(R.mipmap.abc1);}});
- 使用SimpleAdapter适配器为GridView设置图片
/** gridPicArr 是全局定义的int型数组,存储图片资源 **//** cell 是自定义的样式 **/GridView gv = findViewById(R.id.grid);List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();for(int i = 0; i< gridPicArr.length; i++) {Map<String, Object> map = new HashMap<String, Object>();map.put("img", gridPicArr[i]);list.add(map);}SimpleAdapter sa = new SimpleAdapter(this, list, R.layout.cell, new String[]{"img"}, new int[]{R.id.img});gv.setAdapter(sa);
- 使用适配器为下拉框设置元素,并设置 点击元素弹出提示框
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 sp = findViewById(R.id.spin);sp.setAdapter(adapter);String str = sp.getSelectedItem().toString();Toast.makeText(HanaActivity.this, str, Toast.LENGTH_SHORT).show();
- 为FrameLayout添加一个可以跟随手指移动的图片
/** SelfView 是一个自定义的Java文件,实现图片的绘画 **/FrameLayout frameLayout = findViewById(R.id.mylayout);final SelfView selfView = new SelfView(this);// 跟随手指移动selfView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {selfView.bitmapX = motionEvent.getX();selfView.bitmapY = motionEvent.getY();selfView.invalidate();return true;}});frameLayout.addView(selfView);
ScrollView scrollView = new ScrollView(SelfActivity.this);ScrollView.LayoutParams lp = new ScrollView.LayoutParams(180, 100);lp.setMargins(70, 220, 0, 0);scrollView.setLayoutParams(lp);
使用Intent和Bundle跳转页面并向第二个页面传入数据
// 跳转页面Button btn = findViewById(R.id.button_logout);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {// 获取输入的信息String qq = ((EditText)findViewById(R.id.qq)).getText().toString();String pwd = ((EditText)findViewById(R.id.pwd)).getText().toString();String email = ((EditText)findViewById(R.id.email)).getText().toString();if("".equals(qq) || "".equals(pwd) || "".equals(email) ){Toast.makeText(EnterPage.this, "请填写完整的信息",Toast.LENGTH_SHORT).show();}Intent intent = new Intent();intent.setClass(EnterPage.this, LogoutActivity.class);Bundle bundle = new Bundle();bundle.putCharSequence("qq",qq);bundle.putCharSequence("pwd",pwd);bundle.putCharSequence("email",email);intent.putExtras(bundle);startActivity(intent);}});
```java / xml1 跳转 / Intent intent = new Intent(); intent.setClass(MainActivity.this, HanaActivity.class); startActivityForResult(intent, 0x11);
/ xml2 / // 为网格视图的元素设置点击事件监听器,获取图像 保存到数据包中 gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Intent intent = getIntent(); Bundle bundle = new Bundle(); bundle.putInt(“imageId”, gridPicArr[i]); intent.putExtras(bundle); setResult(0x11, intent); finish(); } });
/ xml1 重写这个方法,获取结果 / @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 0x11 && resultCode == 0x11) { Bundle bundle = data.getExtras(); int imageId = bundle.getInt(“imageId”); gl.setBackgroundResource(imageId); } }
- copy```javaprivate ImageView[] img = new ImageView[8];private int imagPath = R.mipmap.ic_launcher;GridLayout layout = findViewById(R.id.gridlayout);for(int i = 0; i < 8; i++){img[i] = new ImageView(MainActivity.this);img[i].setImageResource(imagPath);img[i].setPadding(2,2,2,2);ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(60,40);img[i].setLayoutParams(params);layout.addView(img[i]);}
