目录
安卓入门
一、从安装到运行
1、下载
下载地址:https://developer.android.google.cn/studio
2、安装
安装过程中,都选默认选项安装;
可能遇到【Unable to access Android SDK and-on list】问题,选【Cancel】,后续安装过程会安装上Android SDK。
3、创建项目
模板选【Empty Activity】;
【Save location】为项目目录;
【Use legacy android.support libraries】选项不要勾选。
4、项目结构
5、安装虚拟机
右上角点击【AVD Manager】安装;
遇到问题【HAXM is not installed】,按提示【Install Haxm】安装即可。
6、运行
二、基础控件
1、TextView
<TextView
android:id="@+id/tv_one" :为TextView设置一个组件id
android:layout_width="200dp" :组件的宽度
android:layout_height="200dp" :组件的高度
android:background="@color/purple_200" :控件的背景颜色,可以理解为填充整个控件的颜色,可以是图片
android:gravity="center_horizontal" :设置控件中内容的对齐方向,TextView中是文字,ImageView中是图片等等
android:text="@string/hello" :设置显示的文本内容
android:textColor="#ffff0000" :设置字体颜色
android:textSize="20sp" :字体大小,单位一般是用sp
android:textStyle="normal" :设置字体风格,三个可选值:normal(无效果),bold(加粗),italic(斜体)
android:shadowColor="@color/red" :设置阴影颜色,需要与shadowRadius一起使用
android:shadowDx="10.0" :设置阴影在水平方向的偏移,就是水平方向阴影开始的横坐标位置
android:shadowDy="10.0" :设置阴影在竖直方向的偏移,就是竖直方向阴影开始的纵坐标位置
android:shadowRadius="3.0" :设置阴影的模糊程度,设为0.1就变成字体颜色了,建议使用3.0
android:singleLine="true" :内容单行显示
android:ellipsize="marquee" :在哪里省略文本
android:marqueeRepeatLimit="marquee_forever" :字幕动画重复的次数
android:focusable="true" :是否可以获取焦点
android:focusableInTouchMode="true" :用于控制视图在触摸模式下是否可以聚焦>
<requestFocus /> :获取焦点
</TextView>
2、Button
<Button :Button继承TextView
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/btn_selector" :引用的位图,themes.xml文件DarkActionBar后需要加.Bridge
android:backgroundTint="@color/btn_color_selector" :引用的位图颜色
android:onClick="llClick" :对应MainActivity生成的llClick(View)方法
android:text="@string/anniu"
/>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_baseline_ac_unit_24" :引用的Drawable位图
android:color="@color/green" :引用的颜色
android:state_focused="true" :是否获得焦点
android:state_pressed="true" :控件是否被按下
android:state_enabled="true" :控件是否可用
android:state_selected="true" :控件是否被选择,针对有滚轮的情况
android:state_checked="true" :控件是否被勾选
android:state_checkable="true" :控件可否被勾选,eg:checkbox
></item>
</selector>
// 执行顺序:触摸事件(返回值为true,后续事件不触发)->长按事件(返回值为true,后续事件不触发)->点击事件
View btn = findViewById(R.id.btn);
// 点击事件
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("click");
}
});
// 长按事件
btn.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
System.out.println("long click");
return false;
}
});
// 触摸事件
btn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println("touch" + event.getAction());
return false;
}
});
四种方式实现点击事件:
1、内部类实现View.OnClickListener接口
2、匿名内部类new接口
3、当前类实现接口
4、Button标签加onClick属性
3、EditText
<EditText
android:id="@+id/ipt"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#99000000" :背景色
android:drawableLeft="@drawable/ic_baseline_person_outline_24" :在输入框的指定方位添加图片
android:drawablePadding="20dp" :设置图片与输入内容的间距
android:hint="请输入内容" :输入提示
android:inputType="number" :输入类型
android:paddingLeft="20dp" :设置内容与边框的间距
android:textColorHint="@color/green" :输入提示文字的颜色
></EditText>
// 获取输入框内容
EditText ipt = findViewById(R.id.ipt);
System.out.println(ipt.getText().toString());
4、ImageView
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true" :调整View的界限
android:maxWidth="200dp" :最大宽度
android:maxHeight="200dp" :最大高度
android:scaleType="fitCenter" :设置图片缩放类型
android:src="@drawable/img" :设置图片资源
></ImageView>
5、ProgressBar
<ProgressBar
style="?android:attr/progressBarStyleHorizontal" :水平进度条
android:layout_width="200dp"
android:layout_height="wrap_content"
android:indeterminate="false" :如果设置成true,则进度条不精确显示进度
android:max="100" :进度条的最大值
android:progress="30" :进度条已完成进度值
android:visibility="gone" :进度条是否显示
></ProgressBar>
6、Notification
public class MainActivity extends AppCompatActivity {
private NotificationManager manager;
private Notification notification;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//获取通知管理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//判断sdk是否大于8.0
NotificationChannel channel = new NotificationChannel("ll", "通知", NotificationManager.IMPORTANCE_HIGH);//创建通知渠道,参数:(渠道id,渠道名称,通知等级)
manager.createNotificationChannel(channel);//通知管理设置通知渠道
}
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
notification = new NotificationCompat.Builder(this, "ll")//创建通知,参数:(this,渠道id)
.setContentTitle("官方通知")//设置通知标题
.setContentText("世界那么大,我想去走走")//设置通知内容
.setSmallIcon(R.drawable.ic_baseline_person_outline_24)//设置通知图标
.setColor(Color.parseColor("#00ff00"))//设置通知图标颜色
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.img))//设置通知图片
.setContentIntent(pendingIntent)//设置通知点击后跳转页面
.setAutoCancel(true)//设置通知点击后关闭
.build();
}
public void sendNotice(View view) {
manager.notify(1, notification);//发送通知
}
public void cancelNotice(View view) {
manager.cancel(1);//关闭通知
}
}
7、Toolbar
xmlns:app="http://schemas.android.com/apk/res-auto"
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#ffff0000"
app:logo="@drawable/ic_baseline_ac_unit_24"
app:navigationIcon="@drawable/ic_baseline_arrow_back_24"
app:subtitle="子标题"
app:subtitleTextColor="@color/black"
app:title="标题"
app:titleMarginStart="100dp"
app:titleTextColor="@color/green">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="标题" />
</androidx.appcompat.widget.Toolbar>
8、AlertDialog
a、普通对话框
public void dialogButton(View view) {
View dialogView = getLayoutInflater().inflate(R.layout.activity_notification, null);//获取自定义布局
// 两种上下文区别:this代表子类(activity),getApplicationContext()代表父类,子类有的父类不一定有
AlertDialog.Builder builder = new AlertDialog.Builder(this);//构建Dialog的各种参数。构造对话框对象的参数必须是this
builder.setIcon(R.drawable.ic_baseline_person_outline_24)//添加ICON
.setTitle("弹窗")//添加标题
.setMessage("这是一段中文")//添加消息
.setView(dialogView)//设置自定义布局
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("", "点击了确定");
}
})//确定按钮
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("", "点击了取消");
}
})//取消按钮
.setNeutralButton("中间", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("", "点击了中间");
}
})//中间按钮
.create()//创建Dialog
.show();//显示对话框
}
b、单选对话框
public void btnClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
String[] items = {"鞠婧祎", "黄婷婷", "孟美岐"};
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String item = items[which];
Toast.makeText(getApplicationContext(), item, Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.show();
}
c、多选对话框
public void btnClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
String[] items = {"鞠婧祎", "黄婷婷", "孟美岐", "姜贞羽", "安吉拉"};
boolean[] checkeds = {false, true, false, false, true};
builder.setMultiChoiceItems(items, checkeds, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < checkeds.length; i++) {
if (checkeds[i]) {
sb.append(items[i] + ",");
}
}
Toast.makeText(getApplicationContext(), sb, Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.show();
}
d、进度条对话框
public void btnClick(View view) {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("加载中...");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
new Thread() {
@Override
public void run() {
dialog.setMax(100);
for (int i = 0; i < 100; i++) {
// 与进度相关的控件可在子线程直接更新UI
dialog.setProgress(i);
// 睡眠一会
SystemClock.sleep(50);
}
dialog.dismiss();
}
}.start();
}
9、PopupWindow
public void popupButton(View view) {
View popupView = getLayoutInflater().inflate(R.layout.activity_popupwindow, null);//获取自定义布局
Button btn1 = popupView.findViewById(R.id.btn1);
Button btn2 = popupView.findViewById(R.id.btn2);
PopupWindow popupWindow = new PopupWindow(popupView,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
true);//参数:(设置PopupWindow显示的View,宽,高,设置是否获取焦点)
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.img));//设置背景
popupWindow.showAsDropDown(view);//相对某个控件的位置(正左下方),无偏移
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("", "点击确定");
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("", "点击取消");
popupWindow.dismiss();//关闭弹窗
}
});
}
10、右上角菜单
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//右上角的菜单按钮
menu.add(0, 1, 0, "前进");
menu.add(0, 2, 0, "后退");
menu.add(0, 3, 0, "首页");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId == 1) {
System.out.println("前进");
} else if (itemId == 2) {
System.out.println("后退");
} else if (itemId == 3) {
System.out.println("首页");
}
return super.onOptionsItemSelected(item);
}
/**
* 右上角菜单栏点击时,调用此方法。当返回值为false时,则不使用系统默认的菜单栏显示
*/
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
return super.onMenuOpened(featureId, menu);
}
}
11、可搜索下拉框
- activity_main.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:completionThreshold="2":下拉框显示时,输入框字数的要求-->
<AutoCompleteTextView
android:id="@+id/actv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="2" />
</LinearLayout>
- MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AutoCompleteTextView actv = findViewById(R.id.actv);
String[] arrs = new String[]{"aaa", "bbb", "abb", "aab"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, arrs);
actv.setAdapter(adapter);
}
}